1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_codec.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <string.h>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/match.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
21*d9f75844SAndroid Build Coastguard Worker namespace {
22*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameVp8[] = "VP8";
23*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameVp9[] = "VP9";
24*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameAv1[] = "AV1";
25*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/13166): Remove AV1X when backwards compatibility is not
26*d9f75844SAndroid Build Coastguard Worker // needed.
27*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameAv1x[] = "AV1X";
28*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameH264[] = "H264";
29*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameGeneric[] = "Generic";
30*d9f75844SAndroid Build Coastguard Worker constexpr char kPayloadNameMultiplex[] = "Multiplex";
31*d9f75844SAndroid Build Coastguard Worker } // namespace
32*d9f75844SAndroid Build Coastguard Worker
operator ==(const VideoCodecVP8 & other) const33*d9f75844SAndroid Build Coastguard Worker bool VideoCodecVP8::operator==(const VideoCodecVP8& other) const {
34*d9f75844SAndroid Build Coastguard Worker return (numberOfTemporalLayers == other.numberOfTemporalLayers &&
35*d9f75844SAndroid Build Coastguard Worker denoisingOn == other.denoisingOn &&
36*d9f75844SAndroid Build Coastguard Worker automaticResizeOn == other.automaticResizeOn &&
37*d9f75844SAndroid Build Coastguard Worker keyFrameInterval == other.keyFrameInterval);
38*d9f75844SAndroid Build Coastguard Worker }
39*d9f75844SAndroid Build Coastguard Worker
operator ==(const VideoCodecVP9 & other) const40*d9f75844SAndroid Build Coastguard Worker bool VideoCodecVP9::operator==(const VideoCodecVP9& other) const {
41*d9f75844SAndroid Build Coastguard Worker return (numberOfTemporalLayers == other.numberOfTemporalLayers &&
42*d9f75844SAndroid Build Coastguard Worker denoisingOn == other.denoisingOn &&
43*d9f75844SAndroid Build Coastguard Worker keyFrameInterval == other.keyFrameInterval &&
44*d9f75844SAndroid Build Coastguard Worker adaptiveQpMode == other.adaptiveQpMode &&
45*d9f75844SAndroid Build Coastguard Worker automaticResizeOn == other.automaticResizeOn &&
46*d9f75844SAndroid Build Coastguard Worker numberOfSpatialLayers == other.numberOfSpatialLayers &&
47*d9f75844SAndroid Build Coastguard Worker flexibleMode == other.flexibleMode);
48*d9f75844SAndroid Build Coastguard Worker }
49*d9f75844SAndroid Build Coastguard Worker
operator ==(const VideoCodecH264 & other) const50*d9f75844SAndroid Build Coastguard Worker bool VideoCodecH264::operator==(const VideoCodecH264& other) const {
51*d9f75844SAndroid Build Coastguard Worker return (keyFrameInterval == other.keyFrameInterval &&
52*d9f75844SAndroid Build Coastguard Worker numberOfTemporalLayers == other.numberOfTemporalLayers);
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
VideoCodec()55*d9f75844SAndroid Build Coastguard Worker VideoCodec::VideoCodec()
56*d9f75844SAndroid Build Coastguard Worker : codecType(kVideoCodecGeneric),
57*d9f75844SAndroid Build Coastguard Worker width(0),
58*d9f75844SAndroid Build Coastguard Worker height(0),
59*d9f75844SAndroid Build Coastguard Worker startBitrate(0),
60*d9f75844SAndroid Build Coastguard Worker maxBitrate(0),
61*d9f75844SAndroid Build Coastguard Worker minBitrate(0),
62*d9f75844SAndroid Build Coastguard Worker maxFramerate(0),
63*d9f75844SAndroid Build Coastguard Worker active(true),
64*d9f75844SAndroid Build Coastguard Worker qpMax(0),
65*d9f75844SAndroid Build Coastguard Worker numberOfSimulcastStreams(0),
66*d9f75844SAndroid Build Coastguard Worker simulcastStream(),
67*d9f75844SAndroid Build Coastguard Worker spatialLayers(),
68*d9f75844SAndroid Build Coastguard Worker mode(VideoCodecMode::kRealtimeVideo),
69*d9f75844SAndroid Build Coastguard Worker expect_encode_from_texture(false),
70*d9f75844SAndroid Build Coastguard Worker timing_frame_thresholds({0, 0}),
71*d9f75844SAndroid Build Coastguard Worker legacy_conference_mode(false),
72*d9f75844SAndroid Build Coastguard Worker codec_specific_(),
73*d9f75844SAndroid Build Coastguard Worker complexity_(VideoCodecComplexity::kComplexityNormal) {}
74*d9f75844SAndroid Build Coastguard Worker
VP8()75*d9f75844SAndroid Build Coastguard Worker VideoCodecVP8* VideoCodec::VP8() {
76*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecVP8);
77*d9f75844SAndroid Build Coastguard Worker return &codec_specific_.VP8;
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker
VP8() const80*d9f75844SAndroid Build Coastguard Worker const VideoCodecVP8& VideoCodec::VP8() const {
81*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecVP8);
82*d9f75844SAndroid Build Coastguard Worker return codec_specific_.VP8;
83*d9f75844SAndroid Build Coastguard Worker }
84*d9f75844SAndroid Build Coastguard Worker
VP9()85*d9f75844SAndroid Build Coastguard Worker VideoCodecVP9* VideoCodec::VP9() {
86*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecVP9);
87*d9f75844SAndroid Build Coastguard Worker return &codec_specific_.VP9;
88*d9f75844SAndroid Build Coastguard Worker }
89*d9f75844SAndroid Build Coastguard Worker
VP9() const90*d9f75844SAndroid Build Coastguard Worker const VideoCodecVP9& VideoCodec::VP9() const {
91*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecVP9);
92*d9f75844SAndroid Build Coastguard Worker return codec_specific_.VP9;
93*d9f75844SAndroid Build Coastguard Worker }
94*d9f75844SAndroid Build Coastguard Worker
H264()95*d9f75844SAndroid Build Coastguard Worker VideoCodecH264* VideoCodec::H264() {
96*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecH264);
97*d9f75844SAndroid Build Coastguard Worker return &codec_specific_.H264;
98*d9f75844SAndroid Build Coastguard Worker }
99*d9f75844SAndroid Build Coastguard Worker
H264() const100*d9f75844SAndroid Build Coastguard Worker const VideoCodecH264& VideoCodec::H264() const {
101*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(codecType, kVideoCodecH264);
102*d9f75844SAndroid Build Coastguard Worker return codec_specific_.H264;
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
CodecTypeToPayloadString(VideoCodecType type)105*d9f75844SAndroid Build Coastguard Worker const char* CodecTypeToPayloadString(VideoCodecType type) {
106*d9f75844SAndroid Build Coastguard Worker switch (type) {
107*d9f75844SAndroid Build Coastguard Worker case kVideoCodecVP8:
108*d9f75844SAndroid Build Coastguard Worker return kPayloadNameVp8;
109*d9f75844SAndroid Build Coastguard Worker case kVideoCodecVP9:
110*d9f75844SAndroid Build Coastguard Worker return kPayloadNameVp9;
111*d9f75844SAndroid Build Coastguard Worker case kVideoCodecAV1:
112*d9f75844SAndroid Build Coastguard Worker return kPayloadNameAv1;
113*d9f75844SAndroid Build Coastguard Worker case kVideoCodecH264:
114*d9f75844SAndroid Build Coastguard Worker return kPayloadNameH264;
115*d9f75844SAndroid Build Coastguard Worker case kVideoCodecMultiplex:
116*d9f75844SAndroid Build Coastguard Worker return kPayloadNameMultiplex;
117*d9f75844SAndroid Build Coastguard Worker case kVideoCodecGeneric:
118*d9f75844SAndroid Build Coastguard Worker return kPayloadNameGeneric;
119*d9f75844SAndroid Build Coastguard Worker }
120*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_NOTREACHED();
121*d9f75844SAndroid Build Coastguard Worker }
122*d9f75844SAndroid Build Coastguard Worker
PayloadStringToCodecType(const std::string & name)123*d9f75844SAndroid Build Coastguard Worker VideoCodecType PayloadStringToCodecType(const std::string& name) {
124*d9f75844SAndroid Build Coastguard Worker if (absl::EqualsIgnoreCase(name, kPayloadNameVp8))
125*d9f75844SAndroid Build Coastguard Worker return kVideoCodecVP8;
126*d9f75844SAndroid Build Coastguard Worker if (absl::EqualsIgnoreCase(name, kPayloadNameVp9))
127*d9f75844SAndroid Build Coastguard Worker return kVideoCodecVP9;
128*d9f75844SAndroid Build Coastguard Worker if (absl::EqualsIgnoreCase(name, kPayloadNameAv1) ||
129*d9f75844SAndroid Build Coastguard Worker absl::EqualsIgnoreCase(name, kPayloadNameAv1x))
130*d9f75844SAndroid Build Coastguard Worker return kVideoCodecAV1;
131*d9f75844SAndroid Build Coastguard Worker if (absl::EqualsIgnoreCase(name, kPayloadNameH264))
132*d9f75844SAndroid Build Coastguard Worker return kVideoCodecH264;
133*d9f75844SAndroid Build Coastguard Worker if (absl::EqualsIgnoreCase(name, kPayloadNameMultiplex))
134*d9f75844SAndroid Build Coastguard Worker return kVideoCodecMultiplex;
135*d9f75844SAndroid Build Coastguard Worker return kVideoCodecGeneric;
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker
GetVideoEncoderComplexity() const138*d9f75844SAndroid Build Coastguard Worker VideoCodecComplexity VideoCodec::GetVideoEncoderComplexity() const {
139*d9f75844SAndroid Build Coastguard Worker return complexity_;
140*d9f75844SAndroid Build Coastguard Worker }
141*d9f75844SAndroid Build Coastguard Worker
SetVideoEncoderComplexity(VideoCodecComplexity complexity_setting)142*d9f75844SAndroid Build Coastguard Worker void VideoCodec::SetVideoEncoderComplexity(
143*d9f75844SAndroid Build Coastguard Worker VideoCodecComplexity complexity_setting) {
144*d9f75844SAndroid Build Coastguard Worker complexity_ = complexity_setting;
145*d9f75844SAndroid Build Coastguard Worker }
146*d9f75844SAndroid Build Coastguard Worker
GetFrameDropEnabled() const147*d9f75844SAndroid Build Coastguard Worker bool VideoCodec::GetFrameDropEnabled() const {
148*d9f75844SAndroid Build Coastguard Worker return frame_drop_enabled_;
149*d9f75844SAndroid Build Coastguard Worker }
150*d9f75844SAndroid Build Coastguard Worker
SetFrameDropEnabled(bool enabled)151*d9f75844SAndroid Build Coastguard Worker void VideoCodec::SetFrameDropEnabled(bool enabled) {
152*d9f75844SAndroid Build Coastguard Worker frame_drop_enabled_ = enabled;
153*d9f75844SAndroid Build Coastguard Worker }
154*d9f75844SAndroid Build Coastguard Worker
155*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
156