Index: cc/resources/video_resource_updater.cc |
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc |
index dadc62a3719476fa2a27d0094e7dc7f08046aa14..994b6eb2a3811a832050caf4ccf6404173e080da 100644 |
--- a/cc/resources/video_resource_updater.cc |
+++ b/cc/resources/video_resource_updater.cc |
@@ -25,6 +25,49 @@ namespace { |
const ResourceFormat kRGBResourceFormat = RGBA_8888; |
+VideoFrameExternalResources::ResourceType ResourceTypeForVideoFrame( |
+ media::VideoFrame* video_frame) { |
+ switch (video_frame->format()) { |
+ case media::PIXEL_FORMAT_ARGB: |
+ case media::PIXEL_FORMAT_XRGB: |
+ case media::PIXEL_FORMAT_UYVY: |
+ switch (video_frame->mailbox_holder(0).texture_target) { |
+ case GL_TEXTURE_2D: |
+ return (video_frame->format() == media::PIXEL_FORMAT_XRGB) |
+ ? VideoFrameExternalResources::RGB_RESOURCE |
+ : VideoFrameExternalResources::RGBA_RESOURCE; |
+ case GL_TEXTURE_EXTERNAL_OES: |
+ return VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE; |
+ case GL_TEXTURE_RECTANGLE_ARB: |
+ return VideoFrameExternalResources::IO_SURFACE; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ break; |
+ case media::PIXEL_FORMAT_I420: |
+ return VideoFrameExternalResources::YUV_RESOURCE; |
+ break; |
+ case media::PIXEL_FORMAT_NV12: |
+ DCHECK_EQ(static_cast<uint32_t>(GL_TEXTURE_RECTANGLE_ARB), |
+ video_frame->mailbox_holder(0).texture_target); |
+ return VideoFrameExternalResources::IO_SURFACE; |
+ break; |
+ case media::PIXEL_FORMAT_YV12: |
+ case media::PIXEL_FORMAT_YV16: |
+ case media::PIXEL_FORMAT_YV24: |
+ case media::PIXEL_FORMAT_YV12A: |
+ case media::PIXEL_FORMAT_NV21: |
+ case media::PIXEL_FORMAT_YUY2: |
+ case media::PIXEL_FORMAT_RGB24: |
+ case media::PIXEL_FORMAT_RGB32: |
+ case media::PIXEL_FORMAT_MJPEG: |
+ case media::PIXEL_FORMAT_UNKNOWN: |
+ break; |
+ } |
+ return VideoFrameExternalResources::NONE; |
+} |
+ |
class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
public: |
explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl, |
@@ -375,56 +418,21 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
if (!context_provider_) |
return VideoFrameExternalResources(); |
- const size_t textures = media::VideoFrame::NumPlanes(video_frame->format()); |
- DCHECK_GE(textures, 1u); |
VideoFrameExternalResources external_resources; |
external_resources.read_lock_fences_enabled = true; |
- switch (video_frame->format()) { |
- case media::PIXEL_FORMAT_ARGB: |
- case media::PIXEL_FORMAT_XRGB: |
- case media::PIXEL_FORMAT_UYVY: |
- DCHECK_EQ(1u, textures); |
- switch (video_frame->mailbox_holder(0).texture_target) { |
- case GL_TEXTURE_2D: |
- external_resources.type = |
- (video_frame->format() == media::PIXEL_FORMAT_XRGB) |
- ? VideoFrameExternalResources::RGB_RESOURCE |
- : VideoFrameExternalResources::RGBA_RESOURCE; |
- break; |
- case GL_TEXTURE_EXTERNAL_OES: |
- external_resources.type = |
- VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE; |
- break; |
- case GL_TEXTURE_RECTANGLE_ARB: |
- external_resources.type = VideoFrameExternalResources::IO_SURFACE; |
- break; |
- default: |
- NOTREACHED(); |
- return VideoFrameExternalResources(); |
- } |
- break; |
- case media::PIXEL_FORMAT_I420: |
- external_resources.type = VideoFrameExternalResources::YUV_RESOURCE; |
- break; |
- case media::PIXEL_FORMAT_YV12: |
- case media::PIXEL_FORMAT_YV16: |
- case media::PIXEL_FORMAT_YV24: |
- case media::PIXEL_FORMAT_YV12A: |
- case media::PIXEL_FORMAT_NV12: |
- case media::PIXEL_FORMAT_NV21: |
- case media::PIXEL_FORMAT_YUY2: |
- case media::PIXEL_FORMAT_RGB24: |
- case media::PIXEL_FORMAT_RGB32: |
- case media::PIXEL_FORMAT_MJPEG: |
- case media::PIXEL_FORMAT_UNKNOWN: |
- DLOG(ERROR) << "Unsupported Texture format" |
- << media::VideoPixelFormatToString(video_frame->format()); |
- return external_resources; |
+ |
+ external_resources.type = ResourceTypeForVideoFrame(video_frame.get()); |
+ if (external_resources.type == VideoFrameExternalResources::NONE) { |
+ DLOG(ERROR) << "Unsupported Texture format" |
+ << media::VideoPixelFormatToString(video_frame->format()); |
+ return external_resources; |
} |
- DCHECK_NE(VideoFrameExternalResources::NONE, external_resources.type); |
- for (size_t i = 0; i < textures; ++i) { |
+ const size_t num_planes = media::VideoFrame::NumPlanes(video_frame->format()); |
+ for (size_t i = 0; i < num_planes; ++i) { |
const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i); |
+ if (mailbox_holder.mailbox.IsZero()) |
+ break; |
external_resources.mailboxes.push_back( |
TextureMailbox(mailbox_holder.mailbox, mailbox_holder.texture_target, |
mailbox_holder.sync_point, video_frame->coded_size(), |