[FFmpeg-user] Detect if an MTS file is interlaced or not?

Mike Scheutzow mike.scheutzow at alcatel-lucent.com
Wed Jun 15 18:20:07 CEST 2011







Thomas Worth wrote:
> On Wed, Jun 15, 2011 at 7:06 AM, Mike Scheutzow
> <mike.scheutzow at alcatel-lucent.com> wrote:
>> Thomas Worth wrote:
>>>>> On Wed, Jun 8, 2011 at 2:13 AM, Thomas Worth <dev at rarevision.com> wrote:
>>>>> It doesn't seem to be getting it from r_frame_rate, since that is
>>>>> always double the playback rate with MTS it seems.
>>>> The double rate is not an artifact of the container. The container knows
>>>> nothing about the frame rate.
>>> The container, or at least the streams should be flagged as
>>> field-based and have some type of field order flag (top first / bottom
>>> first).
>> For a transport stream container, this is not the case. There is no
>> field/frame info at the container level. There is no field/frame info at the
>> global stream level. For H.264, this information is placed at the Frame
>> level.
>>
>> For H.264, you have to examine the Slice NAL to determine field/frame and
>> top/bottom status. This is because H.264 is very flexible, and allows mixing
>> field pictures and frame pictures in the same elementary stream.
>>
>>> Otherwise, a playback device wouldn't know how to play it
>>> back. It is this information I need to interpret, but I just can't
>>> seem to get it. I know the information is there, I just need to know
>>> how to retrieve it from avcodec.
>> There are two fields, but they don't tell you what you seem to want.
>>
>> See AVFrame.interlaced_frame and AVFrame.top_field_first in avcodec.h. These
>> fields are part of the AVFrame information returned by
>> avcodec_decode_video2().
>>
>> Be careful though: these fields do NOT tell you whether the input to the
>> decoder was 2 field pictures or 1 frame picture, because a frame picture can
>> also can also contain interlaced top/bottom content (this is very common.)
>>
>> As far as I know, FFmpeg does not provide an easy way to determine if a
>> particular AVPacket holds 1 field or 1 frame.
> 
> Thanks, Mike. That's very helpful. I've tried decoding a single frame
> and inspecting the AVFrame.interlaced_frame, but as you suspected it
> doesn't tell me what I need to know (even though avcodec.h suggests
> that this should be set by the decoder).

The AVFrame.interlaced_frame value is set correctly for me when field 
pictures are fed to the h264 decoder. (I'm not using latest git, but it 
seems unlikely this got broken.)

Are you sure that avcodec_decode_video2() said that a decoded frame was 
available? If your stream has P slices, you should have fed it at least 
four AVPackets before the AVFrame valid flag was set.

> but as you suspected it doesn't tell me what I need to know 

My warning was that your plan has a *conceptual* problem; I was not 
saying that AVFrame.interlaced_frame is wrong for some situations.

> What is perplexing is that
> VLC will play back these videos at the correct frame rate, and I
> suspect FFplay will as well. VLC also deinterlaces the video properly
> and with the correct field order. Since this is the case, how are
> these apps figuring this out?


Mike Scheutzow


More information about the ffmpeg-user mailing list