diff options
author | dcastagna <dcastagna@chromium.org> | 2015-09-01 19:59:58 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-02 03:00:31 +0000 |
commit | 6f19dc8a473ef7385d276e545453f397a0d91305 (patch) | |
tree | bc1d6df27ffa9d61db174afa4418f9b3f4a17e02 /media | |
parent | a763a242a4519c72dcaf30e0e9059d70589eb59c (diff) | |
download | chromium_src-6f19dc8a473ef7385d276e545453f397a0d91305.zip chromium_src-6f19dc8a473ef7385d276e545453f397a0d91305.tar.gz chromium_src-6f19dc8a473ef7385d276e545453f397a0d91305.tar.bz2 |
Check ycbcr422 extension to set VideoFrame to GMB format.
crrev.com/1305153005 and crrev.com/1308643003 added ycbcr_422_image
Chromium extension.
This CL select the correct VideoFrame format used to convert software
to GpuMemoryBuffer video frames based on the availability of the extension.
The internal format used for the images associated to the GMBs has
been corrected accordingly.
BUG=526311
Review URL: https://codereview.chromium.org/1306243010
Cr-Commit-Position: refs/heads/master@{#346828}
Diffstat (limited to 'media')
4 files changed, 23 insertions, 22 deletions
diff --git a/media/renderers/gpu_video_accelerator_factories.h b/media/renderers/gpu_video_accelerator_factories.h index 5a8ba0b..51740ad 100644 --- a/media/renderers/gpu_video_accelerator_factories.h +++ b/media/renderers/gpu_video_accelerator_factories.h @@ -74,7 +74,6 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories // Pixel format of the hardware video frames created when GpuMemoryBuffers // video frames are enabled. virtual VideoPixelFormat VideoFrameOutputFormat() = 0; - virtual bool IsTextureRGSupported() = 0; virtual gpu::gles2::GLES2Interface* GetGLES2Interface() = 0; diff --git a/media/renderers/mock_gpu_video_accelerator_factories.h b/media/renderers/mock_gpu_video_accelerator_factories.h index e78d824..28ff04f 100644 --- a/media/renderers/mock_gpu_video_accelerator_factories.h +++ b/media/renderers/mock_gpu_video_accelerator_factories.h @@ -61,7 +61,6 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { video_frame_output_format_ = video_frame_output_format; }; - MOCK_METHOD0(IsTextureRGSupported, bool()); MOCK_METHOD0(GetGLES2Interface, gpu::gles2::GLES2Interface*()); scoped_ptr<base::SharedMemory> CreateSharedMemory(size_t size) override; diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc index c1ff36c..0ef351c 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc @@ -17,6 +17,7 @@ #include "base/location.h" #include "base/memory/linked_ptr.h" #include "base/trace_event/trace_event.h" +#include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "media/renderers/gpu_video_accelerator_factories.h" #include "third_party/libyuv/include/libyuv.h" @@ -43,8 +44,7 @@ class GpuMemoryBufferVideoFramePool::PoolImpl gpu_factories_(gpu_factories), texture_target_(gpu_factories ? gpu_factories->ImageTextureTarget() : GL_TEXTURE_2D), - output_format_(gpu_factories ? gpu_factories->VideoFrameOutputFormat() - : PIXEL_FORMAT_I420) { + output_format_(PIXEL_FORMAT_UNKNOWN) { DCHECK(media_task_runner_); DCHECK(worker_task_runner_); } @@ -142,8 +142,9 @@ class GpuMemoryBufferVideoFramePool::PoolImpl std::list<FrameResources*> resources_pool_; const unsigned texture_target_; - const VideoPixelFormat output_format_; - + // TODO(dcastagna): change the following type from VideoPixelFormat to + // BufferFormat. + VideoPixelFormat output_format_; DISALLOW_COPY_AND_ASSIGN(PoolImpl); }; @@ -176,7 +177,7 @@ unsigned ImageInternalFormat(VideoPixelFormat format, size_t plane) { return GL_R8_EXT; case PIXEL_FORMAT_UYVY: DCHECK_EQ(0u, plane); - return GL_RGB; + return GL_RGB_YCBCR_422_CHROMIUM; default: NOTREACHED(); return 0; @@ -240,8 +241,17 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::CreateHardwareFrame( const scoped_refptr<VideoFrame>& video_frame, const FrameReadyCB& frame_ready_cb) { DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (!gpu_factories_ || (output_format_ == PIXEL_FORMAT_I420 && - !gpu_factories_->IsTextureRGSupported())) { + if (!gpu_factories_) { + frame_ready_cb.Run(video_frame); + return; + } + + // Lazily initialize output_format_ since VideoFrameOutputFormat() has to be + // called on the media_thread while this object might be instantiated on any. + if (output_format_ == PIXEL_FORMAT_UNKNOWN) + output_format_ = gpu_factories_->VideoFrameOutputFormat(); + + if (output_format_ == PIXEL_FORMAT_UNKNOWN) { frame_ready_cb.Run(video_frame); return; } diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc index 2449548..acf8c99 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc @@ -100,22 +100,21 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, NoGpuFactoryNoHardwareVideoFrame) { EXPECT_EQ(frame.get(), frame2.get()); } -TEST_F(GpuMemoryBufferVideoFramePoolTest, NoTextureRGNoHardwareVideoFrame) { - scoped_refptr<VideoFrame> frame = CreateTestYUVVideoFrame(10); +TEST_F(GpuMemoryBufferVideoFramePoolTest, VideoFrameOutputFormatUnknown) { + scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10); scoped_refptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories( new MockGpuVideoAcceleratorFactories); scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ = make_scoped_ptr(new GpuMemoryBufferVideoFramePool( media_task_runner_, copy_task_runner_.get(), mock_gpu_factories)); - EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported()) - .WillRepeatedly(testing::Return(false)); - scoped_refptr<VideoFrame> frame2; + mock_gpu_factories->SetVideoFrameOutputFormat(PIXEL_FORMAT_UNKNOWN); + scoped_refptr<VideoFrame> frame; gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( - frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame2)); + software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); RunUntilIdle(); - EXPECT_EQ(frame.get(), frame2.get()); + EXPECT_EQ(software_frame.get(), frame.get()); } TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareFrame) { @@ -128,8 +127,6 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareFrame) { EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface()) .WillRepeatedly(testing::Return(gles2_.get())); - EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported()) - .WillRepeatedly(testing::Return(true)); scoped_refptr<VideoFrame> frame; gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( @@ -151,8 +148,6 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, ReuseFirstResource) { EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface()) .WillRepeatedly(testing::Return(gles2_.get())); - EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported()) - .WillRepeatedly(testing::Return(true)); scoped_refptr<VideoFrame> frame; gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( @@ -196,8 +191,6 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, DropResourceWhenSizeIsDifferent) { EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface()) .WillRepeatedly(testing::Return(gles2_.get())); - EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported()) - .WillRepeatedly(testing::Return(true)); scoped_refptr<VideoFrame> frame; gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |