| #!/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 = (fileparse ($path, '\..*?'))[2]; |
| $ext =~ s/^\.//; |
| return $ext; |
| } |
| |
| sub read_config |
| { |
| 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"; |
| } |
| if (!defined $cfg{AUDIOSINK}) { $cfg{AUDIOSINK} = "osssink"; } |
| if (!defined $cfg{VIDEOSINK}) { $cfg{VIDEOSINK} = "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 (); |
| |
| ### "ac3", "ac3parse ! $cfg{AUDIOSINK}", |
| %pipes = ( |
| "au", "auparse ! $cfg{AUDIOSINK}", |
| "avi", "avidemux video_%02d! { queue ! windec ! $cfg{VIDEOSINK} } avidemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }", |
| "fli", "flxdec ! colorspace ! $cfg{VIDEOSINK}", |
| "mod", "modplug ! $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}", |
| "vob", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } mpegdemux0.private_stream_1_%02d! { queue ! a52dec ! $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 = <PLAYLIST>) { |
| chomp $file2; |
| my $ext2 = extension ($file2); |
| playfile($file2, $ext2); |
| } |
| close PLAYLIST; |
| } else { |
| playfile($file, $ext); |
| } |
| } |