[FFmpeg-devel] [PATCH 001/279] Add a new channel layout API
James Almer
jamrial at gmail.com
Fri Dec 10 01:37:15 EET 2021
On 12/9/2021 8:31 PM, Marton Balint wrote:
>
>
> On Fri, 10 Dec 2021, Hendrik Leppkes wrote:
>
>> On Fri, Dec 10, 2021 at 12:06 AM Marton Balint <cus at passwd.hu> wrote:
>>>
>>>
>>>
>>> On Thu, 9 Dec 2021, Anton Khirnov wrote:
>>>
>>>> Quoting Lynne (2021-12-08 13:57:45)
>>>>> 8 Dec 2021, 13:16 by anton at khirnov.net:
>>>>>
>>>>>> Quoting Lynne (2021-12-08 10:02:34)
>>>>>>
>>>>>>> 8 Dec 2021, 02:06 by jamrial at gmail.com:
>>>>>>>
>>>>>>>> From: Anton Khirnov <anton at khirnov.net>
>>>>>>>>
>>>>>>>> The new API is more extensible and allows for custom layouts.
>>>>>>>> More accurate information is exported, eg for decoders that do not
>>>>>>>> set a channel layout, lavc will not make one up for them.
>>>>>>>>
>>>>>>>> Deprecate the old API working with just uint64_t bitmasks.
>>>>>>>>
>>>>>>>> Expanded and completed by Vittorio Giovara
>>>>>>>> <vittorio.giovara at gmail.com>
>>>>>>>> and James Almer <jamrial at gmail.com>.
>>>>>>>> Signed-off-by: Vittorio Giovara <vittorio.giovara at gmail.com>
>>>>>>>> Signed-off-by: James Almer <jamrial at gmail.com>
>>>>>>>> ---
>>>>>>>> libavutil/channel_layout.c | 498
>>>>>>>> ++++++++++++++++++++++++++++++------
>>>>>>>> libavutil/channel_layout.h | 510
>>>>>>>> ++++++++++++++++++++++++++++++++++---
>>>>>>>> libavutil/version.h | 1 +
>>>>>>>> 3 files changed, 906 insertions(+), 103 deletions(-)
>>>>>>>>
>>>>>>>> /**
>>>>>>>> * @}
>>>>>>>> @@ -128,6 +199,157 @@ enum AVMatrixEncoding {
>>>>>>>> AV_MATRIX_ENCODING_NB
>>>>>>>> };
>>>>>>>>
>>>>>>>> +/**
>>>>>>>> + * @}
>>>>>>>> + */
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * An AVChannelCustom defines a single channel within a custom
>>>>>>>> order layout
>>>>>>>> + *
>>>>>>>> + * Unlike most structures in FFmpeg, sizeof(AVChannelCustom) is
>>>>>>>> a part of the
>>>>>>>> + * public ABI.
>>>>>>>> + *
>>>>>>>> + * No new fields may be added to it without a major version bump.
>>>>>>>> + */
>>>>>>>> +typedef struct AVChannelCustom {
>>>>>>>> + enum AVChannel id;
>>>>>>>> +} AVChannelCustom;
>>>>>>>>
>>>>>>>
>>>>>>> Consider adding a 25-byte or so of a description field string
>>>>>>> here that
>>>>>>> would also be copied if the frame/layout is copied?
>>>>>>> That way, users can assign a description label to each channel,
>>>>>>> for example labeling each channel in a 255 channel custom layout
>>>>>>> Opus stream used in production at a venue somewhere.
>>>>>>> Also, consider additionally reserving 16-bytes here, just in case.
>>>>>>>
>>>>>>
>>>>>> That would enlarge the layout size by a significant amount. Keep
>>>>>> in mind
>>>>>> that this is all per frame. And for something that very few people
>>>>>> would
>>>>>> want to use.
>>>>>>
>>>>>> These descriptors, if anyone really needs them, can live in side
>>>>>> data.
>>>>>>
>>>>>
>>>>> That's fine with me.
>>>>> Can we at least have an opaque uint64_t? I'd accept a uintptr_t,
>>>>> or an int too, or even a single-byte uint8_t.
>>>>
>>>> like this?
>>>>
>>>> diff --git a/libavutil/channel_layout.h b/libavutil/channel_layout.h
>>>> index 7b77a74b61..7b2ba12532 100644
>>>> --- a/libavutil/channel_layout.h
>>>> +++ b/libavutil/channel_layout.h
>>>> @@ -252,7 +252,8 @@ enum AVMatrixEncoding {
>>>> * No new fields may be added to it without a major version bump.
>>>> */
>>>> typedef struct AVChannelCustom {
>>>> - enum AVChannel id;
>>>> + enum AVChannel id:16;
>>>> + int reserved:16;
>>>> } AVChannelCustom;
>>>
>>> A dynamically allocated field is so bad here? E.g.
>>>
>>> AVDictionary *metadata
>>>
>>> You can store labels. You can store group names. You can store language.
>>> You can store sound positions, GPS coordiantes, whatever.
>>>
>>> Yes, it will be slow. But it is rarely used for in normal cases, and it
>>> can be NULL usually.
>>>
>>
>> Pointers add a lot of trouble with ownership and memory management.
>> Wouldn't be so bad if its just the pointer without all that management
>> baggage.
>
> Sure, but since you are dynamically allocating the custom map
> AVChannelLayout->u.map, you are already managing memory...
> E.g. you could also store an array of AVDictionaries in AVChannelLayout.
That's one per layout, whereas your suggestion is one per channel.
>
> Regards,
> Marton
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list