Chromium Code Reviews| 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 |