| Index: media/video/gpu_memory_buffer_video_frame_pool.cc
|
| diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| index d75f7aaa690b4b5a2442be1d1797cb642a86eb92..8608f6a84ff23eca9930994ad4bfbd43ee136afe 100644
|
| --- a/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
|
| @@ -182,6 +182,9 @@ gfx::BufferFormat GpuMemoryBufferFormat(
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| DCHECK_EQ(0u, plane);
|
| return gfx::BufferFormat::UYVY_422;
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| + DCHECK_EQ(0u, plane);
|
| + return gfx::BufferFormat::YUYV_422;
|
| case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED:
|
| NOTREACHED();
|
| break;
|
| @@ -202,6 +205,7 @@ unsigned ImageInternalFormat(GpuVideoAcceleratorFactories::OutputFormat format,
|
| DCHECK_LE(plane, 1u);
|
| return GL_RGB_YCBCR_420V_CHROMIUM;
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| DCHECK_EQ(0u, plane);
|
| return GL_RGB_YCBCR_422_CHROMIUM;
|
| case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED:
|
| @@ -216,6 +220,7 @@ size_t PlanesPerCopy(GpuVideoAcceleratorFactories::OutputFormat format) {
|
| switch (format) {
|
| case GpuVideoAcceleratorFactories::OutputFormat::I420:
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| return 1;
|
| case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB:
|
| case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB:
|
| @@ -237,6 +242,8 @@ VideoPixelFormat VideoFormat(
|
| return PIXEL_FORMAT_NV12;
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| return PIXEL_FORMAT_UYVY;
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| + return PIXEL_FORMAT_YUY2;
|
| case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED:
|
| NOTREACHED();
|
| break;
|
| @@ -353,6 +360,34 @@ void CopyRowsToUYVYBuffer(int first_row,
|
| done.Run();
|
| }
|
|
|
| +void CopyRowsToYUYVBuffer(int first_row,
|
| + int rows,
|
| + int width,
|
| + const scoped_refptr<VideoFrame>& source_frame,
|
| + uint8_t* output,
|
| + int dest_stride,
|
| + const base::Closure& done) {
|
| + TRACE_EVENT2("media", "CopyRowsToYUYVBuffer", "bytes_per_row", width * 2,
|
| + "rows", rows);
|
| + if (output) {
|
| + DCHECK_NE(dest_stride, 0);
|
| + DCHECK_LE(width, std::abs(dest_stride / 2));
|
| + DCHECK_EQ(0, first_row % 2);
|
| + libyuv::I420ToYUY2(
|
| + source_frame->visible_data(VideoFrame::kYPlane) +
|
| + first_row * source_frame->stride(VideoFrame::kYPlane),
|
| + source_frame->stride(VideoFrame::kYPlane),
|
| + source_frame->visible_data(VideoFrame::kUPlane) +
|
| + first_row / 2 * source_frame->stride(VideoFrame::kUPlane),
|
| + source_frame->stride(VideoFrame::kUPlane),
|
| + source_frame->visible_data(VideoFrame::kVPlane) +
|
| + first_row / 2 * source_frame->stride(VideoFrame::kVPlane),
|
| + source_frame->stride(VideoFrame::kVPlane),
|
| + output + first_row * dest_stride, dest_stride, width, rows);
|
| + }
|
| + done.Run();
|
| +}
|
| +
|
| gfx::Size CodedSize(const scoped_refptr<VideoFrame>& video_frame,
|
| GpuVideoAcceleratorFactories::OutputFormat output_format) {
|
| DCHECK(gfx::Rect(video_frame->coded_size())
|
| @@ -367,7 +402,9 @@ gfx::Size CodedSize(const scoped_refptr<VideoFrame>& video_frame,
|
| output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1,
|
| (video_frame->visible_rect().height() + 1) & ~1);
|
| break;
|
| +
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1,
|
| video_frame->visible_rect().height());
|
| break;
|
| @@ -591,6 +628,14 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::CopyVideoFrameToGpuMemoryBuffers(
|
| static_cast<uint8_t*>(buffer->memory(0)),
|
| buffer->stride(0), barrier));
|
| break;
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| + worker_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CopyRowsToYUYVBuffer, row, rows_to_copy,
|
| + coded_size.width(), video_frame,
|
| + static_cast<uint8_t*>(buffer->memory(0)),
|
| + buffer->stride(0), barrier));
|
| + break;
|
| +
|
| case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED:
|
| NOTREACHED();
|
| }
|
| @@ -679,6 +724,10 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
|
| case GpuVideoAcceleratorFactories::OutputFormat::UYVY:
|
| allow_overlay = true;
|
| break;
|
| + case GpuVideoAcceleratorFactories::OutputFormat::YUYV:
|
| + // IA ChromeOS doesn't support overlay for YUYV GPU_READ_CPU_READ_WRITE
|
| + // plane.
|
| + break;
|
| default:
|
| break;
|
| }
|
|
|