blob: 9950012bad71ecedcabdab1f6162c2f005466688 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgddab60b2012-04-23 14:52:15 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/video_coding/include/video_coding_defines.h"
12#include "modules/video_coding/encoded_frame.h"
13#include "modules/video_coding/generic_encoder.h"
14#include "modules/video_coding/jitter_buffer_common.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000015
16namespace webrtc {
17
18VCMEncodedFrame::VCMEncodedFrame()
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000019 : webrtc::EncodedImage(),
20 _renderTimeMs(-1),
21 _payloadType(0),
22 _missingFrame(false),
23 _codec(kVideoCodecUnknown),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000024 _rotation_set(false) {
philipel9d3ab612015-12-21 04:12:39 -080025 _codecSpecificInfo.codecType = kVideoCodecUnknown;
niklase@google.com470e71d2011-07-07 08:21:25 +000026}
27
28VCMEncodedFrame::VCMEncodedFrame(const webrtc::EncodedImage& rhs)
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000029 : webrtc::EncodedImage(rhs),
30 _renderTimeMs(-1),
31 _payloadType(0),
32 _missingFrame(false),
33 _codec(kVideoCodecUnknown),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000034 _rotation_set(false) {
philipel9d3ab612015-12-21 04:12:39 -080035 _codecSpecificInfo.codecType = kVideoCodecUnknown;
36 _buffer = NULL;
37 _size = 0;
38 _length = 0;
39 if (rhs._buffer != NULL) {
hbosd6648362016-01-21 05:43:11 -080040 VerifyAndAllocate(rhs._length +
41 EncodedImage::GetBufferPaddingBytes(_codec));
philipel9d3ab612015-12-21 04:12:39 -080042 memcpy(_buffer, rhs._buffer, rhs._length);
43 }
niklase@google.com470e71d2011-07-07 08:21:25 +000044}
45
46VCMEncodedFrame::VCMEncodedFrame(const VCMEncodedFrame& rhs)
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000047 : webrtc::EncodedImage(rhs),
48 _renderTimeMs(rhs._renderTimeMs),
49 _payloadType(rhs._payloadType),
50 _missingFrame(rhs._missingFrame),
51 _codecSpecificInfo(rhs._codecSpecificInfo),
52 _codec(rhs._codec),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000053 _rotation_set(rhs._rotation_set) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000054 _buffer = NULL;
55 _size = 0;
56 _length = 0;
philipel9d3ab612015-12-21 04:12:39 -080057 if (rhs._buffer != NULL) {
hbosd6648362016-01-21 05:43:11 -080058 VerifyAndAllocate(rhs._length +
59 EncodedImage::GetBufferPaddingBytes(_codec));
philipel9d3ab612015-12-21 04:12:39 -080060 memcpy(_buffer, rhs._buffer, rhs._length);
61 _length = rhs._length;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000062 }
niklase@google.com470e71d2011-07-07 08:21:25 +000063}
64
philipel9d3ab612015-12-21 04:12:39 -080065VCMEncodedFrame::~VCMEncodedFrame() {
66 Free();
niklase@google.com470e71d2011-07-07 08:21:25 +000067}
68
philipel9d3ab612015-12-21 04:12:39 -080069void VCMEncodedFrame::Free() {
70 Reset();
71 if (_buffer != NULL) {
72 delete[] _buffer;
73 _buffer = NULL;
74 }
niklase@google.com470e71d2011-07-07 08:21:25 +000075}
76
philipel9d3ab612015-12-21 04:12:39 -080077void VCMEncodedFrame::Reset() {
78 _renderTimeMs = -1;
79 _timeStamp = 0;
80 _payloadType = 0;
81 _frameType = kVideoFrameDelta;
82 _encodedWidth = 0;
83 _encodedHeight = 0;
84 _completeFrame = false;
85 _missingFrame = false;
86 _length = 0;
87 _codecSpecificInfo.codecType = kVideoCodecUnknown;
88 _codec = kVideoCodecUnknown;
perkj414dda12016-07-04 01:45:23 -070089 rotation_ = kVideoRotation_0;
ilnik00d802b2017-04-11 10:34:31 -070090 content_type_ = VideoContentType::UNSPECIFIED;
sprangba050a62017-08-18 02:51:12 -070091 timing_.flags = TimingFrameFlags::kInvalid;
philipel9d3ab612015-12-21 04:12:39 -080092 _rotation_set = false;
niklase@google.com470e71d2011-07-07 08:21:25 +000093}
94
philipel9d3ab612015-12-21 04:12:39 -080095void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000096 if (header) {
97 switch (header->codec) {
98 case kRtpVideoVp8: {
99 if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
100 // This is the first packet for this frame.
101 _codecSpecificInfo.codecSpecific.VP8.pictureId = -1;
102 _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
103 _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
104 _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
105 _codecSpecificInfo.codecType = kVideoCodecVP8;
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000106 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000107 _codecSpecificInfo.codecSpecific.VP8.nonReference =
108 header->codecHeader.VP8.nonReference;
109 if (header->codecHeader.VP8.pictureId != kNoPictureId) {
110 _codecSpecificInfo.codecSpecific.VP8.pictureId =
111 header->codecHeader.VP8.pictureId;
112 }
113 if (header->codecHeader.VP8.temporalIdx != kNoTemporalIdx) {
114 _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
115 header->codecHeader.VP8.temporalIdx;
116 _codecSpecificInfo.codecSpecific.VP8.layerSync =
117 header->codecHeader.VP8.layerSync;
118 }
119 if (header->codecHeader.VP8.keyIdx != kNoKeyIdx) {
120 _codecSpecificInfo.codecSpecific.VP8.keyIdx =
121 header->codecHeader.VP8.keyIdx;
122 }
123 break;
124 }
asaperssona9455ab2015-07-31 06:10:09 -0700125 case kRtpVideoVp9: {
126 if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
127 // This is the first packet for this frame.
128 _codecSpecificInfo.codecSpecific.VP9.picture_id = -1;
129 _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
130 _codecSpecificInfo.codecSpecific.VP9.spatial_idx = 0;
131 _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
132 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
133 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx = -1;
134 _codecSpecificInfo.codecType = kVideoCodecVP9;
135 }
136 _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
137 header->codecHeader.VP9.inter_pic_predicted;
138 _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
139 header->codecHeader.VP9.flexible_mode;
philipelcfc319b2015-11-10 07:17:23 -0800140 _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
141 header->codecHeader.VP9.num_ref_pics;
142 for (uint8_t r = 0; r < header->codecHeader.VP9.num_ref_pics; ++r) {
143 _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
144 header->codecHeader.VP9.pid_diff[r];
145 }
asaperssona9455ab2015-07-31 06:10:09 -0700146 _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
147 header->codecHeader.VP9.ss_data_available;
148 if (header->codecHeader.VP9.picture_id != kNoPictureId) {
149 _codecSpecificInfo.codecSpecific.VP9.picture_id =
150 header->codecHeader.VP9.picture_id;
151 }
152 if (header->codecHeader.VP9.tl0_pic_idx != kNoTl0PicIdx) {
153 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx =
154 header->codecHeader.VP9.tl0_pic_idx;
155 }
156 if (header->codecHeader.VP9.temporal_idx != kNoTemporalIdx) {
157 _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
158 header->codecHeader.VP9.temporal_idx;
159 _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
160 header->codecHeader.VP9.temporal_up_switch;
161 }
162 if (header->codecHeader.VP9.spatial_idx != kNoSpatialIdx) {
163 _codecSpecificInfo.codecSpecific.VP9.spatial_idx =
164 header->codecHeader.VP9.spatial_idx;
165 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
166 header->codecHeader.VP9.inter_layer_predicted;
167 }
168 if (header->codecHeader.VP9.gof_idx != kNoGofIdx) {
169 _codecSpecificInfo.codecSpecific.VP9.gof_idx =
170 header->codecHeader.VP9.gof_idx;
171 }
172 if (header->codecHeader.VP9.ss_data_available) {
173 _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
174 header->codecHeader.VP9.num_spatial_layers;
175 _codecSpecificInfo.codecSpecific.VP9
176 .spatial_layer_resolution_present =
177 header->codecHeader.VP9.spatial_layer_resolution_present;
178 if (header->codecHeader.VP9.spatial_layer_resolution_present) {
179 for (size_t i = 0; i < header->codecHeader.VP9.num_spatial_layers;
180 ++i) {
181 _codecSpecificInfo.codecSpecific.VP9.width[i] =
182 header->codecHeader.VP9.width[i];
183 _codecSpecificInfo.codecSpecific.VP9.height[i] =
184 header->codecHeader.VP9.height[i];
185 }
186 }
187 _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
188 header->codecHeader.VP9.gof);
189 }
190 break;
191 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000192 case kRtpVideoH264: {
193 _codecSpecificInfo.codecType = kVideoCodecH264;
194 break;
195 }
Emircan Uysaler9bb8f052018-01-23 15:53:06 -0800196 case kRtpVideoNone:
197 case kRtpVideoGeneric: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000198 _codecSpecificInfo.codecType = kVideoCodecUnknown;
199 break;
200 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000201 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000202 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000203}
204
philipel9d3ab612015-12-21 04:12:39 -0800205void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize) {
206 if (minimumSize > _size) {
207 // create buffer of sufficient size
208 uint8_t* newBuffer = new uint8_t[minimumSize];
209 if (_buffer) {
210 // copy old data
211 memcpy(newBuffer, _buffer, _size);
212 delete[] _buffer;
niklase@google.com470e71d2011-07-07 08:21:25 +0000213 }
philipel9d3ab612015-12-21 04:12:39 -0800214 _buffer = newBuffer;
215 _size = minimumSize;
216 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000217}
218
pbos22993e12015-10-19 02:39:06 -0700219} // namespace webrtc