Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: webrtc/modules/video_coding/codecs/i420/main/source/i420.cc

Issue 1418753002: Move i420 files to the right location (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
11 #include "webrtc/modules/video_coding/codecs/i420/main/interface/i420.h"
12
13 #include <limits>
14 #include <string>
15
16 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
17
18 namespace {
19 const size_t kI420HeaderSize = 4;
20 }
21
22 namespace webrtc {
23
24 I420Encoder::I420Encoder() : _inited(false), _encodedImage(),
25 _encodedCompleteCallback(NULL) {
26 }
27
28 I420Encoder::~I420Encoder() {
29 _inited = false;
30 delete [] _encodedImage._buffer;
31 }
32
33 int I420Encoder::Release() {
34 // Should allocate an encoded frame and then release it here, for that we
35 // actually need an init flag.
36 if (_encodedImage._buffer != NULL) {
37 delete [] _encodedImage._buffer;
38 _encodedImage._buffer = NULL;
39 }
40 _inited = false;
41 return WEBRTC_VIDEO_CODEC_OK;
42 }
43
44 int I420Encoder::InitEncode(const VideoCodec* codecSettings,
45 int /*numberOfCores*/,
46 size_t /*maxPayloadSize */) {
47 if (codecSettings == NULL) {
48 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
49 }
50 if (codecSettings->width < 1 || codecSettings->height < 1) {
51 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
52 }
53
54 // Allocating encoded memory.
55 if (_encodedImage._buffer != NULL) {
56 delete [] _encodedImage._buffer;
57 _encodedImage._buffer = NULL;
58 _encodedImage._size = 0;
59 }
60 const size_t newSize =
61 CalcBufferSize(kI420, codecSettings->width, codecSettings->height) +
62 kI420HeaderSize;
63 uint8_t* newBuffer = new uint8_t[newSize];
64 if (newBuffer == NULL) {
65 return WEBRTC_VIDEO_CODEC_MEMORY;
66 }
67 _encodedImage._size = newSize;
68 _encodedImage._buffer = newBuffer;
69
70 // If no memory allocation, no point to init.
71 _inited = true;
72 return WEBRTC_VIDEO_CODEC_OK;
73 }
74
75 int I420Encoder::Encode(const VideoFrame& inputImage,
76 const CodecSpecificInfo* /*codecSpecificInfo*/,
77 const std::vector<FrameType>* /*frame_types*/) {
78 if (!_inited) {
79 return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
80 }
81 if (_encodedCompleteCallback == NULL) {
82 return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
83 }
84
85 _encodedImage._frameType = kKeyFrame;
86 _encodedImage._timeStamp = inputImage.timestamp();
87 _encodedImage._encodedHeight = inputImage.height();
88 _encodedImage._encodedWidth = inputImage.width();
89
90 int width = inputImage.width();
91 if (width > std::numeric_limits<uint16_t>::max()) {
92 return WEBRTC_VIDEO_CODEC_ERR_SIZE;
93 }
94 int height = inputImage.height();
95 if (height > std::numeric_limits<uint16_t>::max()) {
96 return WEBRTC_VIDEO_CODEC_ERR_SIZE;
97 }
98
99 size_t req_length =
100 CalcBufferSize(kI420, inputImage.width(), inputImage.height()) +
101 kI420HeaderSize;
102 if (_encodedImage._size > req_length) {
103 // Reallocate buffer.
104 delete [] _encodedImage._buffer;
105
106 _encodedImage._buffer = new uint8_t[req_length];
107 _encodedImage._size = req_length;
108 }
109
110 uint8_t *buffer = _encodedImage._buffer;
111
112 buffer = InsertHeader(buffer, width, height);
113
114 int ret_length = ExtractBuffer(inputImage, req_length - kI420HeaderSize,
115 buffer);
116 if (ret_length < 0)
117 return WEBRTC_VIDEO_CODEC_MEMORY;
118 _encodedImage._length = ret_length + kI420HeaderSize;
119
120 _encodedCompleteCallback->Encoded(_encodedImage, NULL, NULL);
121 return WEBRTC_VIDEO_CODEC_OK;
122 }
123
124 uint8_t* I420Encoder::InsertHeader(uint8_t *buffer, uint16_t width,
125 uint16_t height) {
126 *buffer++ = static_cast<uint8_t>(width >> 8);
127 *buffer++ = static_cast<uint8_t>(width & 0xFF);
128 *buffer++ = static_cast<uint8_t>(height >> 8);
129 *buffer++ = static_cast<uint8_t>(height & 0xFF);
130 return buffer;
131 }
132
133 int
134 I420Encoder::RegisterEncodeCompleteCallback(EncodedImageCallback* callback) {
135 _encodedCompleteCallback = callback;
136 return WEBRTC_VIDEO_CODEC_OK;
137 }
138
139
140 I420Decoder::I420Decoder() : _decodedImage(), _width(0), _height(0),
141 _inited(false), _decodeCompleteCallback(NULL) {
142 }
143
144 I420Decoder::~I420Decoder() {
145 Release();
146 }
147
148 int
149 I420Decoder::Reset() {
150 return WEBRTC_VIDEO_CODEC_OK;
151 }
152
153
154 int
155 I420Decoder::InitDecode(const VideoCodec* codecSettings,
156 int /*numberOfCores */) {
157 if (codecSettings == NULL) {
158 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
159 } else if (codecSettings->width < 1 || codecSettings->height < 1) {
160 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
161 }
162 _width = codecSettings->width;
163 _height = codecSettings->height;
164 _inited = true;
165 return WEBRTC_VIDEO_CODEC_OK;
166 }
167
168 int I420Decoder::Decode(const EncodedImage& inputImage, bool /*missingFrames*/,
169 const RTPFragmentationHeader* /*fragmentation*/,
170 const CodecSpecificInfo* /*codecSpecificInfo*/,
171 int64_t /*renderTimeMs*/) {
172 if (inputImage._buffer == NULL) {
173 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
174 }
175 if (_decodeCompleteCallback == NULL) {
176 return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
177 }
178 if (inputImage._length <= 0) {
179 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
180 }
181 if (inputImage._completeFrame == false) {
182 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
183 }
184 if (!_inited) {
185 return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
186 }
187 if (inputImage._length < kI420HeaderSize) {
188 return WEBRTC_VIDEO_CODEC_ERROR;
189 }
190
191 const uint8_t* buffer = inputImage._buffer;
192 uint16_t width, height;
193
194 buffer = ExtractHeader(buffer, &width, &height);
195 _width = width;
196 _height = height;
197
198 // Verify that the available length is sufficient:
199 size_t req_length = CalcBufferSize(kI420, _width, _height) + kI420HeaderSize;
200
201 if (req_length > inputImage._length) {
202 return WEBRTC_VIDEO_CODEC_ERROR;
203 }
204 // Set decoded image parameters.
205 int half_width = (_width + 1) / 2;
206 _decodedImage.CreateEmptyFrame(_width, _height,
207 _width, half_width, half_width);
208 // Converting from buffer to plane representation.
209 int ret = ConvertToI420(kI420, buffer, 0, 0, _width, _height, 0,
210 kVideoRotation_0, &_decodedImage);
211 if (ret < 0) {
212 return WEBRTC_VIDEO_CODEC_MEMORY;
213 }
214 _decodedImage.set_timestamp(inputImage._timeStamp);
215
216 _decodeCompleteCallback->Decoded(_decodedImage);
217 return WEBRTC_VIDEO_CODEC_OK;
218 }
219
220 const uint8_t* I420Decoder::ExtractHeader(const uint8_t* buffer,
221 uint16_t* width, uint16_t* height) {
222 *width = static_cast<uint16_t>(*buffer++) << 8;
223 *width |= *buffer++;
224 *height = static_cast<uint16_t>(*buffer++) << 8;
225 *height |= *buffer++;
226
227 return buffer;
228 }
229
230 int I420Decoder::RegisterDecodeCompleteCallback(
231 DecodedImageCallback* callback) {
232 _decodeCompleteCallback = callback;
233 return WEBRTC_VIDEO_CODEC_OK;
234 }
235
236 int I420Decoder::Release() {
237 _inited = false;
238 return WEBRTC_VIDEO_CODEC_OK;
239 }
240 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698