Add 444 support for vp9 decoder wrapper.
Chromting is trying vp9 444 to have better color. This fix is needed to decode 444 properly.
Bug: webrtc:11326
Change-Id: I4498930591d8876af9f6b7238a8c9fe450ecbfcc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166220
Commit-Queue: Jerome Jiang <jianj@google.com>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30410}
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc
index df53cda..3d9211f 100644
--- a/modules/video_coding/codecs/vp9/vp9_impl.cc
+++ b/modules/video_coding/codecs/vp9/vp9_impl.cc
@@ -1732,15 +1732,28 @@
rtc::scoped_refptr<VideoFrameBuffer> img_wrapped_buffer;
switch (img->bit_depth) {
case 8:
- img_wrapped_buffer = WrapI420Buffer(
- img->d_w, img->d_h, img->planes[VPX_PLANE_Y],
- img->stride[VPX_PLANE_Y], img->planes[VPX_PLANE_U],
- img->stride[VPX_PLANE_U], img->planes[VPX_PLANE_V],
- img->stride[VPX_PLANE_V],
- // WrappedI420Buffer's mechanism for allowing the release of its frame
- // buffer is through a callback function. This is where we should
- // release |img_buffer|.
- rtc::KeepRefUntilDone(img_buffer));
+ RTC_DCHECK(img->fmt == VPX_IMG_FMT_I420 || img->fmt == VPX_IMG_FMT_I444);
+ if (img->fmt == VPX_IMG_FMT_I420) {
+ img_wrapped_buffer = WrapI420Buffer(
+ img->d_w, img->d_h, img->planes[VPX_PLANE_Y],
+ img->stride[VPX_PLANE_Y], img->planes[VPX_PLANE_U],
+ img->stride[VPX_PLANE_U], img->planes[VPX_PLANE_V],
+ img->stride[VPX_PLANE_V],
+ // WrappedI420Buffer's mechanism for allowing the release of its
+ // frame buffer is through a callback function. This is where we
+ // should release |img_buffer|.
+ rtc::KeepRefUntilDone(img_buffer));
+ } else if (img->fmt == VPX_IMG_FMT_I444) {
+ img_wrapped_buffer = WrapI444Buffer(
+ img->d_w, img->d_h, img->planes[VPX_PLANE_Y],
+ img->stride[VPX_PLANE_Y], img->planes[VPX_PLANE_U],
+ img->stride[VPX_PLANE_U], img->planes[VPX_PLANE_V],
+ img->stride[VPX_PLANE_V],
+ // WrappedI444Buffer's mechanism for allowing the release of its
+ // frame buffer is through a callback function. This is where we
+ // should release |img_buffer|.
+ rtc::KeepRefUntilDone(img_buffer));
+ }
break;
case 10:
img_wrapped_buffer = WrapI010Buffer(