--- /dev/null
+#!/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-@GST_MAJORMINOR@ filesrc location=\"$file\" ! $pipe";
+ print "Running command-line\n$command\n\n";
+ system ("PATH=$path $command");
+ }
+ elsif ($pipe = $pipes{$ext})
+ {
+ $command = "gst-launch-@GST_MAJORMINOR@ 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 name=demux ! { queue ! jpegdec ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "asf", "asfdemux name=demux ! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "flac", "flacdec ! $cfg{AUDIOSINK}",
+ "fli", "flxdec ! colorspace ! $cfg{VIDEOSINK}",
+ "m1v", "mpegdemux ! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
+ "m2v", "mpegdemux ! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
+ "mod", "modplug ! $cfg{AUDIOSINK}",
+ "mp2", "mad ! $cfg{AUDIOSINK}",
+ "mp3", "mad ! $cfg{AUDIOSINK}",
+ "mpeg", "mpegdemux name=demux ! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "mpg", "mpegdemux name=demux ! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "ogg", "vorbisfile ! $cfg{AUDIOSINK}",
+ "sid", "siddec ! $cfg{AUDIOSINK}",
+ "swf", "swfdec name=swfdec ! { queue ! colorspace ! $cfg{VIDEOSINK} } { swfdec. ! queue ! $cfg{AUDIOSINK} }",
+ "vob", "mpegdemux name=demux ! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } { demux. ! queue ! a52dec ! $cfg{AUDIOSINK} }",
+ "wav", "wavparse ! $cfg{AUDIOSINK}",
+ "wm", "asfdemux name=demux ! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "wma", "asfdemux name=demux ! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+ "wmv", "asfdemux name=demux ! { queue ! ffmpegdecall ! $cfg{VIDEOSINK} } { demux. ! queue ! mad ! $cfg{AUDIOSINK} }",
+);
+
+if ($cfg{VISUALIZER}) {
+ %pipes = (
+ %pipes,
+ "vis.mp3", "mad ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } tee. ! $cfg{AUDIOSINK}",
+ "vis.ogg", "vorbisdec ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } tee. ! $cfg{AUDIOSINK}",
+ "vis.wav", "wavparse ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! colorspace ! $cfg{VIDEOSINK} } tee. ! $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);
+ }
+}