summaryrefslogtreecommitdiffstats
path: root/tools/gst-launch-ext
blob: d61d34d3177592bac63463d4bbdc806cf426f5d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/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} = "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 = <PLAYLIST>) {
	    chomp $file2;
	    my $ext2 = extension ($file2);
	    playfile($file2, $ext2);
	}
	close PLAYLIST;
    } else {
	playfile($file, $ext);
    }
}