xref: /aosp_15_r20/external/webrtc/api/video_codecs/video_codec.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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