From f301d235fc7955336a38ae4181edcf6961446cd1 Mon Sep 17 00:00:00 2001
From: Bob Igo <bob@stormlogic.com>
Date: Tue, 14 Jul 2009 15:14:20 -0400
Subject: incorporated vdpau into mplayer wrapper but unable to test; tested
 with other codecs, and it seems to work; remove smplayer functionality for
 now

---
 abs/core-testing/mplayer-wrapper/PKGBUILD          |   2 +-
 .../mplayer-wrapper/bin/mplayer-resumer.pl         | 188 ---------------------
 .../mplayer-wrapper/mplayer-wrapper.pl             |  48 +++++-
 abs/core-testing/tweaker/bin/twk_general.pl        |   2 +-
 4 files changed, 46 insertions(+), 194 deletions(-)
 delete mode 100755 abs/core-testing/mplayer-wrapper/bin/mplayer-resumer.pl

diff --git a/abs/core-testing/mplayer-wrapper/PKGBUILD b/abs/core-testing/mplayer-wrapper/PKGBUILD
index 3fb4124..b9e3aef 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
+pkgrel=2
 pkgdesc="wrapper for mplayer and mplayer derivatives"
 arch=('i686' 'x86_64')
 
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/mplayer-wrapper.pl b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl
index 9977741..2d823d9 100755
--- a/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl
+++ b/abs/core-testing/mplayer-wrapper/mplayer-wrapper.pl
@@ -76,7 +76,46 @@ sub translate_parameters() {
 # general capability of the CPU.
 sub dynamic_parameters () {
     my($mediafile)=@_;
-    return(); # ??? empty for now; further development required
+    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,
@@ -84,7 +123,8 @@ sub dynamic_parameters () {
 # 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 = ("smplayer", "mplayer-resumer.pl", "mplayer");
+    my @possible_players = ("mplayer-resumer.pl", "mplayer");
     my $command;
     my $candidate_player;
     foreach (@possible_players) {
@@ -102,9 +142,9 @@ sub pick_player () {
 # Calls player
 sub player () {
     my($player,$parameters,$mediafile)=@_;
-    my $command = "$player $parameters \"$mediafile\" 2>&1 2>/dev/null |";
+    my $command = "$player $parameters \"$mediafile\" 2>&1 |";
 
-    #print "DEBUG: command is:\n$command\n";
+    print "DEBUG: command is:\n$command\n";
     open(SHELL, $command);
     while (<SHELL>) {
 	print $_;
diff --git a/abs/core-testing/tweaker/bin/twk_general.pl b/abs/core-testing/tweaker/bin/twk_general.pl
index 3d16f2c..a5a154a 100755
--- a/abs/core-testing/tweaker/bin/twk_general.pl
+++ b/abs/core-testing/tweaker/bin/twk_general.pl
@@ -410,7 +410,7 @@ sub implement_option {
 	    change_or_make_setting('UserJobDesc2', 'User Job #2');
 	    change_or_make_setting('UserJobDesc3', 'User Job #3');
 	    change_or_make_setting('UserJobDesc4', 'Extract audio');
-	    change_or_make_setting('VCDPlayerCommand', 'mplayer vcd:\/\/ -cdrom-device %d -fs -zoom -vo xv -vf pp=lb');
+	    change_or_make_setting('VCDPlayerCommand', 'mplayer-wrapper.pl vcd:\/\/ -cdrom-device %d -fs -zoom');
 	    change_or_make_setting('VideoArtworkDir', "$SQL_DirVideo/.covers");
 	    change_or_make_setting('VideoBrowserNoDB', '1');
 	    change_or_make_setting('VideoDefaultPlayer', 'mplayer-wrapper.pl -fs -zoom %s');
-- 
cgit v0.12