| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | 5 #include "media/video/gpu_memory_buffer_video_frame_pool.h" |
| 6 | 6 |
| 7 #include <GLES2/gl2.h> | 7 #include <GLES2/gl2.h> |
| 8 #include <GLES2/gl2ext.h> | 8 #include <GLES2/gl2ext.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 return gfx::BufferFormat::R_8; | 175 return gfx::BufferFormat::R_8; |
| 176 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 176 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 177 DCHECK_LE(plane, 1u); | 177 DCHECK_LE(plane, 1u); |
| 178 return gfx::BufferFormat::YUV_420_BIPLANAR; | 178 return gfx::BufferFormat::YUV_420_BIPLANAR; |
| 179 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: | 179 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: |
| 180 DCHECK_LE(plane, 1u); | 180 DCHECK_LE(plane, 1u); |
| 181 return plane == 0 ? gfx::BufferFormat::R_8 : gfx::BufferFormat::RG_88; | 181 return plane == 0 ? gfx::BufferFormat::R_8 : gfx::BufferFormat::RG_88; |
| 182 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 182 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 183 DCHECK_EQ(0u, plane); | 183 DCHECK_EQ(0u, plane); |
| 184 return gfx::BufferFormat::UYVY_422; | 184 return gfx::BufferFormat::UYVY_422; |
| 185 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 186 DCHECK_EQ(0u, plane); |
| 187 return gfx::BufferFormat::YUYV_422; |
| 185 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 188 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 186 NOTREACHED(); | 189 NOTREACHED(); |
| 187 break; | 190 break; |
| 188 } | 191 } |
| 189 return gfx::BufferFormat::BGRA_8888; | 192 return gfx::BufferFormat::BGRA_8888; |
| 190 } | 193 } |
| 191 | 194 |
| 192 unsigned ImageInternalFormat(GpuVideoAcceleratorFactories::OutputFormat format, | 195 unsigned ImageInternalFormat(GpuVideoAcceleratorFactories::OutputFormat format, |
| 193 size_t plane) { | 196 size_t plane) { |
| 194 switch (format) { | 197 switch (format) { |
| 195 case GpuVideoAcceleratorFactories::OutputFormat::I420: | 198 case GpuVideoAcceleratorFactories::OutputFormat::I420: |
| 196 DCHECK_LE(plane, 2u); | 199 DCHECK_LE(plane, 2u); |
| 197 return GL_RED_EXT; | 200 return GL_RED_EXT; |
| 198 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: | 201 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: |
| 199 DCHECK_LE(plane, 1u); | 202 DCHECK_LE(plane, 1u); |
| 200 return plane == 0 ? GL_RED_EXT : GL_RG_EXT; | 203 return plane == 0 ? GL_RED_EXT : GL_RG_EXT; |
| 201 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 204 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 202 DCHECK_LE(plane, 1u); | 205 DCHECK_LE(plane, 1u); |
| 203 return GL_RGB_YCBCR_420V_CHROMIUM; | 206 return GL_RGB_YCBCR_420V_CHROMIUM; |
| 204 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 207 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 208 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 205 DCHECK_EQ(0u, plane); | 209 DCHECK_EQ(0u, plane); |
| 206 return GL_RGB_YCBCR_422_CHROMIUM; | 210 return GL_RGB_YCBCR_422_CHROMIUM; |
| 207 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 211 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 208 NOTREACHED(); | 212 NOTREACHED(); |
| 209 break; | 213 break; |
| 210 } | 214 } |
| 211 return 0; | 215 return 0; |
| 212 } | 216 } |
| 213 | 217 |
| 214 // The number of output planes to be copied in each iteration. | 218 // The number of output planes to be copied in each iteration. |
| 215 size_t PlanesPerCopy(GpuVideoAcceleratorFactories::OutputFormat format) { | 219 size_t PlanesPerCopy(GpuVideoAcceleratorFactories::OutputFormat format) { |
| 216 switch (format) { | 220 switch (format) { |
| 217 case GpuVideoAcceleratorFactories::OutputFormat::I420: | 221 case GpuVideoAcceleratorFactories::OutputFormat::I420: |
| 218 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 222 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 223 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 219 return 1; | 224 return 1; |
| 220 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: | 225 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: |
| 221 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 226 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 222 return 2; | 227 return 2; |
| 223 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 228 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 224 NOTREACHED(); | 229 NOTREACHED(); |
| 225 break; | 230 break; |
| 226 } | 231 } |
| 227 return 0; | 232 return 0; |
| 228 } | 233 } |
| 229 | 234 |
| 230 VideoPixelFormat VideoFormat( | 235 VideoPixelFormat VideoFormat( |
| 231 GpuVideoAcceleratorFactories::OutputFormat format) { | 236 GpuVideoAcceleratorFactories::OutputFormat format) { |
| 232 switch (format) { | 237 switch (format) { |
| 233 case GpuVideoAcceleratorFactories::OutputFormat::I420: | 238 case GpuVideoAcceleratorFactories::OutputFormat::I420: |
| 234 return PIXEL_FORMAT_I420; | 239 return PIXEL_FORMAT_I420; |
| 235 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 240 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 236 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: | 241 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: |
| 237 return PIXEL_FORMAT_NV12; | 242 return PIXEL_FORMAT_NV12; |
| 238 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 243 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 239 return PIXEL_FORMAT_UYVY; | 244 return PIXEL_FORMAT_UYVY; |
| 245 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 246 return PIXEL_FORMAT_YUY2; |
| 240 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 247 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 241 NOTREACHED(); | 248 NOTREACHED(); |
| 242 break; | 249 break; |
| 243 } | 250 } |
| 244 return PIXEL_FORMAT_UNKNOWN; | 251 return PIXEL_FORMAT_UNKNOWN; |
| 245 } | 252 } |
| 246 | 253 |
| 247 VideoPixelFormat FinalVideoFormat( | 254 VideoPixelFormat FinalVideoFormat( |
| 248 GpuVideoAcceleratorFactories::OutputFormat format) { | 255 GpuVideoAcceleratorFactories::OutputFormat format) { |
| 249 // Consumers should sample from NV12 textures as if they're XRGB. | 256 // Consumers should sample from NV12 textures as if they're XRGB. |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 first_row / 2 * source_frame->stride(VideoFrame::kUPlane), | 353 first_row / 2 * source_frame->stride(VideoFrame::kUPlane), |
| 347 source_frame->stride(VideoFrame::kUPlane), | 354 source_frame->stride(VideoFrame::kUPlane), |
| 348 source_frame->visible_data(VideoFrame::kVPlane) + | 355 source_frame->visible_data(VideoFrame::kVPlane) + |
| 349 first_row / 2 * source_frame->stride(VideoFrame::kVPlane), | 356 first_row / 2 * source_frame->stride(VideoFrame::kVPlane), |
| 350 source_frame->stride(VideoFrame::kVPlane), | 357 source_frame->stride(VideoFrame::kVPlane), |
| 351 output + first_row * dest_stride, dest_stride, width, rows); | 358 output + first_row * dest_stride, dest_stride, width, rows); |
| 352 } | 359 } |
| 353 done.Run(); | 360 done.Run(); |
| 354 } | 361 } |
| 355 | 362 |
| 363 void CopyRowsToYUYVBuffer(int first_row, |
| 364 int rows, |
| 365 int width, |
| 366 const scoped_refptr<VideoFrame>& source_frame, |
| 367 uint8_t* output, |
| 368 int dest_stride, |
| 369 const base::Closure& done) { |
| 370 TRACE_EVENT2("media", "CopyRowsToYUYVBuffer", "bytes_per_row", width * 2, |
| 371 "rows", rows); |
| 372 if (output) { |
| 373 DCHECK_NE(dest_stride, 0); |
| 374 DCHECK_LE(width, std::abs(dest_stride / 2)); |
| 375 DCHECK_EQ(0, first_row % 2); |
| 376 libyuv::I420ToYUY2( |
| 377 source_frame->visible_data(VideoFrame::kYPlane) + |
| 378 first_row * source_frame->stride(VideoFrame::kYPlane), |
| 379 source_frame->stride(VideoFrame::kYPlane), |
| 380 source_frame->visible_data(VideoFrame::kUPlane) + |
| 381 first_row / 2 * source_frame->stride(VideoFrame::kUPlane), |
| 382 source_frame->stride(VideoFrame::kUPlane), |
| 383 source_frame->visible_data(VideoFrame::kVPlane) + |
| 384 first_row / 2 * source_frame->stride(VideoFrame::kVPlane), |
| 385 source_frame->stride(VideoFrame::kVPlane), |
| 386 output + first_row * dest_stride, dest_stride, width, rows); |
| 387 } |
| 388 done.Run(); |
| 389 } |
| 390 |
| 356 gfx::Size CodedSize(const scoped_refptr<VideoFrame>& video_frame, | 391 gfx::Size CodedSize(const scoped_refptr<VideoFrame>& video_frame, |
| 357 GpuVideoAcceleratorFactories::OutputFormat output_format) { | 392 GpuVideoAcceleratorFactories::OutputFormat output_format) { |
| 358 DCHECK(gfx::Rect(video_frame->coded_size()) | 393 DCHECK(gfx::Rect(video_frame->coded_size()) |
| 359 .Contains(video_frame->visible_rect())); | 394 .Contains(video_frame->visible_rect())); |
| 360 DCHECK((video_frame->visible_rect().x() & 1) == 0); | 395 DCHECK((video_frame->visible_rect().x() & 1) == 0); |
| 361 gfx::Size output; | 396 gfx::Size output; |
| 362 switch (output_format) { | 397 switch (output_format) { |
| 363 case GpuVideoAcceleratorFactories::OutputFormat::I420: | 398 case GpuVideoAcceleratorFactories::OutputFormat::I420: |
| 364 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 399 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 365 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: | 400 case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: |
| 366 DCHECK((video_frame->visible_rect().y() & 1) == 0); | 401 DCHECK((video_frame->visible_rect().y() & 1) == 0); |
| 367 output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1, | 402 output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1, |
| 368 (video_frame->visible_rect().height() + 1) & ~1); | 403 (video_frame->visible_rect().height() + 1) & ~1); |
| 369 break; | 404 break; |
| 405 |
| 370 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 406 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 407 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 371 output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1, | 408 output = gfx::Size((video_frame->visible_rect().width() + 1) & ~1, |
| 372 video_frame->visible_rect().height()); | 409 video_frame->visible_rect().height()); |
| 373 break; | 410 break; |
| 374 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 411 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 375 NOTREACHED(); | 412 NOTREACHED(); |
| 376 } | 413 } |
| 377 DCHECK(gfx::Rect(video_frame->coded_size()).Contains(gfx::Rect(output))); | 414 DCHECK(gfx::Rect(video_frame->coded_size()).Contains(gfx::Rect(output))); |
| 378 return output; | 415 return output; |
| 379 } | 416 } |
| 380 } // unnamed namespace | 417 } // unnamed namespace |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 break; | 621 break; |
| 585 } | 622 } |
| 586 | 623 |
| 587 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 624 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 588 worker_task_runner_->PostTask( | 625 worker_task_runner_->PostTask( |
| 589 FROM_HERE, base::Bind(&CopyRowsToUYVYBuffer, row, rows_to_copy, | 626 FROM_HERE, base::Bind(&CopyRowsToUYVYBuffer, row, rows_to_copy, |
| 590 coded_size.width(), video_frame, | 627 coded_size.width(), video_frame, |
| 591 static_cast<uint8_t*>(buffer->memory(0)), | 628 static_cast<uint8_t*>(buffer->memory(0)), |
| 592 buffer->stride(0), barrier)); | 629 buffer->stride(0), barrier)); |
| 593 break; | 630 break; |
| 631 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 632 worker_task_runner_->PostTask( |
| 633 FROM_HERE, base::Bind(&CopyRowsToYUYVBuffer, row, rows_to_copy, |
| 634 coded_size.width(), video_frame, |
| 635 static_cast<uint8_t*>(buffer->memory(0)), |
| 636 buffer->stride(0), barrier)); |
| 637 break; |
| 638 |
| 594 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: | 639 case GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED: |
| 595 NOTREACHED(); | 640 NOTREACHED(); |
| 596 } | 641 } |
| 597 } | 642 } |
| 598 } | 643 } |
| 599 } | 644 } |
| 600 | 645 |
| 601 void GpuMemoryBufferVideoFramePool::PoolImpl:: | 646 void GpuMemoryBufferVideoFramePool::PoolImpl:: |
| 602 BindAndCreateMailboxesHardwareFrameResources( | 647 BindAndCreateMailboxesHardwareFrameResources( |
| 603 const scoped_refptr<VideoFrame>& video_frame, | 648 const scoped_refptr<VideoFrame>& video_frame, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 bool allow_overlay = false; | 717 bool allow_overlay = false; |
| 673 switch (output_format_) { | 718 switch (output_format_) { |
| 674 case GpuVideoAcceleratorFactories::OutputFormat::I420: | 719 case GpuVideoAcceleratorFactories::OutputFormat::I420: |
| 675 allow_overlay = | 720 allow_overlay = |
| 676 video_frame->metadata()->IsTrue(VideoFrameMetadata::ALLOW_OVERLAY); | 721 video_frame->metadata()->IsTrue(VideoFrameMetadata::ALLOW_OVERLAY); |
| 677 break; | 722 break; |
| 678 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: | 723 case GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB: |
| 679 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: | 724 case GpuVideoAcceleratorFactories::OutputFormat::UYVY: |
| 680 allow_overlay = true; | 725 allow_overlay = true; |
| 681 break; | 726 break; |
| 727 case GpuVideoAcceleratorFactories::OutputFormat::YUYV: |
| 728 // IA ChromeOS doesn't support overlay for YUYV GPU_READ_CPU_READ_WRITE |
| 729 // plane. |
| 730 break; |
| 682 default: | 731 default: |
| 683 break; | 732 break; |
| 684 } | 733 } |
| 685 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, | 734 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, |
| 686 allow_overlay); | 735 allow_overlay); |
| 687 | 736 |
| 688 base::TimeTicks render_time; | 737 base::TimeTicks render_time; |
| 689 if (video_frame->metadata()->GetTimeTicks(VideoFrameMetadata::REFERENCE_TIME, | 738 if (video_frame->metadata()->GetTimeTicks(VideoFrameMetadata::REFERENCE_TIME, |
| 690 &render_time)) { | 739 &render_time)) { |
| 691 frame->metadata()->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME, | 740 frame->metadata()->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME, |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 } | 875 } |
| 827 | 876 |
| 828 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( | 877 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( |
| 829 const scoped_refptr<VideoFrame>& video_frame, | 878 const scoped_refptr<VideoFrame>& video_frame, |
| 830 const FrameReadyCB& frame_ready_cb) { | 879 const FrameReadyCB& frame_ready_cb) { |
| 831 DCHECK(video_frame); | 880 DCHECK(video_frame); |
| 832 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); | 881 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); |
| 833 } | 882 } |
| 834 | 883 |
| 835 } // namespace media | 884 } // namespace media |
| OLD | NEW |