summaryrefslogtreecommitdiffstats
path: root/tools/gst-launch-ext
blob: 2e4233c2cf50212b731892af92393faf038ad234 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/perl -w
use strict;

# launch a gst-launch pipeline for the supplied media file
# use the extension to determine the gst-launch pipeline
# make use of default output sinks

my (%pipes, %cfg);

sub extension
{
  my $path = shift;
  my $ext;

  # get only the bit after the last period.  We don't deal with
  # .tar.gz extensions do we ?
  if ($path =~ /\./)
  {
    $ext = $path;
    $ext =~ s/^.*\.//;
  }
  else { $ext = ""; }

  return $ext;
}

sub read_config
{
  my $command = shift;

  my $config_file = `echo -n ~`."/.gst";
  if (-e $config_file)
  {
    open CONFIG, $config_file;
    while (<CONFIG>)
    {
      chomp;
      s/#.*//;
      s/\s+$//;
      next unless length;
      my ($var, $value) = split (/\s*=\s*/, $_, 2);
      $cfg{$var} = $value;
    }
    if (!($cfg{AUDIOSINK}))
    {
      print "Please add an AUDIOSINK to $config_file !\n";
    }
    if (!($cfg{VIDEOSINK}))
    {
      print "Please add a VIDEOSINK to $config_file !\n";
    }
  }
  else
  {
    print "No configuration file $config_file found.  You might want to create one.\n";
    print "This is not an error, just a friendly reminder... Check the man page.\n\n";
  }
  if (!defined $cfg{AUDIOSINK})  { $cfg{AUDIOSINK} = "osssink"; }
  if (!defined $cfg{VIDEOSINK})  { $cfg{VIDEOSINK} = "colorspace ! xvideosink"; }
  if (!defined $cfg{CVS_PATH})   { $cfg{CVS_PATH} =  `echo -n ~`."/gst/cvs"; }

  if ($command =~ /(.+)\/gst-launch-ext$/)
  { $cfg{COMMAND_PATH} = "$1"; }
  else
  { $cfg{COMMAND_PATH} = ""; }
}

sub playfile($$)
{
    my ($file, $ext) = @_;
    my $command;
    my $pipe;
    my $path = "\$PATH:".$cfg{CVS_PATH}."/gstreamer/tools";

    if ($cfg{COMMAND_PATH} ne "") {
      $path = $cfg{COMMAND_PATH}.":$path";
    }

    $ext = lc $ext;

    if ($cfg{VISUALIZER} && ($pipe = $pipes{"vis." . $ext}))
    {
	$command = "gst-launch filesrc location=\"$file\" ! $pipe";
	print "Running command-line\n$command\n\n";
	system ("PATH=$path $command");
    }
    elsif ($pipe = $pipes{$ext})
    {
	$command = "gst-launch filesrc location=\"$file\" ! $pipe";
	print "Running command-line\n$command\n\n";
	system ("PATH=$path $command");
    }
    else
    {
	print "No suitable pipe found for extension $ext.\n";
    }
}

### main

read_config ($0);

%pipes = ( 
  "ac3", "a52dec ! $cfg{AUDIOSINK}",
  "au", "auparse ! $cfg{AUDIOSINK}",
  "avi", "avidemux video_%02d! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } avidemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "asf", "asfdemux video_%02d! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } asfdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "flac", "flacdec ! $cfg{AUDIOSINK}",
  "fli", "flxdec ! colorspace ! $cfg{VIDEOSINK}",
  "m1v", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
  "m2v", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
  "mod", "modplug !  $cfg{AUDIOSINK}",
  "mp2", "mad ! $cfg{AUDIOSINK}",
  "mp3", "mad ! $cfg{AUDIOSINK}",
  "mpeg", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } mpegdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "mpg", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } mpegdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "ogg", "vorbisfile ! $cfg{AUDIOSINK}",
  "sid", "siddec ! $cfg{AUDIOSINK}",
  "swf", "swfdec video_%02d! { queue ! colorspace ! $cfg{VIDEOSINK} }  swfdec0.audio_%02d! { queue ! $cfg{AUDIOSINK} }",
  "vob", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }  mpegdemux0.private_stream_1_%02d! { queue ! a52dec ! $cfg{AUDIOSINK} }",
  "wav", "wavparse ! $cfg{AUDIOSINK}",
  "wm", "asfdemux video_%02d! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } asfdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "wma", "asfdemux video_%02d! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } asfdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
  "wmv", "asfdemux video_%02d! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } asfdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
);

if ($cfg{VISUALIZER}) {
  %pipes = (
    %pipes,
    "vis.mp3", "mad ! tee silent=true 'tee1.src0!' queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } 'tee1.src1!' $cfg{AUDIOSINK}",
    "vis.ogg", "vorbisdec ! tee silent=true 'tee1.src0!' queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } 'tee1.src1!' $cfg{AUDIOSINK}",
    "vis.wav", "wavparse ! tee silent=true 'tee1.src0!' queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } 'tee1.src1!' $cfg{AUDIOSINK}",
  );
}              

if ($#ARGV == -1) {
    print STDERR "Usage: gst-launch-ext filename[s]\n";
    exit 1;
}

my $file;
while ($file = shift @ARGV) {
    my $ext = extension ($file);
    if (!$ext) { 
      print "file $file doesn't have an extension !\n";
      exit;
    }
    if ($ext eq 'm3u')
    {
	open (PLAYLIST, '<', $file);
	my $file2;
	while ($file2 = <PLAYLIST>) {
	    chomp $file2;
	    my $ext2 = extension ($file2);
	    playfile($file2, $ext2);
	}
	close PLAYLIST;
    } else {
	playfile($file, $ext);
    }
}