summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/mplayer-wrapper
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core-testing/mplayer-wrapper')
-rw-r--r--abs/core-testing/mplayer-wrapper/PKGBUILD11
-rwxr-xr-xabs/core-testing/mplayer-wrapper/bin/mplayer-resumer.pl188
-rwxr-xr-xabs/core-testing/mplayer-wrapper/bin/mplayer-wrapper.pl110
-rw-r--r--abs/core-testing/mplayer-wrapper/mplayer-wrapper.install38
-rwxr-xr-xabs/core-testing/mplayer-wrapper/mplayer-wrapper.pl212
5 files changed, 258 insertions, 301 deletions
diff --git a/abs/core-testing/mplayer-wrapper/PKGBUILD b/abs/core-testing/mplayer-wrapper/PKGBUILD
index 82f1082..c64875d 100644
--- a/abs/core-testing/mplayer-wrapper/PKGBUILD
+++ b/abs/core-testing/mplayer-wrapper/PKGBUILD
@@ -1,6 +1,6 @@
pkgname=mplayer-wrapper
-pkgver=1
-pkgrel=1
+pkgver=1
+pkgrel=9
pkgdesc="wrapper for mplayer and mplayer derivatives"
arch=('i686' 'x86_64')
@@ -10,7 +10,12 @@ source=(mplayer-wrapper.pl)
license=('GPL2')
+install=mplayer-wrapper.install
build() {
+ LH_ROOT=/usr/LH
+ mkdir -p $startdir/pkg/$LH_ROOT/bin/
+
cd $startdir
- install -m0777 -D bin/* $startdir/pkg/usr/LH/bin/
+ # executables
+ install -m0755 -D *.pl $startdir/pkg/$LH_ROOT/bin/
}
diff --git a/abs/core-testing/mplayer-wrapper/bin/mplayer-resumer.pl b/abs/core-testing/mplayer-wrapper/bin/mplayer-resumer.pl
deleted file mode 100755
index c785a25..0000000
--- a/abs/core-testing/mplayer-wrapper/bin/mplayer-resumer.pl
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/perl
-
-use Shell;
-use strict;
-use POSIX qw(floor);
-
-# Written by Bob Igo from the MythTV Store at http://MythiC.TV
-# Email: bob@stormlogic.com
-#
-# If you run into problems with this script, please send me email
-
-# PURPOSE:
-# --------------------------
-# This is a wrapper script to prove the concept of having MythTV
-# resume playback of previously-stopped video where you left off.
-# It's likely that a good solution will look different than this
-# initial code.
-
-# RATIONALE:
-# --------------------------
-# Watching 90% of a video and stopping causes you to return to the
-# beginning again the next time you watch it. Remembering where
-# you were in the video and resuming at that position is a much nicer
-# behavior for the user.
-#
-# By default, mplayer spits out timecode information that tells you
-# where you are in the video, to the tenth of a second. Mplayer also
-# supports a seek feature on the command-line. We can make use of these
-# features to write an mplayer wrapper that will remember the last
-# position in a video file and resume to it on playback.
-
-# PARAMETERS:
-# --------------------------
-# see print_usage() below
-
-# FILES:
-# --------------------------
-# $infile, the video to play
-# $resumefile, the video's resume file (see get_resume_filename() below)
-
-# KNOWN ISSUES:
-# --------------------------
-# Mplayer misreports the timecodes on .nuv MPEG-2 files. Currently, anything
-# captured via an HDTV tuner card and put into your /myth/video directory
-# will fail with this resumer.
-#
-# Current theories include the timecode having to do with the show's broadcast
-# time, recording time, or perhaps its upload time to the station that
-# broadcast it.
-
-# DESIGN LIMITATION:
-# -------------------------
-# If the video file to be played is on a read-only filesystem, or otherwise
-# lives in a location that cannot be written to, resume will fail. This is
-# because the current implementation uses a file parallel to the video file
-# to store the timecode.
-#
-
-# CHANGE LOG:
-# 5/3/2006
-# Added last time started checking.
-# If this script is restarted within $tdiff (default 5 seconds)
-# then it will delete the file used to keep track of the videos
-# resume position.
-
-
-my $infile;
-my $resumefile;
-my $mplayer_parameters;
-my $fudge_factor=2; # number of additional seconds to skip back before playback
-my $tnow; # Time now.
-my $tprev; # Time the prog was last started.
- # Returned from the modification time of the xx.resume file.
-my $tdiff=5; # How many seconds before we should start from
- # the beginning of the movie
-#DEBUG
-#open(DEBUG,">/tmp/debug") || die "unable to open debug file";
-
-sub init () {
- $tnow = time();
- $infile = @ARGV[$#ARGV];
-
- $resumefile = &get_resume_filename($infile);
- # This returns the 9th element of the 13 element array
- # created by the stat function.
- $tprev = (stat ($resumefile))[9];
- # if this file is restarted in less than 5 seconds then
- # remove the .resume file
- if ( ($tnow - $tprev) < $tdiff ) {
- unlink($resumefile);
- }
-
- $mplayer_parameters = join(' ',@ARGV[0..$#ARGV-1]);
-}
-
-&init();
-&save_time_offset(&mplayer($mplayer_parameters,$infile), $resumefile);
-
-#close(DEBUG);
-
-# For $pathname, return $path.$filename.resume
-sub get_resume_filename () {
- my($pathname)=@_;
-
- my $idx = rindex($pathname,"/");
-
- if ($idx == -1) { # There was no "/" in $pathname
- return ".".$pathname.".resume";
- } else {
- # Now we need to split out the path from the filename.
- my $path = substr($pathname,0,$idx+1);
- my $filename = substr($pathname,$idx+1);
- return "$path.$filename.resume";
- }
-}
-
-# Calls mplayer and returns the last known video position
-sub mplayer () {
- my($parameters,$infile)=@_;
- my $seconds=0;
- my $timecode=&get_time_offset($infile);
- my $command = "mplayer $parameters -ss $timecode \"$infile\" 2>&1 2>/dev/null |";
-
- open(SHELL, $command);
- # The kind of line we care about looks like this example:
- # A:1215.2 V:1215.2 A-V: 0.006 ct: 0.210 207/201 13% 0% 1.9% 0 0 68%
- # But all we care to look at is the first number.
-
- while (<SHELL>) {
- #print DEBUG $_;
- if (m/A: *[0-9]+\.[0-9]/) { # See if this line has timecodes on it
- my $last_timecode_line = &extract_last_timecode_line($_);
- if ($last_timecode_line =~ m/ *([0-9]+\.[0-9]) V/) {
- $seconds=$1;
- }
- }
- }
- close(SHELL);
-
- return $seconds;
-
- sub extract_last_timecode_line () {
- my ($line)=@_;
- my @lines=split('A:',$line);
- return @lines[$#lines-1];
- }
-}
-
-# Save the last known video position
-sub save_time_offset () {
- my($seconds, $resumefile)=@_;
-
- open(RESUMEFILE, ">$resumefile") || die "Unable to open $resumefile for writing";
- print RESUMEFILE "$seconds";
- close(RESUMEFILE);
-}
-
-# returns the number of seconds corresponding to the last known video position,
-# in hh:mm:ss format, compatible with the "-ss" parameter to mplayer
-sub get_time_offset () {
- my($videofile)=@_;
- my($resumefile) = &get_resume_filename($videofile);
- my $seconds=0;
- my $timecode;
-
- open(RESUMEFILE, "<$resumefile") || return "00:00:00";
- while(<RESUMEFILE>) {
- $seconds=$_;
- }
- close(RESUMEFILE);
-
- my $hours = floor($seconds/3600);
- $seconds = $seconds - $hours*3600;
-
- my $minutes = floor($seconds/60);
- $seconds = int($seconds - $minutes*60) - $fudge_factor;
-
- $timecode = sprintf "%02d:%02d:%02d",$hours,$minutes,$seconds;
-# print "TIMECODE: $timecode\n";
- return $timecode;
-}
-
-sub print_usage () {
- print "USAGE:\n";
- print "\t",$ARGV[0], "[mplayer parameters] video_file\n";
- print "\t","e.g. ",$ARGV[0], "-fs -zoom my.mpg\n";
- print "\t","Version 5/3/2006\n";
-}
diff --git a/abs/core-testing/mplayer-wrapper/bin/mplayer-wrapper.pl b/abs/core-testing/mplayer-wrapper/bin/mplayer-wrapper.pl
deleted file mode 100755
index 583786d..0000000
--- a/abs/core-testing/mplayer-wrapper/bin/mplayer-wrapper.pl
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/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 {
- return @parameters;
- }
-}
-
-# Returns an array of dynamic parameters based in part on the media.
-sub dynamic_parameters () {
- my($mediafile)=@_;
- return(); # ??? empty for now; further development required
-}
-
-# 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 $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 2>/dev/null |";
-
- #print "DEBUG: command is:\n$command\n";
- open(SHELL, $command);
- while (<SHELL>) {
- print $_;
- }
- close(SHELL);
-}
diff --git a/abs/core-testing/mplayer-wrapper/mplayer-wrapper.install b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.install
new file mode 100644
index 0000000..18f1b75
--- /dev/null
+++ b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.install
@@ -0,0 +1,38 @@
+# This is a default template for a post-install scriptlet. You can
+# remove any functions you don't need (and this header).
+
+# arg 1: the new package version
+pre_install() {
+/bin/true
+}
+
+# arg 1: the new package version
+post_install() {
+/bin/true
+}
+
+# arg 1: the new package version
+# arg 2: the old package version
+pre_upgrade() {
+ /bin/true
+}
+
+# arg 1: the new package version
+# arg 2: the old package version
+post_upgrade() {
+ /bin/true
+}
+
+# arg 1: the old package version
+pre_remove() {
+ /bin/true
+}
+
+# arg 1: the old package version
+post_remove() {
+ /bin/true
+}
+
+op=$1
+shift
+$op $*
diff --git a/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl
new file mode 100755
index 0000000..da0e838
--- /dev/null
+++ b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl
@@ -0,0 +1,212 @@
+#!/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();
+
+ # mplayer evaluates configuration options in the following order, with
+ # later-evaluated options overriding earlier-evaluated ones, both within
+ # a given configuration location and between them:
+ # 1) system-wide configuration/profiles, /etc/mplayer/mplayer.conf
+ # 2) user-specific configuration/profiles, ~/.mplayer/config
+ # 3) commandline configuration parameters
+ # 4) file-specific configuration, ~/.mplayer/[filename].conf
+ # 5) any nonstandard configuration file, included via "-include" parameter
+ #
+ # This script's dynamic configuration options fall in at 2.5 above,
+ # so commandline options, file-specific configuration options,
+ # or a nonstandard configuration file will override the options that
+ # the script creates, but system-wide and user-specific configuration
+ # will be overridden by the dynamic configuration options.
+ #
+ # This is sub-optimal, as the easiest way for a user to compensate for
+ # a misfiring configuration rule would be to override it in a configuration
+ # file. Instead, they will have to change the way they run this script.
+
+ my $player_parameters = join(' ',
+ &dynamic_parameters($mediafile),
+ &translate_parameters($player,@ARGV[0..$#ARGV-1]));
+ &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="";
+ my %vdpau_supported_modes=();
+
+ # See if the GPU and driver support vdpau for GPU-based accelerated decoding
+ my $command="vdpinfo |";
+ # 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):
+ #
+ #MPEG1 0 2 4096 4096
+ #MPEG2_SIMPLE 3 2 4096 4096
+ #MPEG2_MAIN 3 2 4096 4096
+ #H264_MAIN 41 4 4096 4096
+ #H264_HIGH 41 4 4096 4096
+
+ my $grabbing_modes=0;
+ open(SHELL, $command);
+ while (<SHELL>) {
+ chop;
+ if (m/Decoder Capabilities/gi) {
+ $grabbing_modes=1;
+ #print "*** MODES START NOW"
+ } elsif (m/Output Surface/gi) {
+ $grabbing_modes=0;
+ } elsif ($grabbing_modes) {
+ if (m/[A-Z]+[0-9]+/g) {
+ s/(_.*)//g;
+ #print "*** GRABBED MODE $_\n";
+ $vdpau_supported_modes{$_} = 1;
+ }
+ }
+ }
+ close(SHELL);
+
+ # figure out what codec the video uses
+ my $command="mplayer -identify -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.
+ 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
+
+# } elsif ($codec eq "ffvc1") { # WVC1
+# if ($vdpau_supported) {
+# push(@parameters, "-vo vdpau");
+# push(@parameters, "-vc ffvc1vdpau");
+# }
+
+ } else {
+ push(@parameters, "-vo xv,x11,");
+ push(@parameters, "-vc ,");
+ push(@parameters, "-vf pp=lb,"); # doesn't actually work with vdpau, but doesn't break anything
+ }
+ 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: $0's player command is: *** $command ***\n";
+ open(SHELL, $command);
+ while (<SHELL>) {
+ print $_;
+ }
+ close(SHELL);
+}