Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1118)

Unified Diff: webrtc/media/engine/webrtcvideoengine2.cc

Issue 2088233004: Add RTX codecs for codecs only supported by external encoder. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removing now-unused constant. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/media/engine/webrtcvideoengine2.cc
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index 005cb68f9b2477a13d15d688e544000e8ef5bdd3..5da8e33e1e0d784ab4e5b879a1b19cb5cc2fbeb8 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -342,17 +342,37 @@ static const int kDefaultRtcpReceiverReportSsrc = 1;
// Down grade resolution at most 2 times for CPU reasons.
static const int kMaxCpuDowngrades = 2;
+// Adds |codec| to |list|, and also adds an RTX codec if |codec|'s name is
+// recognized.
+// TODO(deadbeef): Should we add RTX codecs for external codecs whose names we
+// don't recognize?
+void AddCodecAndMaybeRtxCodec(const VideoCodec& codec,
+ std::vector<VideoCodec>* codecs) {
+ codecs->push_back(codec);
+ int rtx_payload_type = 0;
+ if (CodecNamesEq(codec.name, kVp8CodecName)) {
+ rtx_payload_type = kDefaultRtxVp8PlType;
+ } else if (CodecNamesEq(codec.name, kVp9CodecName)) {
+ rtx_payload_type = kDefaultRtxVp9PlType;
+ } else if (CodecNamesEq(codec.name, kH264CodecName)) {
+ rtx_payload_type = kDefaultRtxH264PlType;
+ } else if (CodecNamesEq(codec.name, kRedCodecName)) {
+ rtx_payload_type = kDefaultRtxRedPlType;
+ } else {
+ return;
+ }
+ codecs->push_back(VideoCodec::CreateRtxCodec(rtx_payload_type, codec.id));
+}
+
std::vector<VideoCodec> DefaultVideoCodecList() {
std::vector<VideoCodec> codecs;
- codecs.push_back(MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp8PlType,
- kVp8CodecName));
- codecs.push_back(
- VideoCodec::CreateRtxCodec(kDefaultRtxVp8PlType, kDefaultVp8PlType));
+ AddCodecAndMaybeRtxCodec(
+ MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp8PlType, kVp8CodecName),
+ &codecs);
if (CodecIsInternallySupported(kVp9CodecName)) {
- codecs.push_back(MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp9PlType,
- kVp9CodecName));
- codecs.push_back(
- VideoCodec::CreateRtxCodec(kDefaultRtxVp9PlType, kDefaultVp9PlType));
+ AddCodecAndMaybeRtxCodec(MakeVideoCodecWithDefaultFeedbackParams(
+ kDefaultVp9PlType, kVp9CodecName),
+ &codecs);
}
if (CodecIsInternallySupported(kH264CodecName)) {
VideoCodec codec = MakeVideoCodecWithDefaultFeedbackParams(
@@ -366,13 +386,10 @@ std::vector<VideoCodec> DefaultVideoCodecList() {
kH264ProfileLevelConstrainedBaseline);
codec.SetParam(kH264FmtpLevelAsymmetryAllowed, "1");
codec.SetParam(kH264FmtpPacketizationMode, "1");
- codecs.push_back(codec);
- codecs.push_back(
- VideoCodec::CreateRtxCodec(kDefaultRtxH264PlType, kDefaultH264PlType));
+ AddCodecAndMaybeRtxCodec(codec, &codecs);
}
- codecs.push_back(VideoCodec(kDefaultRedPlType, kRedCodecName));
- codecs.push_back(
- VideoCodec::CreateRtxCodec(kDefaultRtxRedPlType, kDefaultRedPlType));
+ AddCodecAndMaybeRtxCodec(VideoCodec(kDefaultRedPlType, kRedCodecName),
+ &codecs);
codecs.push_back(VideoCodec(kDefaultUlpfecType, kUlpfecCodecName));
return codecs;
}
@@ -622,6 +639,12 @@ std::vector<VideoCodec> WebRtcVideoEngine2::GetSupportedCodecs() const {
// External video encoders are given payloads 120-127. This also means that
// we only support up to 8 external payload types.
+ // TODO(deadbeef): mediasession.cc already has code to dynamically
+ // determine a payload type. We should be able to just leave the payload
+ // type empty and let mediasession determine it. However, currently RTX
+ // codecs are associated to codecs by payload type, meaning we DO need
+ // to allocate unique payload types here. So to make this change we would
+ // need to make RTX codecs associated by name instead.
const int kExternalVideoPayloadTypeBase = 120;
size_t payload_type = kExternalVideoPayloadTypeBase + i;
RTC_DCHECK(payload_type < 128);
@@ -630,7 +653,7 @@ std::vector<VideoCodec> WebRtcVideoEngine2::GetSupportedCodecs() const {
codecs[i].max_fps);
AddDefaultFeedbackParams(&codec);
- supported_codecs.push_back(codec);
+ AddCodecAndMaybeRtxCodec(codec, &supported_codecs);
}
LOG(LS_INFO) << "Supported codecs (incl. external codecs): "
<< CodecVectorToString(supported_codecs);
« no previous file with comments | « no previous file | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698