blob: fb12c5bc68da0083605600aaf06f028255788e37 [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
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#include "webrtc/modules/video_coding/include/video_coding_defines.h"
12#include "webrtc/modules/video_coding/encoded_frame.h"
13#include "webrtc/modules/video_coding/generic_encoder.h"
14#include "webrtc/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;
philipel9d3ab612015-12-21 04:12:39 -080090 _rotation_set = false;
niklase@google.com470e71d2011-07-07 08:21:25 +000091}
92
philipel9d3ab612015-12-21 04:12:39 -080093void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000094 if (header) {
95 switch (header->codec) {
96 case kRtpVideoVp8: {
97 if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
98 // This is the first packet for this frame.
99 _codecSpecificInfo.codecSpecific.VP8.pictureId = -1;
100 _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
101 _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
102 _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
103 _codecSpecificInfo.codecType = kVideoCodecVP8;
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000104 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000105 _codecSpecificInfo.codecSpecific.VP8.nonReference =
106 header->codecHeader.VP8.nonReference;
107 if (header->codecHeader.VP8.pictureId != kNoPictureId) {
108 _codecSpecificInfo.codecSpecific.VP8.pictureId =
109 header->codecHeader.VP8.pictureId;
110 }
111 if (header->codecHeader.VP8.temporalIdx != kNoTemporalIdx) {
112 _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
113 header->codecHeader.VP8.temporalIdx;
114 _codecSpecificInfo.codecSpecific.VP8.layerSync =
115 header->codecHeader.VP8.layerSync;
116 }
117 if (header->codecHeader.VP8.keyIdx != kNoKeyIdx) {
118 _codecSpecificInfo.codecSpecific.VP8.keyIdx =
119 header->codecHeader.VP8.keyIdx;
120 }
121 break;
122 }
asaperssona9455ab2015-07-31 06:10:09 -0700123 case kRtpVideoVp9: {
124 if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
125 // This is the first packet for this frame.
126 _codecSpecificInfo.codecSpecific.VP9.picture_id = -1;
127 _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
128 _codecSpecificInfo.codecSpecific.VP9.spatial_idx = 0;
129 _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
130 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
131 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx = -1;
132 _codecSpecificInfo.codecType = kVideoCodecVP9;
133 }
134 _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
135 header->codecHeader.VP9.inter_pic_predicted;
136 _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
137 header->codecHeader.VP9.flexible_mode;
philipelcfc319b2015-11-10 07:17:23 -0800138 _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
139 header->codecHeader.VP9.num_ref_pics;
140 for (uint8_t r = 0; r < header->codecHeader.VP9.num_ref_pics; ++r) {
141 _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
142 header->codecHeader.VP9.pid_diff[r];
143 }
asaperssona9455ab2015-07-31 06:10:09 -0700144 _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
145 header->codecHeader.VP9.ss_data_available;
146 if (header->codecHeader.VP9.picture_id != kNoPictureId) {
147 _codecSpecificInfo.codecSpecific.VP9.picture_id =
148 header->codecHeader.VP9.picture_id;
149 }
150 if (header->codecHeader.VP9.tl0_pic_idx != kNoTl0PicIdx) {
151 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx =
152 header->codecHeader.VP9.tl0_pic_idx;
153 }
154 if (header->codecHeader.VP9.temporal_idx != kNoTemporalIdx) {
155 _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
156 header->codecHeader.VP9.temporal_idx;
157 _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
158 header->codecHeader.VP9.temporal_up_switch;
159 }
160 if (header->codecHeader.VP9.spatial_idx != kNoSpatialIdx) {
161 _codecSpecificInfo.codecSpecific.VP9.spatial_idx =
162 header->codecHeader.VP9.spatial_idx;
163 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
164 header->codecHeader.VP9.inter_layer_predicted;
165 }
166 if (header->codecHeader.VP9.gof_idx != kNoGofIdx) {
167 _codecSpecificInfo.codecSpecific.VP9.gof_idx =
168 header->codecHeader.VP9.gof_idx;
169 }
170 if (header->codecHeader.VP9.ss_data_available) {
171 _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
172 header->codecHeader.VP9.num_spatial_layers;
173 _codecSpecificInfo.codecSpecific.VP9
174 .spatial_layer_resolution_present =
175 header->codecHeader.VP9.spatial_layer_resolution_present;
176 if (header->codecHeader.VP9.spatial_layer_resolution_present) {
177 for (size_t i = 0; i < header->codecHeader.VP9.num_spatial_layers;
178 ++i) {
179 _codecSpecificInfo.codecSpecific.VP9.width[i] =
180 header->codecHeader.VP9.width[i];
181 _codecSpecificInfo.codecSpecific.VP9.height[i] =
182 header->codecHeader.VP9.height[i];
183 }
184 }
185 _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
186 header->codecHeader.VP9.gof);
187 }
188 break;
189 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000190 case kRtpVideoH264: {
191 _codecSpecificInfo.codecType = kVideoCodecH264;
192 break;
193 }
194 default: {
195 _codecSpecificInfo.codecType = kVideoCodecUnknown;
196 break;
197 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000198 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000199 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000200}
201
philipel9d3ab612015-12-21 04:12:39 -0800202void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize) {
203 if (minimumSize > _size) {
204 // create buffer of sufficient size
205 uint8_t* newBuffer = new uint8_t[minimumSize];
206 if (_buffer) {
207 // copy old data
208 memcpy(newBuffer, _buffer, _size);
209 delete[] _buffer;
niklase@google.com470e71d2011-07-07 08:21:25 +0000210 }
philipel9d3ab612015-12-21 04:12:39 -0800211 _buffer = newBuffer;
212 _size = minimumSize;
213 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000214}
215
pbos22993e12015-10-19 02:39:06 -0700216} // namespace webrtc