summaryrefslogtreecommitdiffstats
path: root/abs/core/mplayer-wrapper/mplayer-wrapper.pl
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/mplayer-wrapper/mplayer-wrapper.pl')
-rw-r--r--[-rwxr-xr-x]abs/core/mplayer-wrapper/mplayer-wrapper.pl95
1 files changed, 72 insertions, 23 deletions
diff --git a/abs/core/mplayer-wrapper/mplayer-wrapper.pl b/abs/core/mplayer-wrapper/mplayer-wrapper.pl
index da0e838..18f3caf 100755..100644
--- a/abs/core/mplayer-wrapper/mplayer-wrapper.pl
+++ b/abs/core/mplayer-wrapper/mplayer-wrapper.pl
@@ -97,10 +97,13 @@ sub dynamic_parameters () {
my($mediafile)=@_;
my @parameters = ();
my $codec="";
+ my $xresolution=0;
+ my $yresolution=0;
my %vdpau_supported_modes=();
+ my $vf_parameters="";
# See if the GPU and driver support vdpau for GPU-based accelerated decoding
- my $command="vdpinfo |";
+ my $command="vdpauinfo |";
# On supported hardware, vdpinfo produces relevant results that look something like this (see
# http://www.phoronix.com/forums/showthread.php?t=14493 for additional details, or run
# vdpinfo on vdpau-capable hardware yourself):
@@ -130,49 +133,95 @@ sub dynamic_parameters () {
}
close(SHELL);
- # figure out what codec the video uses
- my $command="mplayer -identify -frames 0 \"$mediafile\" | grep ID_VIDEO_CODEC | cut -c 16- |";
+ # Learn some things about the video: codec and resolution
+ my $command="mplayer -identify -frames 0 \"$mediafile\" |";
open(SHELL, $command);
while (<SHELL>) {
chop;
- $codec = $_;
- #print "DEBUG: codec is $codec\n";
+ if (m/ID_VIDEO_CODEC=(.*)/g) {
+ $codec = $1;
+ #print "DEBUG: codec is $codec\n";
+ } elsif (m/ID_VIDEO_WIDTH=(.*)/g) {
+ $xresolution = $1;
+ #print "DEBUG: x resolution is $xresolution\n";
+ } elsif (m/ID_VIDEO_HEIGHT=(.*)/g) {
+ $yresolution = $1;
+ #print "DEBUG: y resolution is $yresolution\n";
+ }
}
close(SHELL);
- # We should use vdpau if it's available and helps with the codec we need to decode.
- if ($codec eq "ffh264") { # h.264
- if ($vdpau_supported_modes{"H264"}) {
- push(@parameters, "-vo vdpau");
- push(@parameters, "-vc ffh264vdpau");
+ # see if it's a malformed 4:3 video with top and side bars, in need of cropping
+ my $crop_candidate="";
+ my $biggestX=0;
+ my $biggestY=0;
+ # The algorithm here is trial and error. Skip 6 minutes into a video, and look at 40 frames of
+ # video. Videos shorter than 6 minutes will not end up being examined for letterboxing badness.
+ # In a longer video, use the least-recommended pruning that mplayer suggests, among the frames polled.
+ my $command="mplayer -ss 360 -ao null -vo null -vf cropdetect -frames 40 \"$mediafile\" | grep CROP | tail -1 |";
+ open(SHELL, $command);
+ while (<SHELL>) {
+ if (m/-vf (crop=.*)\)/g) {
+ $crop_candidate = $1;
+ print "DEBUG: $crop_candidate\n";
+ if ($crop_candidate =~ m/(\d+):(\d+)/) {
+ if (($1 > $biggestX) && ($2 > $biggestY)) {
+ $biggestX = $1;
+ $biggestY = $2;
+ print "newX: $biggestX\n";
+ print "newY: $biggestY\n";
+ }
+ }
}
- } elsif ($codec eq "ffmpeg2") { # MPEG2
- if ($vdpau_supported_modes{"MPEG2"}) {
- push(@parameters, "-vo vdpau");
- push(@parameters, "-vc ffmpeg12vdpau");
+ if (($biggestX != $xresolution) || ($biggestY != $yresolution)) {
+ $vf_parameters = $crop_candidate;
}
+ print "DEBUG: crop parameter is $vf_parameters\n";
+ }
+ close(SHELL);
- # ??? although MPEG1 is rare, it seems as if it should work with -vc ffmpeg12vdpau as well
-
- # problems have been reported with WMV3 support
-
+ # If there are no crop parameters, use vdpau if it's supported. Don't use vdpau if there's cropping
+ # because vdpau doesn't work with mplayer's cropping video filter.
+
+ # We should use vdpau if it's available and helps with the codec we need to decode.
+ if ($vf_parameters eq "") {
+ if ($codec eq "ffh264") { # h.264
+ if ($vdpau_supported_modes{"H264"}) {
+ push(@parameters, "-vo vdpau");
+ push(@parameters, "-vc ffh264vdpau");
+ }
+ } elsif ($codec eq "ffmpeg2") { # MPEG2
+ if ($vdpau_supported_modes{"MPEG2"}) {
+ push(@parameters, "-vo vdpau");
+ push(@parameters, "-vc ffmpeg12vdpau");
+ }
+
+ # ??? although MPEG1 is rare, it seems as if it should work with -vc ffmpeg12vdpau as well
+
+ # problems have been reported with WMV3 support
+
# } elsif ($codec eq "ffwmv3") { # WMV3
# if ($vdpau_supported) {
# push(@parameters, "-vo vdpau");
# push(@parameters, "-vc ffwmv3vdpau");
# }
- # problems have been reported with WVC1 support
-
+ # problems have been reported with WVC1 support
+
# } elsif ($codec eq "ffvc1") { # WVC1
# if ($vdpau_supported) {
# push(@parameters, "-vo vdpau");
# push(@parameters, "-vc ffvc1vdpau");
# }
-
- } else {
+
+ } else { # any codec that doesn't work with vdpau
+ push(@parameters, "-vo xv,x11,");
+ push(@parameters, "-vc ,");
+ push(@parameters, "-vf pp=lb,$vf_parameters");
+ }
+ } else { # there is a crop parameter
push(@parameters, "-vo xv,x11,");
push(@parameters, "-vc ,");
- push(@parameters, "-vf pp=lb,"); # doesn't actually work with vdpau, but doesn't break anything
+ push(@parameters, "-vf pp=lb,$vf_parameters");
}
return(@parameters);
}