[vlc-devel] Soft field repeat?

Juha Jeronen juha.jeronen at jyu.fi
Thu Jan 6 12:23:04 CET 2011


On 01/06/2011 12:51 PM, Laurent Aimar wrote:
> On Thu, Jan 06, 2011 at 12:20:25PM +0200, Juha Jeronen wrote:
>    
>> There is an "i_nb_fields" member in picture_t, but this seems to be set
>> to 2 even for pictures whose PTS diff suggests it should be 3. Is this a
>> bug, or working as expected?
>>      
>   It is probably a bug. This field is set by the decoder. With avcodec you
> have:
>
> p_pic->i_nb_fields = 2 + p_sys->p_ff_pic->repeat_pict;
>
> Now, either avcode does not set 3 there, or this informations is lost
> somewhere between the decoder and your filter.
>    
Ok. Hmm, grepping for assignments to i_nb_fields, 
modules/codec/libmpeg2.c says

     p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
         p_sys->p_info->current_picture->nb_fields : 2;

...so I think this one might need to be checked, too, if the stream 
comes from a DVD.

But I'm not really sure where to start looking for the rest of the data 
path, so I think I'll just hack it for now.

One weird thing with the disc I was testing is that it seems the PTS 
diff can be 16, 33, 50 or 66 ms... which would suggest *1*, 2, 3 or *4* 
fields. Two or three are common, but one or four? I suppose "1" can 
follow from a half-frame cut during editing in interlaced form, and "4" 
might be used to save space on the disc if two sequential full frames 
are identical.

There is also this part in libmpeg2.c:

---8<---8<---8<---
             /* If nb_fields == 1, it is a field picture, and it will be
              * followed by another field picture for which we won't call
              * decoder_SynchroNewPicture() because this would have other
              * problems, so we take it into account here.
              * This kind of sucks, but I didn't think better. --Meuuh
              */
             decoder_SynchroNewPicture( p_sys->p_synchro,
                                        p_current->flags & 
PIC_MASK_CODING_TYPE,
                                        p_current->nb_fields == 1 ? 2 :
                                        p_current->nb_fields, i_pts, i_dts,
                                        p_info->sequence->flags & 
SEQ_FLAG_LOW_DELAY );
---8<---8<---8<---

...so I guess it either might or might not work correctly, if nb_fields 
is 1 :)

  -J




More information about the vlc-devel mailing list