summaryrefslogtreecommitdiffstats
path: root/tools/gst-launch-ext-m.m
blob: 915f2dfa8622725638929f70baa8d3f4b8412340 (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/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 (<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";
    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 = <PLAYLIST>) {
	    chomp $file2;
	    my $ext2 = extension ($file2);
	    playfile($file2, $ext2);
	}
	close PLAYLIST;
    } else {
	playfile($file, $ext);
    }
}