From 188d3b2245b49f21468840386d81b080176b434b Mon Sep 17 00:00:00 2001 From: "andresp@webrtc.org" Date: Fri, 7 Nov 2014 13:21:04 +0000 Subject: [PATCH] Enable VP9 video codec support on webrtcvideoengine behind a field trial. BUG=chromium:431285 R=pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/27929004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7663 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/media/webrtc/constants.h | 1 + talk/media/webrtc/webrtcvideoengine.cc | 12 ++++++++++++ talk/media/webrtc/webrtcvideoengine2.cc | 14 ++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/talk/media/webrtc/constants.h b/talk/media/webrtc/constants.h index 821a41f20..f07dfa752 100755 --- a/talk/media/webrtc/constants.h +++ b/talk/media/webrtc/constants.h @@ -33,6 +33,7 @@ extern const int kVideoMtu; extern const int kVideoRtpBufferSize; extern const char kVp8CodecName[]; +extern const char kVp9CodecName[]; extern const char kH264CodecName[]; extern const int kDefaultVideoMaxWidth; diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index 46d316f8f..88acc3f5a 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -64,6 +64,7 @@ #include "webrtc/base/timeutils.h" #include "webrtc/experiments.h" #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" +#include "webrtc/system_wrappers/interface/field_trial.h" namespace { @@ -106,6 +107,7 @@ const int kVideoMtu = 1200; const int kVideoRtpBufferSize = 65536; const char kVp8CodecName[] = "VP8"; +const char kVp9CodecName[] = "VP9"; // TODO(ronghuawu): Change to 640x360. const int kDefaultVideoMaxWidth = 640; @@ -221,11 +223,21 @@ bool CodecIsInternallySupported(const std::string& codec_name) { if (CodecNameMatches(codec_name, kVp8CodecName)) { return true; } + if (CodecNameMatches(codec_name, kVp9CodecName)) { + const std::string group_name = + webrtc::field_trial::FindFullName("WebRTC-SupportVP9"); + return group_name == "Enabled" || group_name == "EnabledByFlag"; + } return false; } std::vector DefaultVideoCodecList() { std::vector codecs; + if (CodecIsInternallySupported(kVp9CodecName)) { + codecs.push_back( + MakeVideoCodecWithDefaultFeedbackParams(101, kVp9CodecName)); + // TODO(andresp): Add rtx codec for vp9 and verify it works. + } codecs.push_back(MakeVideoCodecWithDefaultFeedbackParams(100, kVp8CodecName)); codecs.push_back(MakeRtxCodec(96, 100)); codecs.push_back(MakeVideoCodec(116, kRedCodecName)); diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc index 5b5f12ec6..8a1bad05d 100644 --- a/talk/media/webrtc/webrtcvideoengine2.cc +++ b/talk/media/webrtc/webrtcvideoengine2.cc @@ -230,6 +230,12 @@ void* WebRtcVideoEncoderFactory2::CreateVideoEncoderSettings( options.video_noise_reduction.Get(&settings->denoisingOn); return settings; } + if (CodecNameMatches(codec.name, kVp9CodecName)) { + webrtc::VideoCodecVP9* settings = new webrtc::VideoCodecVP9( + webrtc::VideoEncoder::GetDefaultVp9Settings()); + options.video_noise_reduction.Get(&settings->denoisingOn); + return settings; + } return NULL; } @@ -242,6 +248,9 @@ void WebRtcVideoEncoderFactory2::DestroyVideoEncoderSettings( if (CodecNameMatches(codec.name, kVp8CodecName)) { delete reinterpret_cast(encoder_settings); } + if (CodecNameMatches(codec.name, kVp9CodecName)) { + delete reinterpret_cast(encoder_settings); + } } DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler() @@ -1604,6 +1613,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { if (CodecNameMatches(name, kVp8CodecName)) { return webrtc::kVideoCodecVP8; + } else if (CodecNameMatches(name, kVp9CodecName)) { + return webrtc::kVideoCodecVP9; } else if (CodecNameMatches(name, kH264CodecName)) { return webrtc::kVideoCodecH264; } @@ -1631,6 +1642,9 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder( if (type == webrtc::kVideoCodecVP8) { return AllocatedEncoder( webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp8), type, false); + } else if (type == webrtc::kVideoCodecVP9) { + return AllocatedEncoder( + webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp9), type, false); } // This shouldn't happen, we should not be trying to create something we don't