From fad2aa23b406ca5d85b8aa9ab891f2067e51c782 Mon Sep 17 00:00:00 2001 From: Emircan Uysaler Date: Mon, 23 Jul 2018 18:07:01 -0700 Subject: [PATCH] Extract color space from Vp8 decoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Makes use of ColorSpace class to extract info from Vp8 stream. Bug: webrtc:9522 Change-Id: Id9d46eeea5497c4da31db27bfcf2743612ae4157 Reviewed-on: https://webrtc-review.googlesource.com/90183 Reviewed-by: Erik Språng Commit-Queue: Emircan Uysaler Cr-Commit-Position: refs/heads/master@{#24086} --- .../codecs/vp8/libvpx_vp8_decoder.cc | 26 +++++++++++++++++-- .../codecs/vp8/test/vp8_impl_unittest.cc | 6 +++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.cc index 49959ef54c..0f0db46890 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.cc @@ -12,6 +12,7 @@ #include #include "absl/memory/memory.h" +#include "api/video/color_space.h" #include "common_video/libyuv/include/webrtc_libyuv.h" #include "modules/video_coding/codecs/vp8/libvpx_vp8_decoder.h" #include "rtc_base/checks.h" @@ -305,8 +306,29 @@ int LibvpxVp8Decoder::ReturnFrame(const vpx_image_t* img, buffer->MutableDataV(), buffer->StrideV(), img->d_w, img->d_h); - VideoFrame decoded_image(buffer, timestamp, 0, kVideoRotation_0); - decoded_image.set_ntp_time_ms(ntp_time_ms); + ColorSpace::RangeID range = ColorSpace::RangeID::kInvalid; + switch (img->range) { + case VPX_CR_STUDIO_RANGE: + range = ColorSpace::RangeID::kLimited; + break; + case VPX_CR_FULL_RANGE: + range = ColorSpace::RangeID::kFull; + break; + default: + break; + } + + VideoFrame decoded_image = + VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_ms(0) + .set_timestamp_rtp(timestamp) + .set_ntp_time_ms(ntp_time_ms) + .set_rotation(webrtc::kVideoRotation_0) + .set_color_space(ColorSpace(ColorSpace::PrimaryID::kSMPTE170M, + ColorSpace::TransferID::kSMPTE170M, + ColorSpace::MatrixID::kSMPTE170M, range)) + .build(); decode_complete_callback_->Decoded(decoded_image, absl::nullopt, qp); return WEBRTC_VIDEO_CODEC_OK; diff --git a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc index a3d7cd985a..4dc4fdb4a9 100644 --- a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc +++ b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc @@ -256,6 +256,12 @@ TEST_F(TestVp8Impl, MAYBE_AlignedStrideEncodeDecode) { EXPECT_GT(I420PSNR(input_frame, decoded_frame.get()), 36); EXPECT_EQ(kInitialTimestampRtp, decoded_frame->timestamp()); EXPECT_EQ(kTestNtpTimeMs, decoded_frame->ntp_time_ms()); + + const ColorSpace color_space = decoded_frame->color_space().value(); + EXPECT_EQ(ColorSpace::PrimaryID::kSMPTE170M, color_space.primaries()); + EXPECT_EQ(ColorSpace::TransferID::kSMPTE170M, color_space.transfer()); + EXPECT_EQ(ColorSpace::MatrixID::kSMPTE170M, color_space.matrix()); + EXPECT_EQ(ColorSpace::RangeID::kLimited, color_space.range()); } #if defined(WEBRTC_ANDROID)