diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 31b6a6e44eb23b5d64cf33f39731d55fa456d282..6853bd3b2e9d6a06fc22c868fc20d7810575c4c8 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -1658,6 +1658,7 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi 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 || + ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), ast_format_h265) != AST_FORMAT_CMP_NOT_EQUAL || (channel->session->endpoint->media.webrtc && ast_format_cap_iscompatible_format(ast_channel_nativeformats(ast), ast_format_h264) != AST_FORMAT_CMP_NOT_EQUAL)) { /* FIXME Fake RTP write, this will be sent as an RTCP packet. Ideally the diff --git a/doc/CHANGES-staging/h265-passthrough.txt b/doc/CHANGES-staging/h265-passthrough.txt new file mode 100644 index 0000000000000000000000000000000000000000..b2c449a81b4b4961c1e6bb503f791638865545d5 --- /dev/null +++ b/doc/CHANGES-staging/h265-passthrough.txt @@ -0,0 +1,6 @@ +Subject: Core + +H.265/HEVC is now a supported video codec and it can be used by +specifying "h265" in the allow line. +Please note however, that handling of the additional SDP parameters +described in RFC 7798 section 7.2 is not yet supported. diff --git a/include/asterisk/format_cache.h b/include/asterisk/format_cache.h index 067546310ff58164090008d5dc662d406d7f9dcf..5a2add69842c8a2b32e549bfca9cfee20be27cf3 100644 --- a/include/asterisk/format_cache.h +++ b/include/asterisk/format_cache.h @@ -173,6 +173,11 @@ extern struct ast_format *ast_format_h263p; */ extern struct ast_format *ast_format_h264; +/*! + * \brief Built-in cached h265 format. + */ +extern struct ast_format *ast_format_h265; + /*! * \brief Built-in cached mp4 format. */ diff --git a/main/codec_builtin.c b/main/codec_builtin.c index 25aa51384b501f55e7d8e909a4dc24e07203012a..ce65754fe449b5d50c8730a30a8e94cb5afee632 100644 --- a/main/codec_builtin.c +++ b/main/codec_builtin.c @@ -806,6 +806,13 @@ static struct ast_codec h264 = { .sample_rate = 1000, }; +static struct ast_codec h265 = { + .name = "h265", + .description = "H.265 video", + .type = AST_MEDIA_TYPE_VIDEO, + .sample_rate = 1000, +}; + static struct ast_codec mpeg4 = { .name = "mpeg4", .description = "MPEG4 video", @@ -971,6 +978,7 @@ int ast_codec_builtin_init(void) res |= CODEC_REGISTER_AND_CACHE(h263); res |= CODEC_REGISTER_AND_CACHE(h263p); res |= CODEC_REGISTER_AND_CACHE(h264); + res |= CODEC_REGISTER_AND_CACHE(h265); res |= CODEC_REGISTER_AND_CACHE(mpeg4); res |= CODEC_REGISTER_AND_CACHE(vp8); res |= CODEC_REGISTER_AND_CACHE(vp9); diff --git a/main/format_cache.c b/main/format_cache.c index 95ad5ea5dbd53af0b80ba3d7fab6c233e031da16..fbe659f9604a98d37d6b6f98444200b1dc20e347 100644 --- a/main/format_cache.c +++ b/main/format_cache.c @@ -180,6 +180,11 @@ struct ast_format *ast_format_h263p; */ struct ast_format *ast_format_h264; +/*! + * \brief Built-in cached h265 format. + */ +struct ast_format *ast_format_h265; + /*! * \brief Built-in cached mp4 format. */ @@ -348,6 +353,7 @@ static void format_cache_shutdown(void) ao2_replace(ast_format_h263, NULL); ao2_replace(ast_format_h263p, NULL); ao2_replace(ast_format_h264, NULL); + ao2_replace(ast_format_h265, NULL); ao2_replace(ast_format_mp4, NULL); ao2_replace(ast_format_vp8, NULL); ao2_replace(ast_format_vp9, NULL); @@ -446,6 +452,8 @@ static void set_cached_format(const char *name, struct ast_format *format) ao2_replace(ast_format_h263p, format); } else if (!strcmp(name, "h264")) { ao2_replace(ast_format_h264, format); + } else if (!strcmp(name, "h265")) { + ao2_replace(ast_format_h265, format); } else if (!strcmp(name, "mpeg4")) { ao2_replace(ast_format_mp4, format); } else if (!strcmp(name, "vp8")) { diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 3403d709c33e9c08fb843d3fba79dff75a3325a7..ac429ca233cbc54dd467233c4a08524fd825c01d 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -3611,6 +3611,7 @@ int ast_rtp_engine_init(void) set_next_mime_type(ast_format_h263, 0, "video", "H263", 90000); set_next_mime_type(ast_format_h263p, 0, "video", "h263-1998", 90000); set_next_mime_type(ast_format_h264, 0, "video", "H264", 90000); + set_next_mime_type(ast_format_h265, 0, "video", "H265", 90000); set_next_mime_type(ast_format_mp4, 0, "video", "MP4V-ES", 90000); set_next_mime_type(ast_format_t140_red, 0, "text", "RED", 1000); set_next_mime_type(ast_format_t140, 0, "text", "T140", 1000); @@ -3662,6 +3663,7 @@ int ast_rtp_engine_init(void) add_static_payload(106, ast_format_t140, 0); /* Real time text chat */ add_static_payload(107, ast_format_opus, 0); add_static_payload(108, ast_format_vp9, 0); + add_static_payload(109, ast_format_h265, 0); add_static_payload(110, ast_format_speex, 0); add_static_payload(111, ast_format_g726, 0);