summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-07-24 18:30:59 +0000
committerJoshua Colp <jcolp@digium.com>2017-07-24 18:46:28 +0000
commit24bb5a89089caca8e16989bab7458617b91e4ef4 (patch)
treea3ff6b0fde8a84cbd901f732cab380739740b8fd
parent07f8e45a90d768efcc32a4e4f392162912c86f0f (diff)
core: Add VP9 passthrough support.
This change adds VP9 as a known codec and creates a cached "vp9" media format for use. Change-Id: I025a93ed05cf96153d66f36db1839109cc24c5cc
-rw-r--r--CHANGES5
-rw-r--r--channels/chan_pjsip.c3
-rw-r--r--include/asterisk/format_cache.h5
-rw-r--r--main/codec_builtin.c8
-rw-r--r--main/format_cache.c8
-rw-r--r--main/rtp_engine.c5
6 files changed, 32 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index c7d801d0e..6407d1359 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,11 @@
--- Functionality changes from Asterisk 13.17.0 to Asterisk 13.18.0 ----------
------------------------------------------------------------------------------
+Core
+------------------
+ * VP9 is now a supported passthrough video codec and it can be used by
+ specifying "vp9" in the allow line.
+
res_musiconhold
------------------
* By default, when res_musiconhold reloads or unloads, it sends a HUP signal
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index e2fd13c29..c542e149d 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1376,7 +1376,8 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
/* FIXME: Only use this for VP8. Additional work would have to be done to
* fully support other video codecs */
- if (ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), ast_format_vp8) != AST_FORMAT_CMP_NOT_EQUAL) {
+ if (ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), ast_format_vp8) != AST_FORMAT_CMP_NOT_EQUAL ||
+ ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), ast_format_vp9) != AST_FORMAT_CMP_NOT_EQUAL) {
/* FIXME Fake RTP write, this will be sent as an RTCP packet. Ideally the
* RTP engine would provide a way to externally write/schedule RTCP
* packets */
diff --git a/include/asterisk/format_cache.h b/include/asterisk/format_cache.h
index ff03bb4aa..d716cea6c 100644
--- a/include/asterisk/format_cache.h
+++ b/include/asterisk/format_cache.h
@@ -184,6 +184,11 @@ extern struct ast_format *ast_format_mp4;
extern struct ast_format *ast_format_vp8;
/*!
+ * \brief Built-in cached vp9 format.
+ */
+extern struct ast_format *ast_format_vp9;
+
+/*!
* \brief Built-in cached jpeg format.
*/
extern struct ast_format *ast_format_jpeg;
diff --git a/main/codec_builtin.c b/main/codec_builtin.c
index 5fdfa7e12..9ba33ee35 100644
--- a/main/codec_builtin.c
+++ b/main/codec_builtin.c
@@ -783,6 +783,13 @@ static struct ast_codec vp8 = {
.sample_rate = 1000,
};
+static struct ast_codec vp9 = {
+ .name = "vp9",
+ .description = "VP9 video",
+ .type = AST_MEDIA_TYPE_VIDEO,
+ .sample_rate = 1000,
+};
+
static struct ast_codec t140red = {
.name = "red",
.description = "T.140 Realtime Text with redundancy",
@@ -922,6 +929,7 @@ int ast_codec_builtin_init(void)
res |= CODEC_REGISTER_AND_CACHE(h264);
res |= CODEC_REGISTER_AND_CACHE(mpeg4);
res |= CODEC_REGISTER_AND_CACHE(vp8);
+ res |= CODEC_REGISTER_AND_CACHE(vp9);
res |= CODEC_REGISTER_AND_CACHE(t140red);
res |= CODEC_REGISTER_AND_CACHE(t140);
res |= CODEC_REGISTER_AND_CACHE(none);
diff --git a/main/format_cache.c b/main/format_cache.c
index 74ebfe8d5..00563e899 100644
--- a/main/format_cache.c
+++ b/main/format_cache.c
@@ -193,6 +193,11 @@ struct ast_format *ast_format_mp4;
struct ast_format *ast_format_vp8;
/*!
+ * \brief Built-in cached vp9 format.
+ */
+struct ast_format *ast_format_vp9;
+
+/*!
* \brief Built-in cached jpeg format.
*/
struct ast_format *ast_format_jpeg;
@@ -336,6 +341,7 @@ static void format_cache_shutdown(void)
ao2_replace(ast_format_h264, NULL);
ao2_replace(ast_format_mp4, NULL);
ao2_replace(ast_format_vp8, NULL);
+ ao2_replace(ast_format_vp9, NULL);
ao2_replace(ast_format_t140_red, NULL);
ao2_replace(ast_format_t140, NULL);
ao2_replace(ast_format_none, NULL);
@@ -432,6 +438,8 @@ static void set_cached_format(const char *name, struct ast_format *format)
ao2_replace(ast_format_mp4, format);
} else if (!strcmp(name, "vp8")) {
ao2_replace(ast_format_vp8, format);
+ } else if (!strcmp(name, "vp9")) {
+ ao2_replace(ast_format_vp9, format);
} else if (!strcmp(name, "red")) {
ao2_replace(ast_format_t140_red, format);
} else if (!strcmp(name, "t140")) {
diff --git a/main/rtp_engine.c b/main/rtp_engine.c
index 33770877c..11c1b937d 100644
--- a/main/rtp_engine.c
+++ b/main/rtp_engine.c
@@ -2695,9 +2695,10 @@ int ast_rtp_engine_init(void)
set_next_mime_type(ast_format_siren7, 0, "audio", "G7221", 16000);
set_next_mime_type(ast_format_siren14, 0, "audio", "G7221", 32000);
set_next_mime_type(ast_format_g719, 0, "audio", "G719", 48000);
- /* Opus and VP8 */
+ /* Opus, VP8, and VP9 */
set_next_mime_type(ast_format_opus, 0, "audio", "opus", 48000);
set_next_mime_type(ast_format_vp8, 0, "video", "VP8", 90000);
+ set_next_mime_type(ast_format_vp9, 0, "video", "VP9", 90000);
/* Define the static rtp payload mappings */
add_static_payload(0, ast_format_ulaw, 0);
@@ -2730,6 +2731,8 @@ int ast_rtp_engine_init(void)
add_static_payload(104, ast_format_mp4, 0);
add_static_payload(105, ast_format_t140_red, 0); /* Real time text chat (with redundancy encoding) */
add_static_payload(106, ast_format_t140, 0); /* Real time text chat */
+ add_static_payload(108, ast_format_vp9, 0);
+
add_static_payload(110, ast_format_speex, 0);
add_static_payload(111, ast_format_g726, 0);
add_static_payload(112, ast_format_g726_aal2, 0);