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++) { |