OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/filters/ffmpeg_video_decoder.h" | 5 #include "media/filters/ffmpeg_video_decoder.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 ColorSpace color_space = AVColorSpaceToColorSpace(codec_context->colorspace, | 180 ColorSpace color_space = AVColorSpaceToColorSpace(codec_context->colorspace, |
181 codec_context->color_range); | 181 codec_context->color_range); |
182 if (color_space == COLOR_SPACE_UNSPECIFIED) | 182 if (color_space == COLOR_SPACE_UNSPECIFIED) |
183 color_space = config_.color_space(); | 183 color_space = config_.color_space(); |
184 video_frame->metadata()->SetInteger(VideoFrameMetadata::COLOR_SPACE, | 184 video_frame->metadata()->SetInteger(VideoFrameMetadata::COLOR_SPACE, |
185 color_space); | 185 color_space); |
186 | 186 |
187 if (codec_context->color_primaries != AVCOL_PRI_UNSPECIFIED || | 187 if (codec_context->color_primaries != AVCOL_PRI_UNSPECIFIED || |
188 codec_context->color_trc != AVCOL_TRC_UNSPECIFIED || | 188 codec_context->color_trc != AVCOL_TRC_UNSPECIFIED || |
189 codec_context->colorspace != AVCOL_SPC_UNSPECIFIED) { | 189 codec_context->colorspace != AVCOL_SPC_UNSPECIFIED) { |
190 video_frame->set_color_space(gfx::ColorSpace::CreateVideo( | 190 gfx::ColorSpace::PrimaryID primary_id; |
hubbe
2017/05/03 18:17:27
Don't duplucate this logic.
Create a VideoColorSpa
Uzair
2017/05/04 11:29:36
Done.
| |
191 codec_context->color_primaries, codec_context->color_trc, | 191 gfx::ColorSpace::TransferID transfer_id; |
192 codec_context->colorspace, | 192 gfx::ColorSpace::MatrixID matrix_id; |
193 codec_context->color_range != AVCOL_RANGE_MPEG | 193 |
194 ? gfx::ColorSpace::RangeID::FULL | 194 switch (codec_context->color_primaries) { |
195 : gfx::ColorSpace::RangeID::LIMITED)); | 195 case AVCOL_PRI_RESERVED0: |
196 case AVCOL_PRI_BT709: | |
197 case AVCOL_PRI_UNSPECIFIED: | |
198 case AVCOL_PRI_RESERVED: | |
199 primary_id = gfx::ColorSpace::PrimaryID::BT709; | |
200 break; | |
201 case AVCOL_PRI_BT470M: | |
202 primary_id = gfx::ColorSpace::PrimaryID::BT470M; | |
203 break; | |
204 case AVCOL_PRI_BT470BG: | |
205 primary_id = gfx::ColorSpace::PrimaryID::BT470BG; | |
206 break; | |
207 case AVCOL_PRI_SMPTE170M: | |
208 primary_id = gfx::ColorSpace::PrimaryID::SMPTE170M; | |
209 break; | |
210 case AVCOL_PRI_SMPTE240M: | |
211 primary_id = gfx::ColorSpace::PrimaryID::SMPTE240M; | |
212 break; | |
213 case AVCOL_PRI_FILM: | |
214 primary_id = gfx::ColorSpace::PrimaryID::FILM; | |
215 break; | |
216 case AVCOL_PRI_BT2020: | |
217 primary_id = gfx::ColorSpace::PrimaryID::BT2020; | |
218 break; | |
219 case AVCOL_PRI_SMPTE428: | |
220 primary_id = gfx::ColorSpace::PrimaryID::SMPTEST428_1; | |
221 break; | |
222 case AVCOL_PRI_SMPTE431: | |
223 primary_id = gfx::ColorSpace::PrimaryID::SMPTEST431_2; | |
224 break; | |
225 case AVCOL_PRI_SMPTE432: | |
226 primary_id = gfx::ColorSpace::PrimaryID::SMPTEST432_1; | |
227 break; | |
228 case AVCOL_PRI_NB: | |
229 // TODO(uzair.jaleel) Need to check this once. | |
230 primary_id = gfx::ColorSpace::PrimaryID::INVALID; | |
231 break; | |
232 } | |
233 | |
234 switch (codec_context->color_trc) { | |
235 case AVCOL_TRC_RESERVED0: | |
236 case AVCOL_TRC_BT709: | |
237 case AVCOL_TRC_UNSPECIFIED: | |
238 case AVCOL_TRC_RESERVED: | |
239 transfer_id = gfx::ColorSpace::TransferID::BT709; | |
240 break; | |
241 case AVCOL_TRC_GAMMA22: | |
242 transfer_id = gfx::ColorSpace::TransferID::GAMMA22; | |
243 break; | |
244 case AVCOL_TRC_GAMMA28: | |
245 transfer_id = gfx::ColorSpace::TransferID::GAMMA28; | |
246 break; | |
247 case AVCOL_TRC_SMPTE170M: | |
248 transfer_id = gfx::ColorSpace::TransferID::SMPTE170M; | |
249 break; | |
250 case AVCOL_TRC_SMPTE240M: | |
251 transfer_id = gfx::ColorSpace::TransferID::SMPTE240M; | |
252 break; | |
253 case AVCOL_TRC_LINEAR: | |
254 transfer_id = gfx::ColorSpace::TransferID::LINEAR; | |
255 break; | |
256 case AVCOL_TRC_LOG: | |
257 transfer_id = gfx::ColorSpace::TransferID::LOG; | |
258 break; | |
259 case AVCOL_TRC_LOG_SQRT: | |
260 transfer_id = gfx::ColorSpace::TransferID::LOG_SQRT; | |
261 break; | |
262 case AVCOL_TRC_IEC61966_2_4: | |
263 transfer_id = gfx::ColorSpace::TransferID::IEC61966_2_4; | |
264 break; | |
265 case AVCOL_TRC_BT1361_ECG: | |
266 transfer_id = gfx::ColorSpace::TransferID::BT1361_ECG; | |
267 break; | |
268 case AVCOL_TRC_IEC61966_2_1: | |
269 transfer_id = gfx::ColorSpace::TransferID::IEC61966_2_1; | |
270 break; | |
271 case AVCOL_TRC_BT2020_10: | |
272 transfer_id = gfx::ColorSpace::TransferID::BT2020_10; | |
273 break; | |
274 case AVCOL_TRC_BT2020_12: | |
275 transfer_id = gfx::ColorSpace::TransferID::BT2020_12; | |
276 break; | |
277 case AVCOL_TRC_SMPTE2084: | |
278 transfer_id = gfx::ColorSpace::TransferID::SMPTEST2084; | |
279 break; | |
280 case AVCOL_TRC_SMPTE428: | |
281 transfer_id = gfx::ColorSpace::TransferID::SMPTEST428_1; | |
282 break; | |
283 case AVCOL_TRC_ARIB_STD_B67: | |
284 transfer_id = gfx::ColorSpace::TransferID::ARIB_STD_B67; | |
285 break; | |
286 case AVCOL_TRC_NB: | |
287 // TODO(uzair.jaleel) Need to check this once. | |
288 transfer_id = gfx::ColorSpace::TransferID::INVALID; | |
289 break; | |
290 } | |
291 | |
292 switch (codec_context->colorspace) { | |
293 case AVCOL_SPC_RGB: | |
294 matrix_id = gfx::ColorSpace::MatrixID::RGB; | |
295 break; | |
296 case AVCOL_SPC_BT709: | |
297 case AVCOL_SPC_UNSPECIFIED: | |
298 case AVCOL_SPC_RESERVED: | |
299 matrix_id = gfx::ColorSpace::MatrixID::BT709; | |
300 break; | |
301 case AVCOL_SPC_FCC: | |
302 matrix_id = gfx::ColorSpace::MatrixID::FCC; | |
303 break; | |
304 case AVCOL_SPC_BT470BG: | |
305 matrix_id = gfx::ColorSpace::MatrixID::BT470BG; | |
306 break; | |
307 case AVCOL_SPC_SMPTE170M: | |
308 matrix_id = gfx::ColorSpace::MatrixID::SMPTE170M; | |
309 break; | |
310 case AVCOL_SPC_SMPTE240M: | |
311 matrix_id = gfx::ColorSpace::MatrixID::SMPTE240M; | |
312 break; | |
313 case AVCOL_SPC_YCOCG: | |
314 matrix_id = gfx::ColorSpace::MatrixID::YCOCG; | |
315 break; | |
316 case AVCOL_SPC_BT2020_NCL: | |
317 matrix_id = gfx::ColorSpace::MatrixID::BT2020_NCL; | |
318 break; | |
319 case AVCOL_SPC_BT2020_CL: | |
320 matrix_id = gfx::ColorSpace::MatrixID::BT2020_CL; | |
321 break; | |
322 case AVCOL_SPC_SMPTE2085: | |
323 matrix_id = gfx::ColorSpace::MatrixID::YDZDX; | |
324 break; | |
325 case AVCOL_SPC_NB: | |
326 // TODO(uzair.jaleel) Need to check this once. | |
327 matrix_id = gfx::ColorSpace::MatrixID::INVALID; | |
328 break; | |
329 } | |
330 | |
331 video_frame->set_color_space( | |
332 gfx::ColorSpace(primary_id, transfer_id, matrix_id, | |
333 codec_context->color_range != AVCOL_RANGE_MPEG | |
334 ? gfx::ColorSpace::RangeID::FULL | |
335 : gfx::ColorSpace::RangeID::LIMITED)); | |
196 } | 336 } |
197 | 337 |
198 for (size_t i = 0; i < VideoFrame::NumPlanes(video_frame->format()); i++) { | 338 for (size_t i = 0; i < VideoFrame::NumPlanes(video_frame->format()); i++) { |
199 frame->data[i] = video_frame->data(i); | 339 frame->data[i] = video_frame->data(i); |
200 frame->linesize[i] = video_frame->stride(i); | 340 frame->linesize[i] = video_frame->stride(i); |
201 } | 341 } |
202 | 342 |
203 frame->width = coded_size.width(); | 343 frame->width = coded_size.width(); |
204 frame->height = coded_size.height(); | 344 frame->height = coded_size.height(); |
205 frame->format = codec_context->pix_fmt; | 345 frame->format = codec_context->pix_fmt; |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
432 if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { | 572 if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { |
433 ReleaseFFmpegResources(); | 573 ReleaseFFmpegResources(); |
434 return false; | 574 return false; |
435 } | 575 } |
436 | 576 |
437 av_frame_.reset(av_frame_alloc()); | 577 av_frame_.reset(av_frame_alloc()); |
438 return true; | 578 return true; |
439 } | 579 } |
440 | 580 |
441 } // namespace media | 581 } // namespace media |
OLD | NEW |