[go: nahoru, domu]

make VP9Decoder understand color spaces

This should make VP9Decoder set color spaces on returned
video frames correctly on windows and chromeos.

Bug: 647725, 847573
Change-Id: I602e61e078795a511caef134256a0676199f031e
Reviewed-on: https://chromium-review.googlesource.com/c/1298635
Commit-Queue: Fredrik Hubinette <hubbe@chromium.org>
Reviewed-by: Miguel Casas <mcasas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#603270}
diff --git a/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc
index 72375b260..3b40f0ef 100644
--- a/media/gpu/vp9_decoder.cc
+++ b/media/gpu/vp9_decoder.cc
@@ -17,8 +17,10 @@
 
 VP9Decoder::VP9Accelerator::~VP9Accelerator() {}
 
-VP9Decoder::VP9Decoder(std::unique_ptr<VP9Accelerator> accelerator)
+VP9Decoder::VP9Decoder(std::unique_ptr<VP9Accelerator> accelerator,
+                       const VideoColorSpace& container_color_space)
     : state_(kNeedStreamMetadata),
+      container_color_space_(container_color_space),
       accelerator_(std::move(accelerator)),
       parser_(accelerator_->IsFrameContextRequired()) {
   ref_frames_.resize(kVp9NumRefFrames);
@@ -176,6 +178,13 @@
 
     pic->set_visible_rect(new_render_rect);
     pic->set_bitstream_id(stream_id_);
+
+    // For VP9, container color spaces override video stream color spaces.
+    if (container_color_space_.IsSpecified()) {
+      pic->set_colorspace(container_color_space_);
+    } else if (curr_frame_hdr_) {
+      pic->set_colorspace(curr_frame_hdr_->GetColorSpace());
+    }
     pic->frame_hdr = std::move(curr_frame_hdr_);
 
     if (!DecodeAndOutputPicture(pic)) {