Index: cc/layers/video_layer_impl.cc |
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc |
index d63ab87c7ae41664b353642f6a4779a1f92b8ade..f245c11618eb4996f8dd13f4536e69884b9f3d60 100644 |
--- a/cc/layers/video_layer_impl.cc |
+++ b/cc/layers/video_layer_impl.cc |
@@ -23,6 +23,54 @@ |
namespace cc { |
+namespace { |
+ |
+gfx::BufferFormat GetBufferFormat(media::VideoPixelFormat pixel_format) { |
+ switch (pixel_format) { |
+ case media::PIXEL_FORMAT_YV12: |
+ return gfx::BufferFormat::YVU_420; |
+ case media::PIXEL_FORMAT_NV12: |
+ return gfx::BufferFormat::YUV_420_BIPLANAR; |
+ case media::PIXEL_FORMAT_UYVY: |
+ return gfx::BufferFormat::UYVY_422; |
+ case media::PIXEL_FORMAT_ARGB: |
+ return gfx::BufferFormat::BGRA_8888; |
+ case media::PIXEL_FORMAT_XRGB: |
+ return gfx::BufferFormat::BGRX_8888; |
+ case media::PIXEL_FORMAT_RGB32: |
+ return gfx::BufferFormat::RGBX_8888; |
+ case media::PIXEL_FORMAT_Y8: |
+ return gfx::BufferFormat::R_8; |
+ case media::PIXEL_FORMAT_Y16: |
+ return gfx::BufferFormat::RG_88; |
+ case media::PIXEL_FORMAT_UNKNOWN: |
+ case media::PIXEL_FORMAT_I420: |
+ case media::PIXEL_FORMAT_YV16: |
+ case media::PIXEL_FORMAT_YV12A: |
+ case media::PIXEL_FORMAT_YV24: |
+ case media::PIXEL_FORMAT_NV21: |
+ case media::PIXEL_FORMAT_YUY2: |
+ case media::PIXEL_FORMAT_RGB24: |
+ case media::PIXEL_FORMAT_MJPEG: |
+ case media::PIXEL_FORMAT_MT21: |
+ case media::PIXEL_FORMAT_YUV420P9: |
+ case media::PIXEL_FORMAT_YUV420P10: |
+ case media::PIXEL_FORMAT_YUV422P9: |
+ case media::PIXEL_FORMAT_YUV422P10: |
+ case media::PIXEL_FORMAT_YUV444P9: |
+ case media::PIXEL_FORMAT_YUV444P10: |
+ case media::PIXEL_FORMAT_YUV420P12: |
+ case media::PIXEL_FORMAT_YUV422P12: |
+ case media::PIXEL_FORMAT_YUV444P12: |
+ case media::PIXEL_FORMAT_I422: |
+ break; |
+ } |
+ NOTREACHED(); |
+ return gfx::BufferFormat::BGRA_8888; |
+} |
+ |
+} // namespace |
+ |
// static |
std::unique_ptr<VideoLayerImpl> VideoLayerImpl::Create( |
LayerTreeImpl* tree_impl, |
@@ -48,7 +96,12 @@ VideoLayerImpl::VideoLayerImpl( |
: LayerImpl(tree_impl, id), |
provider_client_impl_(std::move(provider_client_impl)), |
frame_(nullptr), |
- video_rotation_(video_rotation) { |
+ video_rotation_(video_rotation), |
+ frame_resource_type_(VideoFrameExternalResources::NONE), |
+ frame_pixel_format_(media::PIXEL_FORMAT_UNKNOWN), |
+ frame_resource_offset_(0.0f), |
+ frame_resource_multiplier_(1.0f), |
+ frame_bits_per_channel_(8) { |
set_may_contain_video(true); |
} |
@@ -109,6 +162,7 @@ bool VideoLayerImpl::WillDraw(DrawMode draw_mode, |
VideoFrameExternalResources external_resources = |
updater_->CreateExternalResourcesFromVideoFrame(frame_); |
frame_resource_type_ = external_resources.type; |
+ frame_pixel_format_ = external_resources.pixel_format; |
if (external_resources.type == |
VideoFrameExternalResources::SOFTWARE_RESOURCE) { |
@@ -320,7 +374,8 @@ void VideoLayerImpl::AppendQuads(RenderPass* render_pass, |
render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); |
stream_video_quad->SetNew(shared_quad_state, quad_rect, opaque_rect, |
visible_quad_rect, frame_resources_[0].id, |
- frame_resources_[0].size_in_pixels, scale); |
+ frame_resources_[0].size_in_pixels, |
+ GetBufferFormat(frame_pixel_format_), scale); |
ValidateQuadResources(stream_video_quad); |
break; |
} |