[mythtv] DVB aspect change mid-stream loses frames?
Steve Davies
steve at one47.co.uk
Wed Feb 2 06:24:30 EST 2005
Ed Wildgoose wrote:
> Steve Davies wrote:
>
>> Hi,
>>
>> I have noticed recently that if the aspect ratio of a DVB stream
>> changes during playback, then a number of frames and some audio are
>> dropped as a result of the switch (as if the current buffers are
>> flushed). This occurs in both directions 4:3->16:9 and vice versa.
>>
>> I am quite sure that this was not the case late last year, but cannot
>> say for sure when it might have changed. I have trawled CVS and the
>> commits list for clues, and my favourite CVS log entry on the subject
>> has to be revision 1.386 (14/11/2004) of NuppelVideplayer.cpp where
>> the ReinitVideo() call was added on aspect change. This seems to
>> request a buffer cleardown as if a seek has been made, which would (I
>> believe) lose a chunk of frames.
>>
>> Can anyone comment on the advisability of commenting out the final
>> ClearAfterSeek() call in ReinitVideo, or even suggest a fix for me?
>
>
> Well, it probably needs to be put into a special case function because
> I think ReinitVideo is called for other reasons as well. I agree
> though that it is annoying - you lose the last second of audio before
> an advert break.
I can't actually find any other calls to ReinitVideo, but I agree a
"bool flush_buffers=true" parameter to ReinitVideo would probably be the
cleaner way to do this, with flush_buffers set to false for the aspect
change case. I'll see if this works for me.
> Also slightly annoying while we are talking about this issue is that
> the ReinitVideo is called when the frame is *decoded*, rather than
> when it is displayed. So usually I get the last few frames of the
> show stretched a little, and then the new stuff appears in the correct
> aspect ratio.
Yes, I used to see this, but at least the audio is clean - Losing the
last word of a sentence is what really bugs me.
> I guess we need a less vigorous function to just handle the aspect
> ratio change and for it really to be triggered when the frame is
> displayed (or perhaps just for the decoder to make a note of the issue
> and call the Reinit function some X frames later, where this is the
> number of frames ahead that we are decoding...)
Agreed, would storing an extra bool against each frame to indicate a
ReinitVideo be the way to do it? Or is some sort of reinit countdown
better - This would assume that only one aspect change occurs in the
space of the buffered frames.
There is also a very rare condition where seeking back and forth across
an aspect change can cause incorrect clipping of the Xv window (A 4:3
picture + OSD in a 4:3 screen, but clipped to a letterboxed 16:9) - I
have been unable to reproduce this reliably, it just happens sometimes.
Steve
More information about the mythtv-dev
mailing list