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

Thomas Worth dev at rarevision.com
Thu Jun 16 00:02:55 CEST 2011


On Wed, Jun 15, 2011 at 9:20 AM, Mike Scheutzow
<mike.scheutzow at alcatel-lucent.com> wrote:
>
> 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.

Yep, that was the problem. It's working now. Thanks!


More information about the ffmpeg-user mailing list