gst-launch-ext 3.79 KB
Newer Older
1 2 3 4 5 6
#!/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

7
my (%pipes, %cfg);
8 9 10 11

sub extension
{
  my $path = shift;
12 13 14 15 16 17 18 19 20 21 22
  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 = ""; }

23 24 25
  return $ext;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
26 27
sub read_config
{
28
  my $config_file = `echo -n ~`."/.gst";
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
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
  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";
  }
54
  if (!defined $cfg{AUDIOSINK})  { $cfg{AUDIOSINK} = "osssink"; }
55
  if (!defined $cfg{VIDEOSINK})  { $cfg{VIDEOSINK} = "colorspace ! xvideosink"; }
56
  if (!defined $cfg{CVS_PATH})   { $cfg{CVS_PATH} =  `echo -n ~`."/gst/cvs"; }
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
57 58
}

59 60 61
sub playfile($$)
{
    my ($file, $ext) = @_;
62
    $ext = lc $ext;
63 64

    my $pipe;
65 66 67 68 69 70 71
    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})
72 73 74 75 76 77 78 79 80 81 82
    {
	$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";
    }
}

83 84
### main

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
85 86
read_config ();

87
%pipes = ( 
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
88
  "ac3", "a52dec ! $cfg{AUDIOSINK}",
89
  "au", "auparse ! $cfg{AUDIOSINK}",
Thomas Vander Stichele's avatar
fix  
Thomas Vander Stichele committed
90
  "avi", "avidemux video_%02d! { queue ! windec ! $cfg{VIDEOSINK} } avidemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
91
  "fli", "flxdec ! colorspace ! $cfg{VIDEOSINK}",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
92 93
  "m1v", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
  "m2v", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }",
94
  "mod", "modplug !  $cfg{AUDIOSINK}",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
95
  "mp2", "mad ! $cfg{AUDIOSINK}",
96
  "mp3", "mad ! $cfg{AUDIOSINK}",
97
  "mpg", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} } mpegdemux0.audio_%02d! { queue ! mad ! $cfg{AUDIOSINK} }",
98
  "ogg", "vorbisdec ! $cfg{AUDIOSINK}",
99
  "sid", "siddec ! $cfg{AUDIOSINK}",
100
  "swf", "swfdec video_%02d! { queue ! colorspace ! $cfg{VIDEOSINK} }  swfdec0.audio_%02d! { queue ! $cfg{AUDIOSINK} }",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
101 102
  "vob", "mpegdemux video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }  mpegdemux0.private_stream_1_%02d! { queue ! a52dec ! $cfg{AUDIOSINK} }",
  "wav", "wavparse ! $cfg{AUDIOSINK}",
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
103
);
104

105 106 107 108 109 110 111 112 113
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}",
  );
}              

114 115 116
if ($#ARGV == -1) {
    print STDERR "Usage: gst-launch-ext filename[s]\n";
    exit 1;
117
}
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

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);
    }
135
}