#!/usr/bin/perl -w # 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 ### packages use File::Basename; 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 =~ /\./) { my $ext = $path; $ext =~ s/^.*\.//; } else { $ext = ""; } return $ext; } sub read_config { my $config_file = `echo -n ~`."/.gst"; if (-e $config_file) { open CONFIG, $config_file; while () { 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"; } 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"; } } sub playfile($$) { my ($file, $ext) = @_; $ext = lc $ext; my $pipe; if ($cfg{VISUALIZER} && ($pipe = $pipes{"vis." . $ext})) { $command = "gst-launch filesrc location=\"$file\" ! $pipe"; print "Running $command\n"; system ("PATH=\$PATH:".$cfg{CVS_PATH}."/gstreamer/tools $command"); } elsif ($pipe = $pipes{$ext}) { $command = "gst-launch filesrc location=\"$file\" ! $pipe"; print "Running $command\n"; system ("PATH=\$PATH:".$cfg{CVS_PATH}."/gstreamer/tools $command"); } else { print "No suitable pipe found for extension $ext.\n"; } } ### main read_config (); %pipes = ( "ac3", "a52dec ! $cfg{AUDIOSINK}", "au", "auparse ! $cfg{AUDIOSINK}", "avi", "avidemux video_%02d! { queue ! windec ! $cfg{VIDEOSINK} } avidemux0.audio_%02d! { queue ! mad ! $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}", "mpg", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } mpegdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }", "ogg", "vorbisdec ! $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}", ); 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 eq 'm3u') { open (PLAYLIST, '<', $file); my $file2; while ($file2 = ) { chomp $file2; my $ext2 = extension ($file2); playfile($file2, $ext2); } close PLAYLIST; } else { playfile($file, $ext); } }