Commit c4618f84 authored by Marton Balint's avatar Marton Balint

avutil/channel_layout: add av_get_extended_channel_layout

Return a channel layout and the number of channels based on the specified name.

This function is similar to av_get_channel_layout(), but can also parse unknown
channel layout specifications.

Unknown channel layout specifications are a decimal number and a capital 'C'
suffix, in order to not break compatibility with the lowercase 'c' suffix,
which is used for a guessed channel layout with the specified number of
channels.
Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent 5049f05f
......@@ -15,6 +15,9 @@ libavutil: 2015-08-28
API changes, most recent first:
2017-01-24 - xxxxxxx - lavu 55.45.100 - channel_layout.h
Add av_get_extended_channel_layout()
2017-01-22 - xxxxxxx - lavu 55.44.100 - lfg.h
Add av_lfg_init_from_data().
......
......@@ -724,6 +724,11 @@ layout for that number of channels (see the function
@code{av_get_default_channel_layout}). Note that not all channel counts have a
default layout.
@item
a number of channels, in decimal, followed by 'C', yielding an unknown channel
layout with the specified number of channels. Note that not all channel layout
specification strings support unknown channel layouts.
@item
a channel layout mask, in hexadecimal starting with "0x" (see the
@code{AV_CH_*} macros in @file{libavutil/channel_layout.h}.
......@@ -731,7 +736,7 @@ a channel layout mask, in hexadecimal starting with "0x" (see the
Before libavutil version 53 the trailing character "c" to specify a number of
channels was optional, but now it is required, while a channel layout mask can
also be specified as a decimal number (if and only if not followed by "c").
also be specified as a decimal number (if and only if not followed by "c" or "C").
See also the function @code{av_get_channel_layout} defined in
@file{libavutil/channel_layout.h}.
......
......@@ -152,6 +152,28 @@ uint64_t av_get_channel_layout(const char *name)
return layout;
}
int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels)
{
int nb = 0;
char *end;
uint64_t layout = av_get_channel_layout(name);
if (layout) {
*channel_layout = layout;
*nb_channels = av_get_channel_layout_nb_channels(layout);
return 0;
}
nb = strtol(name, &end, 10);
if (!errno && *end == 'C' && *(end + 1) == '\0' && nb > 0 && nb < 64) {
*channel_layout = 0;
*nb_channels = nb;
return 0;
}
return AVERROR(EINVAL);
}
void av_bprint_channel_layout(struct AVBPrint *bp,
int nb_channels, uint64_t channel_layout)
{
......
......@@ -141,6 +141,20 @@ enum AVMatrixEncoding {
*/
uint64_t av_get_channel_layout(const char *name);
/**
* Return a channel layout and the number of channels based on the specified name.
*
* This function is similar to (@see av_get_channel_layout), but can also parse
* unknown channel layout specifications.
*
* @param[in] name channel layout specification string
* @param[out] channel_layout parsed channel layout (0 if unknown)
* @param[out] nb_channels number of channels
*
* @return 0 on success, AVERROR(EINVAL) if the parsing fails.
*/
int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels);
/**
* Return a description of a channel layout.
* If nb_channels is <= 0, it is guessed from the channel_layout.
......
......@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 44
#define LIBAVUTIL_VERSION_MINOR 45
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment