]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
core: Add VP9 passthrough support.
authorJoshua Colp <jcolp@digium.com>
Mon, 24 Jul 2017 18:30:59 +0000 (18:30 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 24 Jul 2017 18:46:28 +0000 (18:46 +0000)
This change adds VP9 as a known codec and creates a cached
"vp9" media format for use.

Change-Id: I025a93ed05cf96153d66f36db1839109cc24c5cc

CHANGES
channels/chan_pjsip.c
include/asterisk/format_cache.h
main/codec_builtin.c
main/format_cache.c
main/rtp_engine.c

diff --git a/CHANGES b/CHANGES
index c7d801d0e822b9a69e0ff86d97ca55b79395025e..6407d1359afcb8440668a4444d48a3826aea3060 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 --- 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
index e2fd13c297264df5d4167da9b9a1db26c38cf6af..c542e149d2a808a55a011495d0ec9e1badec2edc 100644 (file)
@@ -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 */
index ff03bb4aa0c4f134aff0197620bd4d89a9532ef7..d716cea6c6f44bbdc3bd7940f717bf79cb257029 100644 (file)
@@ -183,6 +183,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.
  */
index 5fdfa7e12bd4571cbbc6b15bc9a850362a3e074a..9ba33ee354cea4d0a8e4e298be0e166773a2cf87 100644 (file)
@@ -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);
index 74ebfe8d5be18125b27a96dd2d04f603b936ad61..00563e89973e92f08c3311b13ab2465bdeb3a753 100644 (file)
@@ -192,6 +192,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.
  */
@@ -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")) {
index 33770877cfe21f391ffad224d5fb34632aeacd2c..11c1b937df004000f52b67a7218b8f511f028526 100644 (file)
@@ -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);