#!/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 = $ENV{HOME}."/.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"; 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} = "ffmpegcolorspace ! xvimagesink"; } if (!defined $cfg{CVS_PATH}) { $cfg{CVS_PATH} = $ENV{HOME}."/gst/cvs"; } if ($command =~ /(.+)\/gst-launch-ext-@GST_MAJORMINOR@$/) { $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", "decodebin name=d { d. ! queue ! $cfg{VIDEOSINK} } { d. ! queue ! audioconvert ! audioscale ! $cfg{AUDIOSINK} }", "asf", "decodebin name=d ! { d. ! queue ! $cfg{VIDEOSINK} } { d. ! queue ! audioconvert ! audioscale ! $cfg{AUDIOSINK} }", "flac", "flacdec ! $cfg{AUDIOSINK}", "fli", "flxdec ! colorspace ! $cfg{VIDEOSINK}", "m1v", "mpeg2dec ! $cfg{VIDEOSINK}", "m2v", "mpeg2dec ! $cfg{VIDEOSINK}", "m4a", "qtdemux .audio_00 ! { queue ! faad ! $cfg{AUDIOSINK} }", "aac", "faad ! $cfg{AUDIOSINK}", "mod", "modplug ! $cfg{AUDIOSINK}", "mpc", "musepackdec ! $cfg{AUDIOSINK}", "mp2", "mad ! $cfg{AUDIOSINK}", "mp3", "mad ! $cfg{AUDIOSINK}", "mp4", "decodebin name=d { d. ! queue ! ffmpegcolorspace ! videoscale ! $cfg{VIDEOSINK} } { d. ! queue ! audioconvert ! audioscale ! $cfg{AUDIOSINK} }", "mpeg", "mpegdemux name=d { d.audio_00 ! queue ! mad ! audioconvert ! audioscale ! $cfg{AUDIOSINK} } { d.video_00 ! queue ! mpeg2dec ! $cfg{VIDEOSINK} }", "mpg", "mpegdemux name=demux { demux.video_00 ! queue ! mpeg2dec ! ffmpegcolorspace ! $cfg{VIDEOSINK} } { demux.audio_00 ! queue ! mad ! $cfg{AUDIOSINK} }", "ogg", "oggdemux ! vorbisdec ! audioconvert ! $cfg{AUDIOSINK}", "sid", "siddec ! $cfg{AUDIOSINK}", "swf", "swfdec name=swfdec ! { queue ! colorspace ! $cfg{VIDEOSINK} } { swfdec. ! queue ! $cfg{AUDIOSINK} }", "vob", "mpegdemux name=d { d.video_00 ! queue ! mpeg2dec ! $cfg{VIDEOSINK} } { d.audio_00 ! queue ! a52dec ! audioconvert ! audioscale ! $cfg{AUDIOSINK} }", "wav", "wavparse ! $cfg{AUDIOSINK}", "wm", "asfdemux name=demux ! { queue ! spider ! $cfg{VIDEOSINK} } { demux. ! queue ! spider ! $cfg{AUDIOSINK} }", ### a wma file can use wmav1 or wmav2 codec so we must use spider to decode it "wma", "asfdemux name=demux ! spider ! $cfg{AUDIOSINK}", "wmv", "asfdemux name=demux ! { queue ! spider ! $cfg{VIDEOSINK} } { demux. ! queue ! spider ! $cfg{AUDIOSINK} }", "mkv", "matroskademux name=demux ! { queue ! spider ! $cfg{VIDEOSINK} } { demux. ! queue ! spider ! $cfg{AUDIOSINK} }", "mka", "matroskademux ! spider ! $cfg{AUDIOSINK}", "mov", "decodebin name=d { d. ! queue ! ffmpegcolorspace ! videoscale ! $cfg{VIDEOSINK} } { d. ! queue ! audioconvert ! audioscale ! $cfg{AUDIOSINK} }", ); if ($cfg{VISUALIZER}) { %pipes = ( %pipes, "vis.mp3", "mad ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! ffmpegcolorspace ! $cfg{VIDEOSINK} } tee. ! $cfg{AUDIOSINK}", "vis.ogg", "vorbisdec ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! ffmpegcolorspace ! $cfg{VIDEOSINK} } tee. ! $cfg{AUDIOSINK}", "vis.wav", "wavparse ! tee name=tee silent=true ! queue leaky=1 ! { $cfg{VISUALIZER} ! ffmpegcolorspace ! $cfg{VIDEOSINK} } tee. ! $cfg{AUDIOSINK}", ); } if ($#ARGV == -1) { print STDERR "Usage: gst-launch-ext-@GST_MAJORMINOR@ 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 = ) { chomp $file2; my $ext2 = extension ($file2); playfile($file2, $ext2); } close PLAYLIST; } else { playfile($file, $ext); } }