On 12/14/2021 5:27 AM, Marton Balint wrote:
On Mon, 13 Dec 2021, James Almer wrote:
On 12/13/2021 10:13 PM, Marton Balint wrote:
On Tue, 7 Dec 2021, James Almer wrote:
From: Anton Khirnov <an...@khirnov.net>
[...]
-static const char *get_channel_name(int channel_id)
+static const char *get_channel_name(enum AVChannel channel_id)
{
- if (channel_id < 0 || channel_id >=
FF_ARRAY_ELEMS(channel_names))
- return NULL;
+ if ((unsigned) channel_id >= FF_ARRAY_ELEMS(channel_names) ||
+ !channel_names[channel_id].name)
+ return "?";
I'd rather return NULL here instead of "?". Is this allowed to
happen by
the way?
Yes, even in a native layout, several AVChannel values have no name.
The idea is to print a string like "FL|FR|?" when the name of a
channel is unknown. See the test in patch 2.
As far as I see this function is used by av_channel_layout_describe. If
get_channel_name returned NULL, then av_channel_layout_describe could
print Ch%d as well, instead of a "?".
It's also used by the legacy API now that you mention it, and returning
"?" is a behavior change, so thanks for noticing it.
return channel_names[channel_id].name;
}
-static const struct {
+static inline void get_channel_str(AVBPrint *bp, const char *str,
+ enum AVChannel channel_id)
+{
+ if (str)
+ av_bprintf(bp, "%s", str);
+ else
+ av_bprintf(bp, "?");
If this is not allowed, then you should propagate back
AVERROR(EINVAL) if
it does. If it is allowed, because the user can use some custom
channel_id-s, then something like "USER%d" should be returned IMHO.
How about Ch%d? It would also further improve the usefulness of
av_channel_layout_from_string() by looking for such strings.
I find "Ch%d" a bit confusing, beacuse "Ch%d" would normally mean the
n-th channel in a layout, not a channel with the n-th ID.
What do you suggest? USER%d is IMO ugly. Maybe ChID%d? Although both are
a bit long.
I would like to attach some extendable, possibly per-channel
metadata to
the channel layout. I'd rather put it into AVChannelLayout, so native
layouts could also have metadata. This must be dynamically allocated to
make it extendable and to not consume too many bytes. I can accept
that it
will be slow. But I don't see it unmanagable, because AVChannelLayout
already have functions for allocation/free/copy. I also think that
most of
the time it will not be used (e.g. if metadata is NULL, that can
mean no
metadata for all the channels).
If we can't decide what this should be, array of AVDictionaries, some
side-data like approach but in the channel layout, or a new dynamically
allocated AVChannelLayoutMetadata struct, then maybe just reserve a
void*
in the end of the AVChannelLayout, and we can work it out later.
How about a "const uint8_t *name" in AVChannelCustom? You can then
point to some string that will not be owned by the layout, nor
duplicated on copy, and that will be used by the helpers
(av_channel_layout_channel_from_string,
av_channel_layout_index_from_string, av_channel_layout_describe) to
identify the channel.
This avoids doing dynamic allocations per channel.
But this kind of limits the names to compile time string constants. I'd
rather not add something so limited.
You could attach it dynamically allocated strings too, and to prevent
the need for the module allocating them to outlive the layout, we could
add an opaque pointer to AVChannelLayout (not AVChannelCustom) and a
user set free() call back to pass that pointer to, on uninit().
Regards,
Marton
_______________________________________________
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".
_______________________________________________
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".