diff mbox

[FFmpeg-devel,2/3] avutil/channel_layout: add av_get_extended_channel_layout

Message ID 20161226171434.935-2-cus@passwd.hu
State Accepted
Headers show

Commit Message

Marton Balint Dec. 26, 2016, 5:14 p.m. UTC
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>
---
 doc/APIchanges             |  3 +++
 doc/utils.texi             |  7 ++++++-
 libavutil/channel_layout.c | 22 ++++++++++++++++++++++
 libavutil/channel_layout.h | 14 ++++++++++++++
 libavutil/version.h        |  2 +-
 5 files changed, 46 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer Dec. 31, 2016, 4 p.m. UTC | #1
On Mon, Dec 26, 2016 at 06:14:33PM +0100, Marton Balint wrote:
> 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>
> ---
>  doc/APIchanges             |  3 +++
>  doc/utils.texi             |  7 ++++++-
>  libavutil/channel_layout.c | 22 ++++++++++++++++++++++
>  libavutil/channel_layout.h | 14 ++++++++++++++
>  libavutil/version.h        |  2 +-
>  5 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index fbeae7a..4c8123e 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2015-08-28
>  
>  API changes, most recent first:
>  
> +2016-xx-xx - xxxxxxx - lavu xx.xx.100 - channel_layout.h
> +  Add av_get_extended_channel_layout()
> +
>  2016-12-10 - xxxxxxx - lavu xx.xx.100- imgutils.h
>    Add av_image_check_size2()
>  
> diff --git a/doc/utils.texi b/doc/utils.texi
> index df887c7..a66532a 100644
> --- a/doc/utils.texi
> +++ b/doc/utils.texi
> @@ -725,13 +725,18 @@ layout for that number of channels (see the function
>  default layout.
>  
>  @item
> +a number of channels, in decimal, followed by 'C', yielding an unkown channel

"unkown" common typo

also what do people think about checking for common typos in fate-src ?
i suggested this previously and response was not to positive IIRC
but really it should be less work for all if fate straight tells about
common typos instead of wasting using review for this

[...]
diff mbox

Patch

diff --git a/doc/APIchanges b/doc/APIchanges
index fbeae7a..4c8123e 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@  libavutil:     2015-08-28
 
 API changes, most recent first:
 
+2016-xx-xx - xxxxxxx - lavu xx.xx.100 - channel_layout.h
+  Add av_get_extended_channel_layout()
+
 2016-12-10 - xxxxxxx - lavu xx.xx.100- imgutils.h
   Add av_image_check_size2()
 
diff --git a/doc/utils.texi b/doc/utils.texi
index df887c7..a66532a 100644
--- a/doc/utils.texi
+++ b/doc/utils.texi
@@ -725,13 +725,18 @@  layout for that number of channels (see the function
 default layout.
 
 @item
+a number of channels, in decimal, followed by 'C', yielding an unkown 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}.
 @end itemize
 
 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}.
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..50bb8f03 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 9f8c4c2..2e83ef2 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@ 
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  43
+#define LIBAVUTIL_VERSION_MINOR  44
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \