From de45dcaf510842193bc4b42a5b926ee8842df8c3 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Fri, 23 Oct 2009 18:12:28 +0200 Subject: [PATCH] use IO::Select again to parse mplayer A: V: output This should allow better sync than parsing mplayer's mux debug log but requires us to chop char by char from input stream to detect both \n and \r as newline delimiters --- bin/mplayer.pl | 58 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/bin/mplayer.pl b/bin/mplayer.pl index ffc4d49..75345ec 100755 --- a/bin/mplayer.pl +++ b/bin/mplayer.pl @@ -71,8 +71,8 @@ our $prop = {}; my $pid = open3( $to_mplayer, $from_mplayer, $err_mplayer, 'mplayer', '-slave', '-idle', - '-quiet', - '-msglevel', 'demux=9', '-msgmodule', +# '-quiet', +# '-msglevel', 'demux=9', '-msgmodule', '-edlout', $edl, '-osdlevel', 3, '-vf' => 'screenshot', @@ -81,7 +81,7 @@ my $pid = open3( $to_mplayer, $from_mplayer, $err_mplayer, my $select = IO::Select->new(); #$select->add( \*STDIN ); $select->add( $from_mplayer ); -$select->add( $err_mplayer ); +#$select->add( $err_mplayer ); sub load_subtitles; @@ -621,23 +621,14 @@ my $slides = HTML5TV::Slides->new( } ); -print $to_mplayer "get_property $_\n" foreach grep { ! $prop->{$_} } ( qw/metadata video_codec video_bitrate width height fps length/ ); - -my $t = time; - -while ( my $line = <$from_mplayer> ) { -#warn "### $line\n"; +sub from_mplayer { + my $line = shift; - my $dt = time - $t; -#warn "dt $dt\n"; - if ( abs($dt) > 0.7 ) { - $slides->show( $pos ); - $t = time; - } - - if ( $line =~ m{DEMUX.+pts=(\d+\.\d+)} ) { - $pos = $1 if $1 > 0.2; # mplayer demuxer report fake position while seeking + if ( $line =~ m{V:\s+(\d+\.\d+)\s+} ) { + $pos = $1; + print "$pos\r"; +# $pos = $1 if $1 > 0.2; # mplayer demuxer report fake position while seeking } elsif ( $line =~ m{Exiting} ) { exit; } elsif ( $line =~ m{ANS_(\w+)=(\S+)} ) { @@ -685,3 +676,34 @@ while ( my $line = <$from_mplayer> ) { } +print $to_mplayer "get_property $_\n" foreach grep { ! $prop->{$_} } ( qw/metadata video_codec video_bitrate width height fps length/ ); + +my $t = time; +my $line; + +while ( 1 ) { + + my $dt = time - $t; + if ( abs($dt) > 0.7 ) { +warn "dt $dt\n"; + $slides->show( $pos ); + $t = time; + } + + foreach my $fd ( $select->can_read(0.1) ) { + if ( $fd == $from_mplayer ) { + my $ch; + sysread $from_mplayer, $ch, 1; + if ( $ch =~ m{[\n\r]} ) { + from_mplayer $line; + $line = ''; + } else { + $line .= $ch; + } + } else { + warn "unknown fd $fd"; + } + } + +} + -- 2.20.1