Chromium Code Reviews| Index: media/filters/ffmpeg_video_decoder.cc |
| diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc |
| index 1ed42bb9fb7c5ed0cd39c6ffc88cf9c492c6d959..67009ab5de23be4805c81cdd1955e1424ac2f462 100644 |
| --- a/media/filters/ffmpeg_video_decoder.cc |
| +++ b/media/filters/ffmpeg_video_decoder.cc |
| @@ -187,12 +187,152 @@ int FFmpegVideoDecoder::GetVideoBuffer(struct AVCodecContext* codec_context, |
| if (codec_context->color_primaries != AVCOL_PRI_UNSPECIFIED || |
| codec_context->color_trc != AVCOL_TRC_UNSPECIFIED || |
| codec_context->colorspace != AVCOL_SPC_UNSPECIFIED) { |
| - video_frame->set_color_space(gfx::ColorSpace::CreateVideo( |
| - codec_context->color_primaries, codec_context->color_trc, |
| - codec_context->colorspace, |
| - codec_context->color_range != AVCOL_RANGE_MPEG |
| - ? gfx::ColorSpace::RangeID::FULL |
| - : gfx::ColorSpace::RangeID::LIMITED)); |
| + 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.
|
| + gfx::ColorSpace::TransferID transfer_id; |
| + gfx::ColorSpace::MatrixID matrix_id; |
| + |
| + switch (codec_context->color_primaries) { |
| + case AVCOL_PRI_RESERVED0: |
| + case AVCOL_PRI_BT709: |
| + case AVCOL_PRI_UNSPECIFIED: |
| + case AVCOL_PRI_RESERVED: |
| + primary_id = gfx::ColorSpace::PrimaryID::BT709; |
| + break; |
| + case AVCOL_PRI_BT470M: |
| + primary_id = gfx::ColorSpace::PrimaryID::BT470M; |
| + break; |
| + case AVCOL_PRI_BT470BG: |
| + primary_id = gfx::ColorSpace::PrimaryID::BT470BG; |
| + break; |
| + case AVCOL_PRI_SMPTE170M: |
| + primary_id = gfx::ColorSpace::PrimaryID::SMPTE170M; |
| + break; |
| + case AVCOL_PRI_SMPTE240M: |
| + primary_id = gfx::ColorSpace::PrimaryID::SMPTE240M; |
| + break; |
| + case AVCOL_PRI_FILM: |
| + primary_id = gfx::ColorSpace::PrimaryID::FILM; |
| + break; |
| + case AVCOL_PRI_BT2020: |
| + primary_id = gfx::ColorSpace::PrimaryID::BT2020; |
| + break; |
| + case AVCOL_PRI_SMPTE428: |
| + primary_id = gfx::ColorSpace::PrimaryID::SMPTEST428_1; |
| + break; |
| + case AVCOL_PRI_SMPTE431: |
| + primary_id = gfx::ColorSpace::PrimaryID::SMPTEST431_2; |
| + break; |
| + case AVCOL_PRI_SMPTE432: |
| + primary_id = gfx::ColorSpace::PrimaryID::SMPTEST432_1; |
| + break; |
| + case AVCOL_PRI_NB: |
| + // TODO(uzair.jaleel) Need to check this once. |
| + primary_id = gfx::ColorSpace::PrimaryID::INVALID; |
| + break; |
| + } |
| + |
| + switch (codec_context->color_trc) { |
| + case AVCOL_TRC_RESERVED0: |
| + case AVCOL_TRC_BT709: |
| + case AVCOL_TRC_UNSPECIFIED: |
| + case AVCOL_TRC_RESERVED: |
| + transfer_id = gfx::ColorSpace::TransferID::BT709; |
| + break; |
| + case AVCOL_TRC_GAMMA22: |
| + transfer_id = gfx::ColorSpace::TransferID::GAMMA22; |
| + break; |
| + case AVCOL_TRC_GAMMA28: |
| + transfer_id = gfx::ColorSpace::TransferID::GAMMA28; |
| + break; |
| + case AVCOL_TRC_SMPTE170M: |
| + transfer_id = gfx::ColorSpace::TransferID::SMPTE170M; |
| + break; |
| + case AVCOL_TRC_SMPTE240M: |
| + transfer_id = gfx::ColorSpace::TransferID::SMPTE240M; |
| + break; |
| + case AVCOL_TRC_LINEAR: |
| + transfer_id = gfx::ColorSpace::TransferID::LINEAR; |
| + break; |
| + case AVCOL_TRC_LOG: |
| + transfer_id = gfx::ColorSpace::TransferID::LOG; |
| + break; |
| + case AVCOL_TRC_LOG_SQRT: |
| + transfer_id = gfx::ColorSpace::TransferID::LOG_SQRT; |
| + break; |
| + case AVCOL_TRC_IEC61966_2_4: |
| + transfer_id = gfx::ColorSpace::TransferID::IEC61966_2_4; |
| + break; |
| + case AVCOL_TRC_BT1361_ECG: |
| + transfer_id = gfx::ColorSpace::TransferID::BT1361_ECG; |
| + break; |
| + case AVCOL_TRC_IEC61966_2_1: |
| + transfer_id = gfx::ColorSpace::TransferID::IEC61966_2_1; |
| + break; |
| + case AVCOL_TRC_BT2020_10: |
| + transfer_id = gfx::ColorSpace::TransferID::BT2020_10; |
| + break; |
| + case AVCOL_TRC_BT2020_12: |
| + transfer_id = gfx::ColorSpace::TransferID::BT2020_12; |
| + break; |
| + case AVCOL_TRC_SMPTE2084: |
| + transfer_id = gfx::ColorSpace::TransferID::SMPTEST2084; |
| + break; |
| + case AVCOL_TRC_SMPTE428: |
| + transfer_id = gfx::ColorSpace::TransferID::SMPTEST428_1; |
| + break; |
| + case AVCOL_TRC_ARIB_STD_B67: |
| + transfer_id = gfx::ColorSpace::TransferID::ARIB_STD_B67; |
| + break; |
| + case AVCOL_TRC_NB: |
| + // TODO(uzair.jaleel) Need to check this once. |
| + transfer_id = gfx::ColorSpace::TransferID::INVALID; |
| + break; |
| + } |
| + |
| + switch (codec_context->colorspace) { |
| + case AVCOL_SPC_RGB: |
| + matrix_id = gfx::ColorSpace::MatrixID::RGB; |
| + break; |
| + case AVCOL_SPC_BT709: |
| + case AVCOL_SPC_UNSPECIFIED: |
| + case AVCOL_SPC_RESERVED: |
| + matrix_id = gfx::ColorSpace::MatrixID::BT709; |
| + break; |
| + case AVCOL_SPC_FCC: |
| + matrix_id = gfx::ColorSpace::MatrixID::FCC; |
| + break; |
| + case AVCOL_SPC_BT470BG: |
| + matrix_id = gfx::ColorSpace::MatrixID::BT470BG; |
| + break; |
| + case AVCOL_SPC_SMPTE170M: |
| + matrix_id = gfx::ColorSpace::MatrixID::SMPTE170M; |
| + break; |
| + case AVCOL_SPC_SMPTE240M: |
| + matrix_id = gfx::ColorSpace::MatrixID::SMPTE240M; |
| + break; |
| + case AVCOL_SPC_YCOCG: |
| + matrix_id = gfx::ColorSpace::MatrixID::YCOCG; |
| + break; |
| + case AVCOL_SPC_BT2020_NCL: |
| + matrix_id = gfx::ColorSpace::MatrixID::BT2020_NCL; |
| + break; |
| + case AVCOL_SPC_BT2020_CL: |
| + matrix_id = gfx::ColorSpace::MatrixID::BT2020_CL; |
| + break; |
| + case AVCOL_SPC_SMPTE2085: |
| + matrix_id = gfx::ColorSpace::MatrixID::YDZDX; |
| + break; |
| + case AVCOL_SPC_NB: |
| + // TODO(uzair.jaleel) Need to check this once. |
| + matrix_id = gfx::ColorSpace::MatrixID::INVALID; |
| + break; |
| + } |
| + |
| + video_frame->set_color_space( |
| + gfx::ColorSpace(primary_id, transfer_id, matrix_id, |
| + codec_context->color_range != AVCOL_RANGE_MPEG |
| + ? gfx::ColorSpace::RangeID::FULL |
| + : gfx::ColorSpace::RangeID::LIMITED)); |
| } |
| for (size_t i = 0; i < VideoFrame::NumPlanes(video_frame->format()); i++) { |