[FFmpeg-devel] [PATCH]Fix for issue694. Dirac A/V sync loss

Michael Niedermayer michaelni
Sat Dec 20 05:29:47 CET 2008


On Fri, Dec 19, 2008 at 10:28:23PM -0500, David Conrad wrote:
> On Dec 19, 2008, at 6:01 AM, Michael Niedermayer wrote:
> 
> > On Tue, Dec 02, 2008 at 01:39:03PM +1100, Anuradha Suraparaju wrote:
> >> Hi,
> >>
> >> Sorry for the delayed response.
> >
> > noone beats my delayed responses, i stil have mails from last year i  
> > should
> > awnser ...
> >
> >
> >> My replies are inline.
> > [...]
> >>>> Index: libavcodec/libdiracdec.c
> >>>> ===================================================================
> >>>> --- libavcodec/libdiracdec.c	(revision 15870)
> >>>> +++ libavcodec/libdiracdec.c	(working copy)
> >>>> @@ -88,10 +88,12 @@
> >>>>
> >>>>     *data_size = 0;
> >>>>
> >>>> -    if (buf_size>0)
> >>>> +    if (buf_size>0) {
> >>>>         /* set data to decode into buffer */
> >>>>         dirac_buffer (p_dirac_params->p_decoder, buf, buf 
> >>>> +buf_size);
> >>>> -
> >>>> +        if ((buf[4] &0x08) == 0x08 && (buf[4] & 0x03))
> >>>> +            avccontext->has_b_frames = 1;
> >>>> +    }
> >>>>     while (1) {
> >>>>          /* parse data and process result */
> >>>>         DecoderState state = dirac_parse (p_dirac_params- 
> >>>> >p_decoder);
> >>>
> >>> Just to make sure this code does what you intend it to do.  
> >>> (has_b_frames is
> >>> poorly named ...) and i dont know dirac well enough to understand  
> >>> what the
> >>> checked bits represent exactly
> >>>
> >>> has_b_frames == 1 means that a decoder would have a 1 frame  
> >>> reordering buffer
> >>> (like mpeg1/2 with IPB frames where IP are delayed while B are not)
> >>> has_b_frames=0 means that a decoder would not have any frame  
> >>> delay, that also
> >>> implicates that there is no frame reordering. (mpeg2 low delay is  
> >>> an example
> >>> of this) in mpeg1/2 no reordering also implicates no b frames
> >>> has_b_frames=1 does not require that there are B frames
> >>>
> >>> also has_b_frames is mainly used for filling in missing timestamps
> >>>
> >>
> >> Dirac, the specification, has a flexible GOP structure. So the frame
> >> re-ordering can be anything. This said, the current implementations  
> >> of
> >> Dirac (dirac-research and Schroedinger) use a frame-reordering on 1.
> >> Intra and backward predicted frames can be delayed but bi-directional
> >> frames are not.  So the mpeg1/2 logic for has_b_frames holds. In  
> >> Dirac
> >> it is not possible to tell whether a frame is a backward predicted  
> >> frame
> >> (similar to 'P' frame) or a bi-directional frame (similar to 'B'  
> >> frame)
> >> easily without processing its reference frames. So I set  
> >> has_b_frames to
> >> 1 if I come across any predicted frame (buf[4] &0x08) == 0x08 -  
> >> mean the
> >> parse unit is a picture, and (buf[4] & 0x03 checks the number of
> >> references) . So an I-frame only sequence will set has_b_frames to  
> >> 0 but
> >> a sequence having only P or P&B frames will set it to 1 since
> >> has_b_frames=1 does not require that there be any 'B' frames in the
> >> sequence.
> >
> > what happens with a
> > display order I B B I B B P ...
> > coded order   I I B B P B B ...
> > ?
> > the way i understand your explanation is that the first 2 I frames  
> > would
> > have has_b_frames=0 and then when the first B is encountered it is  
> > set to 1
> > this doesnt seem correct. has_b_frames should be 1 from the begin  
> > ideally
> > In that respect i wonder if it wouldnt be more correct to just  
> > always set
> > has_b_frames=1, but then i dont know dirac, its really a question  
> > about
> > how a 1-in 1-out decoder would work
> >
> > i mean if it returned I frames with a delay of 1 then has_b_frames=1  
> > would
> > be correct. If it didnt then i wonder what it would do with
> > I,I,B
> > immedeatly decoding&returning the I frames would cause a
> > problem once it encounters the B frame.
> 
> Because I've been wondering about the best way to handle this in the  
> soc decoder, a couple observations/questions:
> In Dirac, the only way we know to delay a frame is because the frame  
> number of the delayed frame is greater than one more than the frame  
> number of the last frame in coded order. If has_b_frames is set then  
> (instead of on frames with references) then in that sequence the first  
> I frame would have has_b_frames=0, then for second and onwards it  
> would be set.

> Given this, should has_b_frames simply be set for all Dirac streams?

i think so


> 
> I think what currently would happen with libdirac/schroedinger in that  
> situation is that it would decode and return the first I frame, then  
> the second I frame would return no picture (STATE_BUFFER/ 
> SCHRO_DECODER_NEED_BITS), then starting with the b-frame would  
> continue returning frames in coded order. The soc decoder currently  
> does this as well; e.g. for that sequence:
> in:  I I B B P B B
> out: I   B B I B B P
> 
> Is this acceptable? IIRC ffmpeg api is that the pts of the outputted  
> frame is equal to the dts of the inputted frame, which wouldn't be  
> true for the first frame, but I'm not sure how to fix that...
> 

> Second, the h264 decoder sets has_b_frames to be equal to the delay,  
> rather than just 0 or 1. Is this part of the API or just a convenience  
> for h264? Nothing except the current encoders prevent Dirac from  
> having an arbitrarily long delay.

you can consider this to be part of the API


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Breaking DRM is a little like attempting to break through a door even
though the window is wide open and the only thing in the house is a bunch
of things you dont want and which you would get tomorrow for free anyway
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081220/4e610b8d/attachment.pgp>



More information about the ffmpeg-devel mailing list