xref: /aosp_15_r20/external/webrtc/modules/video_coding/encoded_frame.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 "modules/video_coding/encoded_frame.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 "absl/types/variant.h"
16*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_timing.h"
17*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/codecs/interface/common_constants.h"
18*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
19*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
VCMEncodedFrame()23*d9f75844SAndroid Build Coastguard Worker VCMEncodedFrame::VCMEncodedFrame()
24*d9f75844SAndroid Build Coastguard Worker     : webrtc::EncodedImage(),
25*d9f75844SAndroid Build Coastguard Worker       _renderTimeMs(-1),
26*d9f75844SAndroid Build Coastguard Worker       _payloadType(0),
27*d9f75844SAndroid Build Coastguard Worker       _missingFrame(false),
28*d9f75844SAndroid Build Coastguard Worker       _codec(kVideoCodecGeneric) {
29*d9f75844SAndroid Build Coastguard Worker   _codecSpecificInfo.codecType = kVideoCodecGeneric;
30*d9f75844SAndroid Build Coastguard Worker }
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker VCMEncodedFrame::VCMEncodedFrame(const VCMEncodedFrame&) = default;
33*d9f75844SAndroid Build Coastguard Worker 
~VCMEncodedFrame()34*d9f75844SAndroid Build Coastguard Worker VCMEncodedFrame::~VCMEncodedFrame() {
35*d9f75844SAndroid Build Coastguard Worker   Reset();
36*d9f75844SAndroid Build Coastguard Worker }
37*d9f75844SAndroid Build Coastguard Worker 
Reset()38*d9f75844SAndroid Build Coastguard Worker void VCMEncodedFrame::Reset() {
39*d9f75844SAndroid Build Coastguard Worker   SetTimestamp(0);
40*d9f75844SAndroid Build Coastguard Worker   SetSpatialIndex(absl::nullopt);
41*d9f75844SAndroid Build Coastguard Worker   _renderTimeMs = -1;
42*d9f75844SAndroid Build Coastguard Worker   _payloadType = 0;
43*d9f75844SAndroid Build Coastguard Worker   _frameType = VideoFrameType::kVideoFrameDelta;
44*d9f75844SAndroid Build Coastguard Worker   _encodedWidth = 0;
45*d9f75844SAndroid Build Coastguard Worker   _encodedHeight = 0;
46*d9f75844SAndroid Build Coastguard Worker   _missingFrame = false;
47*d9f75844SAndroid Build Coastguard Worker   set_size(0);
48*d9f75844SAndroid Build Coastguard Worker   _codecSpecificInfo.codecType = kVideoCodecGeneric;
49*d9f75844SAndroid Build Coastguard Worker   _codec = kVideoCodecGeneric;
50*d9f75844SAndroid Build Coastguard Worker   rotation_ = kVideoRotation_0;
51*d9f75844SAndroid Build Coastguard Worker   content_type_ = VideoContentType::UNSPECIFIED;
52*d9f75844SAndroid Build Coastguard Worker   timing_.flags = VideoSendTiming::kInvalid;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker 
CopyCodecSpecific(const RTPVideoHeader * header)55*d9f75844SAndroid Build Coastguard Worker void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
56*d9f75844SAndroid Build Coastguard Worker   if (header) {
57*d9f75844SAndroid Build Coastguard Worker     switch (header->codec) {
58*d9f75844SAndroid Build Coastguard Worker       case kVideoCodecVP8: {
59*d9f75844SAndroid Build Coastguard Worker         const auto& vp8_header =
60*d9f75844SAndroid Build Coastguard Worker             absl::get<RTPVideoHeaderVP8>(header->video_type_header);
61*d9f75844SAndroid Build Coastguard Worker         if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
62*d9f75844SAndroid Build Coastguard Worker           // This is the first packet for this frame.
63*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
64*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
65*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
66*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecType = kVideoCodecVP8;
67*d9f75844SAndroid Build Coastguard Worker         }
68*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecSpecific.VP8.nonReference =
69*d9f75844SAndroid Build Coastguard Worker             vp8_header.nonReference;
70*d9f75844SAndroid Build Coastguard Worker         if (vp8_header.temporalIdx != kNoTemporalIdx) {
71*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
72*d9f75844SAndroid Build Coastguard Worker               vp8_header.temporalIdx;
73*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.layerSync = vp8_header.layerSync;
74*d9f75844SAndroid Build Coastguard Worker         }
75*d9f75844SAndroid Build Coastguard Worker         if (vp8_header.keyIdx != kNoKeyIdx) {
76*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP8.keyIdx = vp8_header.keyIdx;
77*d9f75844SAndroid Build Coastguard Worker         }
78*d9f75844SAndroid Build Coastguard Worker         break;
79*d9f75844SAndroid Build Coastguard Worker       }
80*d9f75844SAndroid Build Coastguard Worker       case kVideoCodecVP9: {
81*d9f75844SAndroid Build Coastguard Worker         const auto& vp9_header =
82*d9f75844SAndroid Build Coastguard Worker             absl::get<RTPVideoHeaderVP9>(header->video_type_header);
83*d9f75844SAndroid Build Coastguard Worker         if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
84*d9f75844SAndroid Build Coastguard Worker           // This is the first packet for this frame.
85*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
86*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
87*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
88*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecType = kVideoCodecVP9;
89*d9f75844SAndroid Build Coastguard Worker         }
90*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
91*d9f75844SAndroid Build Coastguard Worker             vp9_header.inter_pic_predicted;
92*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
93*d9f75844SAndroid Build Coastguard Worker             vp9_header.flexible_mode;
94*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
95*d9f75844SAndroid Build Coastguard Worker             vp9_header.num_ref_pics;
96*d9f75844SAndroid Build Coastguard Worker         for (uint8_t r = 0; r < vp9_header.num_ref_pics; ++r) {
97*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
98*d9f75844SAndroid Build Coastguard Worker               vp9_header.pid_diff[r];
99*d9f75844SAndroid Build Coastguard Worker         }
100*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
101*d9f75844SAndroid Build Coastguard Worker             vp9_header.ss_data_available;
102*d9f75844SAndroid Build Coastguard Worker         if (vp9_header.temporal_idx != kNoTemporalIdx) {
103*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
104*d9f75844SAndroid Build Coastguard Worker               vp9_header.temporal_idx;
105*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
106*d9f75844SAndroid Build Coastguard Worker               vp9_header.temporal_up_switch;
107*d9f75844SAndroid Build Coastguard Worker         }
108*d9f75844SAndroid Build Coastguard Worker         if (vp9_header.spatial_idx != kNoSpatialIdx) {
109*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
110*d9f75844SAndroid Build Coastguard Worker               vp9_header.inter_layer_predicted;
111*d9f75844SAndroid Build Coastguard Worker           SetSpatialIndex(vp9_header.spatial_idx);
112*d9f75844SAndroid Build Coastguard Worker         }
113*d9f75844SAndroid Build Coastguard Worker         if (vp9_header.gof_idx != kNoGofIdx) {
114*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.gof_idx = vp9_header.gof_idx;
115*d9f75844SAndroid Build Coastguard Worker         }
116*d9f75844SAndroid Build Coastguard Worker         if (vp9_header.ss_data_available) {
117*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
118*d9f75844SAndroid Build Coastguard Worker               vp9_header.num_spatial_layers;
119*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9
120*d9f75844SAndroid Build Coastguard Worker               .spatial_layer_resolution_present =
121*d9f75844SAndroid Build Coastguard Worker               vp9_header.spatial_layer_resolution_present;
122*d9f75844SAndroid Build Coastguard Worker           if (vp9_header.spatial_layer_resolution_present) {
123*d9f75844SAndroid Build Coastguard Worker             for (size_t i = 0; i < vp9_header.num_spatial_layers; ++i) {
124*d9f75844SAndroid Build Coastguard Worker               _codecSpecificInfo.codecSpecific.VP9.width[i] =
125*d9f75844SAndroid Build Coastguard Worker                   vp9_header.width[i];
126*d9f75844SAndroid Build Coastguard Worker               _codecSpecificInfo.codecSpecific.VP9.height[i] =
127*d9f75844SAndroid Build Coastguard Worker                   vp9_header.height[i];
128*d9f75844SAndroid Build Coastguard Worker             }
129*d9f75844SAndroid Build Coastguard Worker           }
130*d9f75844SAndroid Build Coastguard Worker           _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
131*d9f75844SAndroid Build Coastguard Worker               vp9_header.gof);
132*d9f75844SAndroid Build Coastguard Worker         }
133*d9f75844SAndroid Build Coastguard Worker         break;
134*d9f75844SAndroid Build Coastguard Worker       }
135*d9f75844SAndroid Build Coastguard Worker       case kVideoCodecH264: {
136*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecType = kVideoCodecH264;
137*d9f75844SAndroid Build Coastguard Worker         break;
138*d9f75844SAndroid Build Coastguard Worker       }
139*d9f75844SAndroid Build Coastguard Worker       case kVideoCodecAV1: {
140*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecType = kVideoCodecAV1;
141*d9f75844SAndroid Build Coastguard Worker         break;
142*d9f75844SAndroid Build Coastguard Worker       }
143*d9f75844SAndroid Build Coastguard Worker       default: {
144*d9f75844SAndroid Build Coastguard Worker         _codecSpecificInfo.codecType = kVideoCodecGeneric;
145*d9f75844SAndroid Build Coastguard Worker         break;
146*d9f75844SAndroid Build Coastguard Worker       }
147*d9f75844SAndroid Build Coastguard Worker     }
148*d9f75844SAndroid Build Coastguard Worker   }
149*d9f75844SAndroid Build Coastguard Worker }
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
152