From 00a74cff8f503e4ea1ddd8e4a10028ffa6204f3d Mon Sep 17 00:00:00 2001 From: Randell Jesup Date: Tue, 3 Mar 2015 01:31:33 -0500 Subject: [PATCH] Bug 1137472: Basic VP9 signaling/pipeline/conduit support r=bwc --- .../webrtc/signaling/src/jsep/JsepCodecDescription.h | 6 ++++-- media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp | 10 ++++++++++ .../signaling/src/media-conduit/VideoConduit.cpp | 3 +++ .../src/peerconnection/MediaPipelineFactory.cpp | 2 +- .../src/peerconnection/PeerConnectionImpl.cpp | 11 ++++++++++- media/webrtc/signaling/src/sdp/SdpAttribute.h | 1 + .../signaling/src/sdp/SipccSdpAttributeList.cpp | 3 +++ .../webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp | 2 ++ media/webrtc/signaling/src/sdp/sipcc/ccsdp.c | 1 + media/webrtc/signaling/src/sdp/sipcc/ccsdp.h | 1 + media/webrtc/signaling/src/sdp/sipcc/sdp_access.c | 4 ++++ 11 files changed, 40 insertions(+), 4 deletions(-) diff --git a/media/webrtc/signaling/src/jsep/JsepCodecDescription.h b/media/webrtc/signaling/src/jsep/JsepCodecDescription.h index 72649a334d5b..9632bccf1768 100644 --- a/media/webrtc/signaling/src/jsep/JsepCodecDescription.h +++ b/media/webrtc/signaling/src/jsep/JsepCodecDescription.h @@ -291,7 +291,8 @@ struct JsepVideoCodecDescription : public JsepCodecDescription { mSpropParameterSets.c_str(), sizeof(params->sprop_parameter_sets) - 1); fmtp.PushEntry(mDefaultPt, "", mozilla::Move(params)); - } else if (mName == "VP8") { + } else if (mName == "VP8" || mName == "VP9") { + // VP8 and VP9 share the same SDP parameters thus far UniquePtr params = MakeUnique(); @@ -319,10 +320,11 @@ struct JsepVideoCodecDescription : public JsepCodecDescription { case SdpRtpmapAttributeList::kH264: LoadH264Parameters(params); break; + case SdpRtpmapAttributeList::kVP9: + // VP8 and VP9 share the same SDP parameters thus far case SdpRtpmapAttributeList::kVP8: LoadVP8Parameters(params); break; - case SdpRtpmapAttributeList::kVP9: case SdpRtpmapAttributeList::kiLBC: case SdpRtpmapAttributeList::kiSAC: case SdpRtpmapAttributeList::kOpus: diff --git a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp index 9c580abd1910..d7a76241cc6b 100644 --- a/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp +++ b/media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp @@ -2348,6 +2348,16 @@ JsepSessionImpl::SetupDefaultCodecs() vp8->mMaxFr = 60; mCodecs.push_back(vp8); + JsepVideoCodecDescription* vp9 = new JsepVideoCodecDescription( + "121", + "VP9", + 90000 + ); + // Defaults for mandatory params + vp9->mMaxFs = 12288; + vp9->mMaxFr = 60; + mCodecs.push_back(vp9); + JsepVideoCodecDescription* h264_1 = new JsepVideoCodecDescription( "126", "H264", diff --git a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp index 4f7227315b96..fc2ab653bb64 100755 --- a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp +++ b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp @@ -1362,6 +1362,9 @@ WebrtcVideoConduit::CodecConfigToWebRTCCodec(const VideoCodecConfig* codecInfo, } else if (codecInfo->mName == "VP8") { cinst.codecType = webrtc::kVideoCodecVP8; PL_strncpyz(cinst.plName, "VP8", sizeof(cinst.plName)); + } else if (codecInfo->mName == "VP9") { + cinst.codecType = webrtc::kVideoCodecVP9; + PL_strncpyz(cinst.plName, "VP9", sizeof(cinst.plName)); } else if (codecInfo->mName == "I420") { cinst.codecType = webrtc::kVideoCodecI420; PL_strncpyz(cinst.plName, "I420", sizeof(cinst.plName)); diff --git a/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp b/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp index f0552a55ce8c..b8e3a8d577d1 100644 --- a/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp +++ b/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp @@ -785,7 +785,7 @@ MediaPipelineFactory::EnsureExternalCodec(VideoSessionConduit& aConduit, VideoCodecConfig* aConfig, bool aIsSend) { - if (aConfig->mName == "VP8") { + if (aConfig->mName == "VP8" || aConfig->mName == "VP9") { return kMediaConduitNoError; } else if (aConfig->mName == "H264") { // Register H.264 codec. diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp index ef66fd483816..bd74f0dafc8e 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp @@ -903,6 +903,10 @@ PeerConnectionImpl::ConfigureJsepSessionCodecs() { bool h264Enabled = hardwareH264Supported || softwareH264Enabled; + bool vp9Enabled = false; + branch->GetBoolPref("media.peerconnection.video.vp9_enabled", + &vp9Enabled); + auto& codecs = mJsepSession->Codecs(); // We use this to sort the list of codecs once everything is configured @@ -952,7 +956,11 @@ PeerConnectionImpl::ConfigureJsepSessionCodecs() { if (hardwareH264Supported) { comparator.AddHardwareCodec(videoCodec.mDefaultPt); } - } else if (codec.mName == "VP8") { + } else if (codec.mName == "VP8" || codec.mName == "VP9") { + if (videoCodec.mName == "VP9" && !vp9Enabled) { + videoCodec.mEnabled = false; + break; + } int32_t maxFs = 0; branch->GetIntPref("media.navigator.video.max_fs", &maxFs); if (maxFs <= 0) { @@ -966,6 +974,7 @@ PeerConnectionImpl::ConfigureJsepSessionCodecs() { maxFr = 60; // We must specify something other than 0 } videoCodec.mMaxFr = maxFr; + } } break; diff --git a/media/webrtc/signaling/src/sdp/SdpAttribute.h b/media/webrtc/signaling/src/sdp/SdpAttribute.h index b6bcab77c768..df13f20c361c 100644 --- a/media/webrtc/signaling/src/sdp/SdpAttribute.h +++ b/media/webrtc/signaling/src/sdp/SdpAttribute.h @@ -1014,6 +1014,7 @@ public: unsigned int max_br; }; + // Also used for VP9 since they share parameters class VP8Parameters : public Parameters { public: diff --git a/media/webrtc/signaling/src/sdp/SipccSdpAttributeList.cpp b/media/webrtc/signaling/src/sdp/SipccSdpAttributeList.cpp index 91a3d2e283e9..12b12f50ed45 100644 --- a/media/webrtc/signaling/src/sdp/SipccSdpAttributeList.cpp +++ b/media/webrtc/signaling/src/sdp/SipccSdpAttributeList.cpp @@ -359,6 +359,8 @@ SipccSdpAttributeList::GetCodecType(rtp_ptype type) return SdpRtpmapAttributeList::kOpus; case RTP_VP8: return SdpRtpmapAttributeList::kVP8; + case RTP_VP9: + return SdpRtpmapAttributeList::kVP9; case RTP_NONE: // Happens when sipcc doesn't know how to translate to the enum case RTP_CELP: @@ -645,6 +647,7 @@ SipccSdpAttributeList::LoadFmtp(sdp_t* sdp, uint16_t level) parameters.reset(h264Parameters); } break; + case RTP_VP9: case RTP_VP8: { SdpFmtpAttributeList::VP8Parameters* vp8Parameters( new SdpFmtpAttributeList::VP8Parameters); diff --git a/media/webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp b/media/webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp index f7898115180d..b9c5c8ff07ed 100644 --- a/media/webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp +++ b/media/webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp @@ -282,6 +282,8 @@ SipccSdpMediaSection::AddCodec(const std::string& pt, const std::string& name, codec = SdpRtpmapAttributeList::kPCMA; } else if (name == "VP8") { codec = SdpRtpmapAttributeList::kVP8; + } else if (name == "VP9") { + codec = SdpRtpmapAttributeList::kVP9; } else if (name == "H264") { codec = SdpRtpmapAttributeList::kH264; } diff --git a/media/webrtc/signaling/src/sdp/sipcc/ccsdp.c b/media/webrtc/signaling/src/sdp/sipcc/ccsdp.c index ae5ed5cfbfa4..2a11d81ae8da 100644 --- a/media/webrtc/signaling/src/sdp/sipcc/ccsdp.c +++ b/media/webrtc/signaling/src/sdp/sipcc/ccsdp.c @@ -326,6 +326,7 @@ const char * ccsdpCodecName(rtp_ptype ptype) case RTP_ILBC: return "iLBC"; case RTP_OPUS: return "OPUS"; case RTP_VP8: return "VP8"; + case RTP_VP9: return "VP9"; case RTP_I420: return "I420"; /* case RTP_ISAC: return "ISAC"; */ } diff --git a/media/webrtc/signaling/src/sdp/sipcc/ccsdp.h b/media/webrtc/signaling/src/sdp/sipcc/ccsdp.h index 3455d0e90b1f..2bcccce09b8c 100644 --- a/media/webrtc/signaling/src/sdp/sipcc/ccsdp.h +++ b/media/webrtc/signaling/src/sdp/sipcc/ccsdp.h @@ -80,6 +80,7 @@ typedef enum rtp_ptype_ RTP_ILBC = 116, /* used only to make an offer */ RTP_OPUS = 109, RTP_VP8 = 120, + RTP_VP9 = 121, RTP_I420 = 124, RTP_ISAC = 124 } rtp_ptype; diff --git a/media/webrtc/signaling/src/sdp/sipcc/sdp_access.c b/media/webrtc/signaling/src/sdp/sipcc/sdp_access.c index ca763f4ebb41..ae770e04b383 100644 --- a/media/webrtc/signaling/src/sdp/sipcc/sdp_access.c +++ b/media/webrtc/signaling/src/sdp/sipcc/sdp_access.c @@ -25,6 +25,7 @@ static const char* logTag = "sdp_access"; #define SIPSDP_ATTR_ENCNAME_H263v2 "H263-1998" #define SIPSDP_ATTR_ENCNAME_H264 "H264" #define SIPSDP_ATTR_ENCNAME_VP8 "VP8" +#define SIPSDP_ATTR_ENCNAME_VP9 "VP9" #define SIPSDP_ATTR_ENCNAME_L16_256K "L16" #define SIPSDP_ATTR_ENCNAME_ISAC "ISAC" #define SIPSDP_ATTR_ENCNAME_OPUS "opus" @@ -1798,6 +1799,9 @@ rtp_ptype sdp_get_known_payload_type(void *sdp_ptr, if (cpr_strcasecmp(encname, SIPSDP_ATTR_ENCNAME_VP8) == 0) { return (RTP_VP8); } + if (cpr_strcasecmp(encname, SIPSDP_ATTR_ENCNAME_VP9) == 0) { + return (RTP_VP9); + } } } }