May 4, 2021, 19:00 by jamr...@gmail.com:

> On 5/4/2021 12:44 PM, Lynne wrote:
>
>> Apr 30, 2021, 22:29 by c...@passwd.hu:
>>
>>>
>>>
>>> On Fri, 30 Apr 2021, Lynne wrote:
>>>
>>>> Apr 30, 2021, 13:34 by br...@frogmouth.net:
>>>>
>>>>> Signed-off-by: Brad Hards <br...@frogmouth.net>
>>>>> ---
>>>>>  libavutil/frame.c | 31 +++++++++++++++++++++++++++++++
>>>>>  libavutil/frame.h | 23 +++++++++++++++++++++++
>>>>>  2 files changed, 54 insertions(+)
>>>>>
>>>>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>>>>> index 2ec59b44b1..9f9953c2b4 100644
>>>>> --- a/libavutil/frame.c
>>>>> +++ b/libavutil/frame.c
>>>>> @@ -625,6 +625,37 @@ AVFrameSideData *av_frame_get_side_data(const 
>>>>> AVFrame *frame,
>>>>>  return NULL;
>>>>>  }
>>>>>
>>>>> +AVFrameSideData *av_frame_get_side_data_n(const AVFrame *frame,
>>>>> +                                          enum AVFrameSideDataType type,
>>>>> +                                          const int side_data_instance)
>>>>> +{
>>>>> +    int i;
>>>>> +    int n = 0;
>>>>> +
>>>>> +    for (i = 0; i < frame->nb_side_data; i++) {
>>>>> +        if (frame->side_data[i]->type == type) {
>>>>> +            if (n == side_data_instance) {
>>>>> +                return frame->side_data[i];
>>>>> +            } else {
>>>>> +                n++;
>>>>> +            }
>>>>> +        }
>>>>> +    }
>>>>> +    return NULL;
>>>>> +}
>>>>>
>>>>
>>>> _follow_the_code_style_
>>>> We have a document! We have thousands of lines of code already written 
>>>> with it!
>>>> We do not add brackets on one-line statements, and we allow for (int loops.
>>>>
>>>
>>> The developer docs also says that FFmpeg does not force an indentation 
>>> style on developers. So strictly speaking patch authors are not obligated 
>>> to follow the general practice if they don't want to.
>>>
>>
>> I already said what I had to say about this, so I'm just going to say "no" 
>> and
>> end it at that.
>> Unless you too agree that asterisk symbols look so much like insects we 
>> should
>> definitely have a MUL() macro, then we can talk.
>>
>>
>>> If we want to provide an API for getting multiple frame side data of the 
>>> same type, then I think the more natural thing to do is extending the 
>>> existing function, e.g.: "av_frame_get_side_data2(frame, type, prev)"
>>> This way the user can use the extended version (iterator-style) if having 
>>> multiple side data makes sense, and the original version if it does not.
>>>
>>
>> I could agree with that, though I'd still prefer a type-less 
>> av_frame_get_side_data_next(frame, prev).
>>
>
> Again, AVFrameSideData has no fields pointing to another entry. It's all 
> stored as flat array of pointers in AVFrame.side_data. A next() 
> implementation would have to iterate through the entire array from the first 
> element until it finds prev, and then return the next one, on every call.
>
> An iterate() implementation using a caller owned state variable is much more 
> efficient. Something like (assuming type-less)
>
>> AVFrameSideData *av_frame_side_data_iterate(const AVFrame *frame, void 
>> **opaque)
>> {
>>  uintptr_t i = (uintptr_t)*opaque;
>>
>>  if (i >= frame->nb_side_data)
>>  return NULL;
>>
>>  *opaque = (void*)(i + 1);
>>
>>  return frame->side_data[i];
>> }
>>
>
> Which is how av_codec_iterate() and many others handle this.
>
> I would also need a warning that calling av_frame_remove_side_data() will 
> invalidate the iterator state.
>

Yes, that's what I meant, sorry I wasn't more specific.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to