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
|
#!/usr/bin/perl
use Shell;
use strict;
use POSIX qw(floor);
# Written by Bob Igo from the MythTV Store at http://MythiC.TV
# including some original code and contributions from Nick C.
# and graysky.
# Email: bob@stormlogic.com
#
# If you run into problems with this script, please send me email
# PURPOSE:
# --------------------------
# This is a wrapper script that tries to find the best parameters
# for calling an underlying video player. The outer layer determines
# the best playback parameters, while the inner layer picks the best
# player to call.
# RATIONALE:
# --------------------------
# Default video playback options are not optimal on all hardware or
# for all video types. In addition, common video players do not
# offer to bookmark video so that you can resume where you left off.
# Both of these problems can be addressed by this wrapper.
# PARAMETERS:
# --------------------------
# The same parameters you'd use for mplayer, some of which may be
# translated automatically for use with smplayer.
# FILES:
# --------------------------
# $mediafile, the file to play
sub run () {
my $mediafile = @ARGV[$#ARGV];
my $player = &pick_player();
my $player_parameters = join(' ',
&translate_parameters($player,@ARGV[0..$#ARGV-1]),
&dynamic_parameters($mediafile));
&player($player,$player_parameters,$mediafile);
}
&run();
# Translates any parameters into ones that will be compatible with the given player.
sub translate_parameters() {
my($player,@parameters)=@_;
if ($player eq "smplayer") {
# Stupidly, smplayer uses a different set of command-line parameters than generic
# mplayer, so we need to translate mplayer-centric ones into the few that are
# available in smplayer-ese.
my %smplayer_parameter_translation_array = (
"-fs" => "-fullscreen",
"-zoom" => " "
);
sub translate() {
my($flag)=@_;
return $smplayer_parameter_translation_array{$flag};
}
return map(&translate($_), @parameters);
} else {
# currently, all other players used by this wrapper work with mplayer parameters
return @parameters;
}
}
# Returns an array of dynamic parameters based on the media type,
# the presence of special playback decoding hardware, and the
# general capability of the CPU.
sub dynamic_parameters () {
my($mediafile)=@_;
my @parameters = ();
my $codec="";
# figure out what codec the video uses
my $command="mplayer -identify -vo null -frames 0 \"$mediafile\" | grep ID_VIDEO_CODEC | cut -c 16- |";
open(SHELL, $command);
while (<SHELL>) {
chop;
$codec = $_;
#print "DEBUG: codec is $codec\n";
}
close(SHELL);
# We should use vdpau if it's available and helps with the codec we need to decode.
# ??? NOTE: At the moment, vdpau capability is assumed, not verified.
if ($codec eq "ffh264") { # h.264
push(@parameters, "-vo vdpau");
push(@parameters, "-vc ffh264vdpau");
} elsif ($codec eq "ffmpeg2") { # MPEG2
push(@parameters, "-vo vdpau");
push(@parameters, "-vc ffmpeg12vdpau");
# problems reported with WMV3 support
# } elsif ($codec eq "ffwmv3") { # WMV3
# push(@parameters, "-vo vdpau");
# push(@parameters, "-vc ffwmv3vdpau");
# problems reported with WVC1 support
# } elsif ($codec eq "ffvc1") { # WVC1
# push(@parameters, "-vo vdpau");
# push(@parameters, "-vc ffvc1vdpau");
} else {
push(@parameters, "-vo xv,x11,");
push(@parameters, "-vc ,");
}
push(@parameters, "-vf pp=lb,");
return(@parameters);
}
# Find the best player for use on this system. The script prefers smplayer,
# which has built-in bookmarking, falling back to mplayer-resumer.pl, which
# implements bookmarking as an mplayer wrapper, if smplayer cannot be found.
# Finally, if no bookmarking players can be found, a barebones mplayer is used.
sub pick_player () {
#my @possible_players = ("smplayer", "mplayer-resumer.pl", "mplayer");
my @possible_players = ("mplayer-resumer.pl", "mplayer");
my $command;
my $candidate_player;
foreach (@possible_players) {
$candidate_player = $_;
$command = "which $candidate_player |";
open(SHELL, $command);
if (<SHELL>) {
#print "player $candidate_player : $_\n";
return $candidate_player;
}
close(SHELL);
}
}
# Calls player
sub player () {
my($player,$parameters,$mediafile)=@_;
my $command = "$player $parameters \"$mediafile\" 2>&1 |";
print "DEBUG: command is:\n$command\n";
open(SHELL, $command);
while (<SHELL>) {
print $_;
}
close(SHELL);
}
|