[FFmpeg-devel] [PATCH 1/2] libavcodec/v4l2_buffers.c: set AVFrame interlaced flags

James Almer jamrial at gmail.com
Mon Dec 16 23:11:20 EET 2024


On 12/16/2024 5:54 PM, Scott Theisen wrote:
> On 12/16/24 15:25, James Almer wrote:
>> On 12/16/2024 5:05 PM, Scott Theisen wrote:
>>> On 12/15/24 22:25, James Almer wrote:
>>>> On 12/15/2024 1:14 AM, Scott Theisen wrote:
>>>>> Originally from:
>>>>> https://github.com/MythTV/mythtv/ 
>>>>> commit/669955c6cb29196b4b5120451b5b998d67a65749
>>>>> ---
>>>>>   libavcodec/v4l2_buffers.c | 38 ++++++++++++++++++++++++++++++++++ 
>>>>> ++++
>>>>>   1 file changed, 38 insertions(+)
>>>>>
>>>>> diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
>>>>> index 23474ee143..56a8f0825c 100644
>>>>> --- a/libavcodec/v4l2_buffers.c
>>>>> +++ b/libavcodec/v4l2_buffers.c
>>>>> @@ -210,6 +210,43 @@ static enum AVColorTransferCharacteristic 
>>>>> v4l2_get_color_trc(V4L2Buffer *buf)
>>>>>       return AVCOL_TRC_UNSPECIFIED;
>>>>>   }
>>>>>   +static void v4l2_get_interlacing(AVFrame *frame, V4L2Buffer *buf)
>>>>> +{
>>>>> +    enum v4l2_field field;
>>>>> +    field = V4L2_TYPE_IS_MULTIPLANAR(buf->buf.type) ?
>>>>> +        buf->context->format.fmt.pix_mp.field :
>>>>> +        buf->context->format.fmt.pix.field;
>>>>> +
>>>>> +    if (field == V4L2_FIELD_INTERLACED || field == 
>>>>> V4L2_FIELD_INTERLACED_TB) {
>>>>> +        frame->flags |=  AV_FRAME_FLAG_INTERLACED;
>>>>> +        frame->flags |=  AV_FRAME_FLAG_TOP_FIELD_FIRST;
>>>>> +#if FF_API_INTERLACED_FRAME
>>>>> +FF_DISABLE_DEPRECATION_WARNINGS
>>>>> +        frame->interlaced_frame = 1;
>>>>> +        frame->top_field_first  = 1;
>>>>
>>>> No need to set these two fields. It's done by the generic code.
>>>>
>>>
>>> OK, I'll remove those lines.  Although it is not clear to me when 
>>> those will be set after libavcodec/pthread_frame.c calls 
>>> ff_decode_receive_frame_internal().
>>
>> They are set in decode_receive_frame_internal(), libavcodec/decode.c, 
>> not too long before the frame is ultimately returned to the caller.
> 
> I saw that decode_receive_frame_internal() calls 
> ff_decode_receive_frame_internal() and then sets the flags, but 
> ff_decode_receive_frame_internal() is called directly in libavcodec/ 
> pthread_frame.c.
> 
> It is not clear to me what calls decode_receive_frame_internal() to set 
> the flags after the call to ff_decode_receive_frame_internal() in 
> libavcodec/pthread_frame.c.  However, if it is called at some point to 
> set the flags and it works, it works, so it is not really that 
> important, just that is was not obvious to me when it would be called.

It's a bit convoluted, but the contexts that are processed in 
pthread_frame.c are workers and internal. All those frames are in the 
end passed to the main thread and returned to the caller, a process that 
will go through decode_receive_frame_internal().

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20241216/9c222200/attachment.sig>


More information about the ffmpeg-devel mailing list