avutil/channel_layout: add av_get_extended_channel_layout
authorMarton Balint <cus@passwd.hu>
Mon, 26 Dec 2016 00:19:34 +0000 (01:19 +0100)
committerMarton Balint <cus@passwd.hu>
Tue, 24 Jan 2017 22:51:36 +0000 (23:51 +0100)
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
doc/utils.texi
libavutil/channel_layout.c
libavutil/channel_layout.h
libavutil/version.h

index f5f7e0c..109d550 100644 (file)
@@ -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().
 
index df887c7..30a962a 100644 (file)
@@ -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 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}.
 @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}.
index 26c87c9..3bd5ee2 100644 (file)
@@ -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)
 {
index 38c3337..50bb8f0 100644 (file)
@@ -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.
  *
index 2e83ef2..9d95086 100644 (file)
@@ -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, \