summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authordcastagna <dcastagna@chromium.org>2015-09-01 19:59:58 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-02 03:00:31 +0000
commit6f19dc8a473ef7385d276e545453f397a0d91305 (patch)
treebc1d6df27ffa9d61db174afa4418f9b3f4a17e02 /media
parenta763a242a4519c72dcaf30e0e9059d70589eb59c (diff)
downloadchromium_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')
-rw-r--r--media/renderers/gpu_video_accelerator_factories.h1
-rw-r--r--media/renderers/mock_gpu_video_accelerator_factories.h1
-rw-r--r--media/video/gpu_memory_buffer_video_frame_pool.cc24
-rw-r--r--media/video/gpu_memory_buffer_video_frame_pool_unittest.cc19
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(