blob: 2f7a2c732479612f23c2edbad7bd0e71b3b11847 [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/encoded_frame.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
13namespace webrtc {
14
15VCMEncodedFrame::VCMEncodedFrame()
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000016 : webrtc::EncodedImage(),
17 _renderTimeMs(-1),
18 _payloadType(0),
19 _missingFrame(false),
20 _codec(kVideoCodecUnknown),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000021 _rotation_set(false) {
philipel9d3ab612015-12-21 04:12:39 -080022 _codecSpecificInfo.codecType = kVideoCodecUnknown;
niklase@google.com470e71d2011-07-07 08:21:25 +000023}
24
25VCMEncodedFrame::VCMEncodedFrame(const webrtc::EncodedImage& rhs)
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000026 : webrtc::EncodedImage(rhs),
27 _renderTimeMs(-1),
28 _payloadType(0),
29 _missingFrame(false),
30 _codec(kVideoCodecUnknown),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000031 _rotation_set(false) {
philipel9d3ab612015-12-21 04:12:39 -080032 _codecSpecificInfo.codecType = kVideoCodecUnknown;
33 _buffer = NULL;
34 _size = 0;
35 _length = 0;
36 if (rhs._buffer != NULL) {
hbosd6648362016-01-21 05:43:11 -080037 VerifyAndAllocate(rhs._length +
38 EncodedImage::GetBufferPaddingBytes(_codec));
philipel9d3ab612015-12-21 04:12:39 -080039 memcpy(_buffer, rhs._buffer, rhs._length);
40 }
niklase@google.com470e71d2011-07-07 08:21:25 +000041}
42
43VCMEncodedFrame::VCMEncodedFrame(const VCMEncodedFrame& rhs)
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000044 : webrtc::EncodedImage(rhs),
45 _renderTimeMs(rhs._renderTimeMs),
46 _payloadType(rhs._payloadType),
47 _missingFrame(rhs._missingFrame),
48 _codecSpecificInfo(rhs._codecSpecificInfo),
49 _codec(rhs._codec),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000050 _rotation_set(rhs._rotation_set) {
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000051 _buffer = NULL;
52 _size = 0;
53 _length = 0;
philipel9d3ab612015-12-21 04:12:39 -080054 if (rhs._buffer != NULL) {
hbosd6648362016-01-21 05:43:11 -080055 VerifyAndAllocate(rhs._length +
56 EncodedImage::GetBufferPaddingBytes(_codec));
philipel9d3ab612015-12-21 04:12:39 -080057 memcpy(_buffer, rhs._buffer, rhs._length);
58 _length = rhs._length;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000059 }
niklase@google.com470e71d2011-07-07 08:21:25 +000060}
61
philipel9d3ab612015-12-21 04:12:39 -080062VCMEncodedFrame::~VCMEncodedFrame() {
63 Free();
niklase@google.com470e71d2011-07-07 08:21:25 +000064}
65
philipel9d3ab612015-12-21 04:12:39 -080066void VCMEncodedFrame::Free() {
67 Reset();
68 if (_buffer != NULL) {
69 delete[] _buffer;
70 _buffer = NULL;
71 }
niklase@google.com470e71d2011-07-07 08:21:25 +000072}
73
philipel9d3ab612015-12-21 04:12:39 -080074void VCMEncodedFrame::Reset() {
75 _renderTimeMs = -1;
76 _timeStamp = 0;
77 _payloadType = 0;
78 _frameType = kVideoFrameDelta;
79 _encodedWidth = 0;
80 _encodedHeight = 0;
81 _completeFrame = false;
82 _missingFrame = false;
83 _length = 0;
84 _codecSpecificInfo.codecType = kVideoCodecUnknown;
85 _codec = kVideoCodecUnknown;
perkj414dda12016-07-04 01:45:23 -070086 rotation_ = kVideoRotation_0;
ilnik00d802b2017-04-11 10:34:31 -070087 content_type_ = VideoContentType::UNSPECIFIED;
sprangba050a62017-08-18 02:51:12 -070088 timing_.flags = TimingFrameFlags::kInvalid;
philipel9d3ab612015-12-21 04:12:39 -080089 _rotation_set = false;
niklase@google.com470e71d2011-07-07 08:21:25 +000090}
91
philipel9d3ab612015-12-21 04:12:39 -080092void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000093 if (header) {
94 switch (header->codec) {
Niels Möller520ca4e2018-06-04 11:14:38 +020095 case kVideoCodecVP8: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000096 if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
97 // This is the first packet for this frame.
98 _codecSpecificInfo.codecSpecific.VP8.pictureId = -1;
99 _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
100 _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
101 _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
102 _codecSpecificInfo.codecType = kVideoCodecVP8;
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000103 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000104 _codecSpecificInfo.codecSpecific.VP8.nonReference =
105 header->codecHeader.VP8.nonReference;
106 if (header->codecHeader.VP8.pictureId != kNoPictureId) {
107 _codecSpecificInfo.codecSpecific.VP8.pictureId =
108 header->codecHeader.VP8.pictureId;
109 }
110 if (header->codecHeader.VP8.temporalIdx != kNoTemporalIdx) {
111 _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
112 header->codecHeader.VP8.temporalIdx;
113 _codecSpecificInfo.codecSpecific.VP8.layerSync =
114 header->codecHeader.VP8.layerSync;
115 }
116 if (header->codecHeader.VP8.keyIdx != kNoKeyIdx) {
117 _codecSpecificInfo.codecSpecific.VP8.keyIdx =
118 header->codecHeader.VP8.keyIdx;
119 }
120 break;
121 }
Niels Möller520ca4e2018-06-04 11:14:38 +0200122 case kVideoCodecVP9: {
asaperssona9455ab2015-07-31 06:10:09 -0700123 if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
124 // This is the first packet for this frame.
125 _codecSpecificInfo.codecSpecific.VP9.picture_id = -1;
126 _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
127 _codecSpecificInfo.codecSpecific.VP9.spatial_idx = 0;
128 _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
129 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
130 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx = -1;
131 _codecSpecificInfo.codecType = kVideoCodecVP9;
132 }
133 _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
134 header->codecHeader.VP9.inter_pic_predicted;
135 _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
136 header->codecHeader.VP9.flexible_mode;
philipelcfc319b2015-11-10 07:17:23 -0800137 _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
138 header->codecHeader.VP9.num_ref_pics;
139 for (uint8_t r = 0; r < header->codecHeader.VP9.num_ref_pics; ++r) {
140 _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
141 header->codecHeader.VP9.pid_diff[r];
142 }
asaperssona9455ab2015-07-31 06:10:09 -0700143 _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
144 header->codecHeader.VP9.ss_data_available;
145 if (header->codecHeader.VP9.picture_id != kNoPictureId) {
146 _codecSpecificInfo.codecSpecific.VP9.picture_id =
147 header->codecHeader.VP9.picture_id;
148 }
149 if (header->codecHeader.VP9.tl0_pic_idx != kNoTl0PicIdx) {
150 _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx =
151 header->codecHeader.VP9.tl0_pic_idx;
152 }
153 if (header->codecHeader.VP9.temporal_idx != kNoTemporalIdx) {
154 _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
155 header->codecHeader.VP9.temporal_idx;
156 _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
157 header->codecHeader.VP9.temporal_up_switch;
158 }
159 if (header->codecHeader.VP9.spatial_idx != kNoSpatialIdx) {
160 _codecSpecificInfo.codecSpecific.VP9.spatial_idx =
161 header->codecHeader.VP9.spatial_idx;
162 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
163 header->codecHeader.VP9.inter_layer_predicted;
164 }
165 if (header->codecHeader.VP9.gof_idx != kNoGofIdx) {
166 _codecSpecificInfo.codecSpecific.VP9.gof_idx =
167 header->codecHeader.VP9.gof_idx;
168 }
169 if (header->codecHeader.VP9.ss_data_available) {
170 _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
171 header->codecHeader.VP9.num_spatial_layers;
172 _codecSpecificInfo.codecSpecific.VP9
173 .spatial_layer_resolution_present =
174 header->codecHeader.VP9.spatial_layer_resolution_present;
175 if (header->codecHeader.VP9.spatial_layer_resolution_present) {
176 for (size_t i = 0; i < header->codecHeader.VP9.num_spatial_layers;
177 ++i) {
178 _codecSpecificInfo.codecSpecific.VP9.width[i] =
179 header->codecHeader.VP9.width[i];
180 _codecSpecificInfo.codecSpecific.VP9.height[i] =
181 header->codecHeader.VP9.height[i];
182 }
183 }
184 _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
185 header->codecHeader.VP9.gof);
186 }
187 break;
188 }
Niels Möller520ca4e2018-06-04 11:14:38 +0200189 case kVideoCodecH264: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000190 _codecSpecificInfo.codecType = kVideoCodecH264;
191 break;
192 }
Niels Möller520ca4e2018-06-04 11:14:38 +0200193 default: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000194 _codecSpecificInfo.codecType = kVideoCodecUnknown;
195 break;
196 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000197 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000198 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000199}
200
philipel9d3ab612015-12-21 04:12:39 -0800201void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize) {
202 if (minimumSize > _size) {
203 // create buffer of sufficient size
204 uint8_t* newBuffer = new uint8_t[minimumSize];
205 if (_buffer) {
206 // copy old data
207 memcpy(newBuffer, _buffer, _size);
208 delete[] _buffer;
niklase@google.com470e71d2011-07-07 08:21:25 +0000209 }
philipel9d3ab612015-12-21 04:12:39 -0800210 _buffer = newBuffer;
211 _size = minimumSize;
212 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000213}
214
pbos22993e12015-10-19 02:39:06 -0700215} // namespace webrtc