[MPlayer-dev-eng] [PATCH] Better double frame rate output and frame limit option.
Vicente Sendra
visenri at yahoo.es
Fri Jan 11 01:56:59 CET 2013
--- El jue, 10/1/13, Andy Furniss <andyqos at ukfsn.org> escribió:
> De: Andy Furniss <andyqos at ukfsn.org>
> Asunto: Re: [MPlayer-dev-eng] [PATCH] Better double frame rate output and frame limit option.
> Para: mplayer-dev-eng at mplayerhq.hu
> CC: "Vicente Sendra" <visenri at yahoo.es>
> Fecha: jueves, 10 de enero, 2013 01:15
> Andy Furniss wrote:
>
> > Testing an old mpeg2 transport stream I am seeing an
> initial pause with
> > lavf/correct-pts - this happens with previous version
> of mplayer.c patch
> > as well
>
> Here's a 10 meg sample - blanks 1-2 sec at the start and by
> luck my 10meg dd chop has shown another issue at the end -
> it doesn't quit.
>
> -vo doesn't matter happens with tfielsd/yadif=1 doesn't
> happen with vanilla mplayer. needs -correct-pts/-demuxer
> lavf eg.
>
> -vf yadif=1 -correct-pts -vo xv -framedrop slow-start.ts
>
> http://www.andyqos.ukfsn.org/slow-start.ts
What really triggers the problem is just -correct-pts combined with the frame decoding errors that this file has.
I've solved it with a modification of the last correction:
> I found the problem, it was related to my comment:
>
>> In correct-pts mode full_frame should be used to check if frame is
>> complete and not an interlaced frame.
>
> But it is not limited to interlaced frames, some times decode_video returns without a complete frame because it has decoded a frame it needs but it is not the actual frame.
>
> I declared full_frame in generate_video_frame and changed code as follows:
>
> decoded_frame = decode_video(sh_video, start, in_size, drop_frame, pts, &full_frame);
>
> if (decoded_frame) {
> ....
> } else {
> if(full_frame){
> *frame_time = calculate_frame_time_by_pts(sh_video,0);
> process_framedrop(0,*frame_time,drop_frame);
> break;
> }
> }
>
> We do frame stuff only if full frame.
> In your sample, calculate_frame_time_by_pts was called for some frames that were not a full_frame, and this resulted in an incorrect mpctx->delay.
This time the problem was that full_frames were parsed, but no decoding was done because of broken file. Calculate_frame_time_by_pts was called for some frames that were broken, and this resulted in an incorrect mpctx->delay
changing code like this solves the problem:
-------------------------------------------------------
if (decoded_frame) {
....
} else {
if(full_frame && drop_frame){
*frame_time = calculate_frame_time_by_pts(sh_video,0);
process_framedrop(0,*frame_time,drop_frame);
break;
}
}
-------------------------------------------------------
Now video is played like vanilla mplayer.
The quitting problem is solved too with this little change.
There is a little difference in the A/V sync behavior at the start of the file between using a filter like yadif=1 and not using it, it has to do something with getting video PTS from VO, i'll take a deeper look at this tomorrow.
With yadif=1 it plays instantaneously and slowly sync with video (like vanilla mplayer).
Without it video waits for just a second.
Both get in sync correctly, just in a different way
The file attached is the new updated patch to apply over r35689.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mplayer.c.diff
Type: application/octet-stream
Size: 47645 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/attachments/20130111/5775ad2c/attachment-0001.obj>
More information about the MPlayer-dev-eng
mailing list