summaryrefslogtreecommitdiff
path: root/tools/gst-launch-ext
blob: 04b537d0fd8fe61494f380d54a4361d716c2e869 (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
#!/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) = @_;

    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 name=foo video_%02d! { queue ! mpeg2dec ! $cfg{VIDEOSINK} }  foo.audio_%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);
    }
}