
brian at interlinx
Feb 11, 2010, 5:49 AM
Post #1 of 1
(365 views)
Permalink
|
|
[PATCH] add avi support to
|
|
This patch adds AVI "file_info" support to the mythtv perl library. I hope you will consider adding this to your library. b. --- /usr/share/perl5/MythTV/Recording.pm.dist 2010-02-11 07:54:22.000000000 -0500 +++ /usr/share/perl5/MythTV/Recording.pm 2010-02-11 07:59:24.000000000 -0500 @@ -143,6 +143,8 @@ # Extract the info -- detect mpg from the filename if ($self->{'local_path'} =~ /\.mpe?g$/) { $self->{'finfo'} = $self->_mpeg_info(); + } elsif ($self->{'local_path'} =~ /\.avi$/) { + $self->{'finfo'} = $self->_avi_info(); } # Probably nupplevideo, but fall back to mpeg just in case else { @@ -294,6 +296,67 @@ return \%info; } + sub _avi_info { + my $self = shift; + my $file = $self->{'local_path'}; + $file =~ s/'/'\\''/sg; + my %info; + # First, we check for the existence of an mpeg info program + my $program = find_program('mplayer'); + # Nothing found? Die + die "You need mplayer to use this script on mpeg-based files.\n\n" unless ($program); + # Set the is_mpeg flag + $info{'is_mpeg'} = 1; + # Grab the info we want from mplayer (go uber-verbose to override --really-quiet) + my $data = `$program -v -nolirc -nojoystick -vo null -ao null -frames 0 -identify '$file' 2>/dev/null`; + study $data; + ($info{'video_type'}) = $data =~ m/^VIDEO:\s*\[(XVID)\]/m; + ($info{'width'}) = $data =~ m/^ID_VIDEO_WIDTH=0*([1-9]\d*)/m; + ($info{'height'}) = $data =~ m/^ID_VIDEO_HEIGHT=0*([1-9]\d*)/m; + ($info{'fps'}) = $data =~ m/^ID_VIDEO_FPS=0*([1-9]\d*(?:\.\d+)?)/m; + ($info{'audio_sample_rate'}) = $data =~ m/^ID_AUDIO_RATE=0*([1-9]\d*)/m; + ($info{'audio_bitrate'}) = $data =~ m/^ID_AUDIO_BITRATE=0*([1-9]\d*)/m; + ($info{'audio_bits_per_sample'}) = $data =~ m/^AUDIO:.+?ch,\s*[su](8|16)/mi; + ($info{'audio_channels'}) = $data =~ m/^ID_AUDIO_NCH=0*([1-9]\d*)/m; + ($info{'fps'}) = $data =~ m/^ID_VIDEO_FPS=0*([1-9]\d*(?:\.\d+)?)/m; + ($info{'aspect'}) = $data =~ m/^ID_VIDEO_ASPECT=0*([1-9]\d*(?:[\.\,]\d+)?)/m; + ($info{'audio_type'}) = $data =~ m/^ID_AUDIO_CODEC=0*([1-9]\d*(?:\.\d+)?)/m; + ($info{'avi_stream_type'}) = $data =~ m/^ID_DEMUXER=(\w+)/mi; + # Stream type + $info{'avi_stream_type'} = lc($info{'avi_stream_type'}); + if ($info{'avi_stream_type'} && $info{'avi_stream_type'} !~ /^avi/) { + die "Stream type '$info{'avi_stream_type'}' is not an avi, and will\n" + ."not work with this program.\n"; + } + # No matches on stream type? + if (!$info{'avi_stream_type'}) { + die "Unrecognized stream type. Please execute the following and see if you\n" + ."notice errors (make sure that you don't have the \"really quiet\" option\n" + ."set in your mplayer config). If not, create a ticket at\n" + ."http://svn.mythtv.org/trac/newticket and attach the output from:\n\n" + ." $program -v -nolirc -nojoystick -vo null -ao null \\\n" + ." -frames 0 -identify '$file'\n\n"; + } + # HD fix + if ($info{'height'} == 1080) { + $info{'height'} = 1088; + } + # mplayer is confused and we need to detect the aspect on our own + if (!$info{'aspect'}) { + if ($info{'height'} == 1088 || $info{'height'} == 720) { + $info{'aspect'} = 16 / 9; + } + else { + $info{'aspect'} = 4 / 3; + } + } + # Cleanup + $info{'aspect'} = aspect_str($info{'aspect'}); + $info{'aspect_f'} = aspect_float($info{'aspect'}); + # Return + return \%info; + } + # Uses one of two mpeg info programs to load data about mpeg-based nuv files sub _mpeg_info { my $self = shift;
|