summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrahaase <fra.haase@googlemail.com>2016-11-06 12:40:14 +0100
committerfrahaase <fra.haase@googlemail.com>2016-11-06 15:56:58 +0100
commitb2b5f9d897d1534f366b1b96fb10ad1de4f9ba5d (patch)
tree88fab2e74612cd3fdae87dd9b15008b5cb84c6f1
parentbf01ff53f8d93d637981720331405e56f0b3b118 (diff)
ast_format: Adds an identifier for interleaved audio formats to the ast_format
Adds an identifier (with a getter and setter) to detect channels with interleaved audio. This is needed by the binaural bridge_softmix patch (ASTERISK-26292) and was already discussed here: http://lists.digium.com/pipermail/asterisk-dev/2016-October/075900.html The identifier can be set during fmtp parsing (to be seen in the res_format_attr_opus.c change). ASTERISK-26292 Change-Id: I359801cc5f98c35671c48dabc81a7f4ee1183d63
-rw-r--r--include/asterisk/format.h18
-rw-r--r--main/format.c13
-rw-r--r--res/res_format_attr_opus.c8
3 files changed, 39 insertions, 0 deletions
diff --git a/include/asterisk/format.h b/include/asterisk/format.h
index a5ca03818..b01592d16 100644
--- a/include/asterisk/format.h
+++ b/include/asterisk/format.h
@@ -299,6 +299,24 @@ void ast_format_set_attribute_data(struct ast_format *format, void *attribute_da
const char *ast_format_get_name(const struct ast_format *format);
/*!
+ * \brief Get the channel count on a format
+ *
+ * \param The media format
+ *
+ * \return Currently set channel count
+ */
+unsigned int ast_format_get_channel_count(const struct ast_format *format);
+
+/*!
+ * \brief Set the channel count on a format
+ *
+ * \param format The media format
+ * \param channel_count The number of audio channels used
+ *
+ */
+void ast_format_set_channel_count(struct ast_format *format, unsigned int channel_count);
+
+/*!
* \brief Get the codec associated with a format
*
* \param format The media format
diff --git a/main/format.c b/main/format.c
index b5e577913..5ae5ad986 100644
--- a/main/format.c
+++ b/main/format.c
@@ -49,6 +49,8 @@ struct ast_format {
void *attribute_data;
/*! \brief Pointer to the optional format interface */
const struct ast_format_interface *interface;
+ /*! \brief The number if audio channels used, if more than one an interleaved format is required */
+ unsigned int channel_count;
};
/*! \brief Structure used when registering a format interface */
@@ -175,6 +177,16 @@ void ast_format_set_attribute_data(struct ast_format *format, void *attribute_da
format->attribute_data = attribute_data;
}
+unsigned int ast_format_get_channel_count(const struct ast_format *format)
+{
+ return format->channel_count;
+}
+
+void ast_format_set_channel_count(struct ast_format *format, unsigned int channel_count)
+{
+ format->channel_count = channel_count;
+}
+
/*! \brief Destructor for media formats */
static void format_destroy(void *obj)
{
@@ -199,6 +211,7 @@ struct ast_format *ast_format_create_named(const char *format_name, struct ast_c
}
format->name = format_name;
format->codec = ao2_bump(codec);
+ format->channel_count = 1;
format_interface = ao2_find(interfaces, codec->name, OBJ_SEARCH_KEY);
if (format_interface) {
diff --git a/res/res_format_attr_opus.c b/res/res_format_attr_opus.c
index a3e48e3de..ad17dfb24 100644
--- a/res/res_format_attr_opus.c
+++ b/res/res_format_attr_opus.c
@@ -94,6 +94,7 @@ static int opus_clone(const struct ast_format *src, struct ast_format *dst)
ao2_bump(attr->data);
ast_format_set_attribute_data(dst, attr);
+ ast_format_set_channel_count(dst, ast_format_get_channel_count(src));
return 0;
}
@@ -145,6 +146,9 @@ static struct ast_format *opus_parse_sdp_fmtp(const struct ast_format *format, c
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_PTIME, &attr->ptime);
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_MAX_AVERAGE_BITRATE, &attr->maxbitrate);
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_STEREO, &attr->stereo);
+ if (attr->stereo) {
+ ast_format_set_channel_count(cloned, 2);
+ }
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_SPROP_STEREO, &attr->spropstereo);
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_CBR, &attr->cbr);
sdp_fmtp_get(attributes, CODEC_OPUS_ATTR_FEC, &attr->fec);
@@ -236,6 +240,10 @@ static struct ast_format *opus_getjoint(const struct ast_format *format1, const
if (!jointformat) {
return NULL;
}
+
+ if (ast_format_get_channel_count(format1) == 2 || ast_format_get_channel_count(format2) == 2) {
+ ast_format_set_channel_count(jointformat, 2);
+ }
attr_res = ast_format_get_attribute_data(jointformat);
attr_res->dtx = attr1->dtx || attr2->dtx ? 1 : 0;