[go: nahoru, domu]

media/gpu: Confirm a video is YUV 4:2:0 in AcceleratedVideoDecoder

Existing hardware decoders support only YUV 4:2:0 videos. We
currently rely the underlying libraries and drivers to deny non
YUV 4:2:0 videos. We would rater confirm it in
AcceleratedVideoDecoder. From this CL,
AcceleratedVideoDecoder::Decode() returns kDecodeError if
a video is not YUV 4:2:0.

Bug: b:172223934
Test: media_unittests
Change-Id: Ib0ddbe526a801476e382f0b7665a74573bd6a28d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2562618
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Miguel Casas <mcasas@chromium.org>
Reviewed-by: Andres Calderon Jaramillo <andrescj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833594}
diff --git a/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc
index bdaba57..fda81b91 100644
--- a/media/gpu/vp9_decoder.cc
+++ b/media/gpu/vp9_decoder.cc
@@ -70,6 +70,11 @@
       return false;
   }
 }
+
+bool IsYUV420Sequence(const Vp9FrameHeader& frame_header) {
+  // Spec 7.2.2
+  return frame_header.subsampling_x == 1u && frame_header.subsampling_y == 1u;
+}
 }  // namespace
 
 VP9Decoder::VP9Accelerator::VP9Accelerator() {}
@@ -237,6 +242,10 @@
                << ", profile=" << GetProfileName(new_profile);
       return kDecodeError;
     }
+    if (!IsYUV420Sequence(*curr_frame_hdr_)) {
+      DVLOG(1) << "Only YUV 4:2:0 is supported";
+      return kDecodeError;
+    }
 
     DCHECK(!new_pic_size.IsEmpty());
     if (new_pic_size != pic_size_ || new_profile != profile_ ||