diff options
author | Marton Balint <cus@passwd.hu> | 2016-12-26 01:19:34 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2017-01-24 23:51:36 +0100 |
commit | c4618f842a2de85097627763f02931afc3fde6d9 (patch) | |
tree | 3ce0700ff1dfa7f52726aa984558c04cc3e5209f /libavutil | |
parent | 5049f05f27c20f0606209bf3508e1157e0eabc9e (diff) | |
download | ffmpeg-streaming-c4618f842a2de85097627763f02931afc3fde6d9.zip ffmpeg-streaming-c4618f842a2de85097627763f02931afc3fde6d9.tar.gz |
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: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/channel_layout.c | 22 | ||||
-rw-r--r-- | libavutil/channel_layout.h | 14 | ||||
-rw-r--r-- | libavutil/version.h | 2 |
3 files changed, 37 insertions, 1 deletions
diff --git a/libavutil/channel_layout.c b/libavutil/channel_layout.c index 26c87c9..3bd5ee2 100644 --- a/libavutil/channel_layout.c +++ b/libavutil/channel_layout.c @@ -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) { diff --git a/libavutil/channel_layout.h b/libavutil/channel_layout.h index 38c3337..50bb8f0 100644 --- a/libavutil/channel_layout.h +++ b/libavutil/channel_layout.h @@ -142,6 +142,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. * diff --git a/libavutil/version.h b/libavutil/version.h index 2e83ef2..9d95086 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -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, \ |