Chromium Code Reviews| 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 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 // output size is |kBytesPerCopyTarget| bytes and run in parallel. | 153 // output size is |kBytesPerCopyTarget| bytes and run in parallel. |
| 154 const size_t kBytesPerCopyTarget = 1024 * 1024; // 1MB | 154 const size_t kBytesPerCopyTarget = 1024 * 1024; // 1MB |
| 155 | 155 |
| 156 // Return the GpuMemoryBuffer format to use for a specific VideoPixelFormat | 156 // Return the GpuMemoryBuffer format to use for a specific VideoPixelFormat |
| 157 // and plane. | 157 // and plane. |
| 158 gfx::BufferFormat GpuMemoryBufferFormat(VideoPixelFormat format, size_t plane) { | 158 gfx::BufferFormat GpuMemoryBufferFormat(VideoPixelFormat format, size_t plane) { |
| 159 switch (format) { | 159 switch (format) { |
| 160 case PIXEL_FORMAT_I420: | 160 case PIXEL_FORMAT_I420: |
| 161 DCHECK_LE(plane, 2u); | 161 DCHECK_LE(plane, 2u); |
| 162 return gfx::BufferFormat::R_8; | 162 return gfx::BufferFormat::R_8; |
| 163 case PIXEL_FORMAT_NV12: | |
| 164 DCHECK_LE(plane, 1u); | |
| 165 return gfx::BufferFormat::YUV_420_BIPLANAR; | |
| 163 case PIXEL_FORMAT_UYVY: | 166 case PIXEL_FORMAT_UYVY: |
| 164 DCHECK_EQ(0u, plane); | 167 DCHECK_EQ(0u, plane); |
| 165 return gfx::BufferFormat::UYVY_422; | 168 return gfx::BufferFormat::UYVY_422; |
| 166 default: | 169 default: |
| 167 NOTREACHED(); | 170 NOTREACHED(); |
| 168 return gfx::BufferFormat::BGRA_8888; | 171 return gfx::BufferFormat::BGRA_8888; |
| 169 } | 172 } |
| 170 } | 173 } |
| 171 | 174 |
| 172 unsigned ImageInternalFormat(VideoPixelFormat format, size_t plane) { | 175 unsigned ImageInternalFormat(VideoPixelFormat format, size_t plane) { |
| 173 switch (format) { | 176 switch (format) { |
| 174 case PIXEL_FORMAT_I420: | 177 case PIXEL_FORMAT_I420: |
| 175 DCHECK_LE(plane, 2u); | 178 DCHECK_LE(plane, 2u); |
| 176 return GL_R8_EXT; | 179 return GL_R8_EXT; |
| 180 case PIXEL_FORMAT_NV12: | |
| 181 DCHECK_LE(plane, 1u); | |
| 182 return GL_R8_EXT; | |
|
Daniele Castagna
2015/08/31 16:28:14
Here we need the new internal format, it should be
Andre
2015/08/31 18:29:31
Great, thanks!
Andre
2015/09/08 20:20:45
dcastagna, I've changed this to NOTREACHED().
Shou
| |
| 177 case PIXEL_FORMAT_UYVY: | 183 case PIXEL_FORMAT_UYVY: |
| 178 DCHECK_EQ(0u, plane); | 184 DCHECK_EQ(0u, plane); |
| 179 return GL_RGB; | 185 return GL_RGB; |
| 180 default: | 186 default: |
| 181 NOTREACHED(); | 187 NOTREACHED(); |
| 182 return 0; | 188 return 0; |
| 183 } | 189 } |
| 184 } | 190 } |
| 185 | 191 |
| 192 // The number of output planes to be copied in each iteration. | |
| 193 size_t PlanesPerCopy(VideoPixelFormat format) { | |
| 194 switch (format) { | |
| 195 case PIXEL_FORMAT_I420: | |
| 196 case PIXEL_FORMAT_UYVY: | |
| 197 return 1; | |
| 198 case PIXEL_FORMAT_NV12: | |
| 199 return 2; | |
| 200 default: | |
| 201 NOTREACHED(); | |
| 202 return 0; | |
| 203 } | |
| 204 } | |
| 205 | |
| 206 // The number of output rows to be copied in each iteration. | |
| 207 int RowsPerCopy(size_t plane, VideoPixelFormat format, int width) { | |
| 208 int bytes_per_row = VideoFrame::RowBytes(plane, format, width); | |
| 209 if (format == PIXEL_FORMAT_NV12) { | |
| 210 DCHECK_EQ(0u, plane); | |
| 211 bytes_per_row += VideoFrame::RowBytes(1, format, width); | |
| 212 } | |
| 213 // Copy a even number of lines, and at least one. | |
|
Daniele Castagna
2015/08/31 16:28:14
nit: shouldn't it be "an even"
Andre
2015/08/31 18:29:31
Done.
| |
| 214 return std::max<size_t>((kBytesPerCopyTarget / bytes_per_row) & ~1, 1); | |
| 215 } | |
| 216 | |
| 186 void CopyRowsToI420Buffer(int first_row, | 217 void CopyRowsToI420Buffer(int first_row, |
| 187 int rows, | 218 int rows, |
| 188 int bytes_per_row, | 219 int bytes_per_row, |
| 189 const uint8* source, | 220 const uint8* source, |
| 190 int source_stride, | 221 int source_stride, |
| 191 uint8* output, | 222 uint8* output, |
| 192 int dest_stride, | 223 int dest_stride, |
| 193 const base::Closure& done) { | 224 const base::Closure& done) { |
| 194 TRACE_EVENT2("media", "CopyRowsToI420Buffer", "bytes_per_row", bytes_per_row, | 225 TRACE_EVENT2("media", "CopyRowsToI420Buffer", "bytes_per_row", bytes_per_row, |
| 195 "rows", rows); | 226 "rows", rows); |
| 196 DCHECK_NE(dest_stride, 0); | 227 DCHECK_NE(dest_stride, 0); |
| 197 DCHECK_LE(bytes_per_row, std::abs(dest_stride)); | 228 DCHECK_LE(bytes_per_row, std::abs(dest_stride)); |
| 198 DCHECK_LE(bytes_per_row, source_stride); | 229 DCHECK_LE(bytes_per_row, source_stride); |
| 199 for (int row = first_row; row < first_row + rows; ++row) { | 230 for (int row = first_row; row < first_row + rows; ++row) { |
| 200 memcpy(output + dest_stride * row, source + source_stride * row, | 231 memcpy(output + dest_stride * row, source + source_stride * row, |
| 201 bytes_per_row); | 232 bytes_per_row); |
| 202 } | 233 } |
| 203 done.Run(); | 234 done.Run(); |
| 204 } | 235 } |
| 205 | 236 |
| 237 void CopyRowsToNV12Buffer(int first_row, | |
| 238 int rows, | |
| 239 int bytes_per_row, | |
| 240 const scoped_refptr<VideoFrame>& source_frame, | |
| 241 uint8* dest_y, | |
| 242 int dest_stride_y, | |
| 243 uint8* dest_uv, | |
| 244 int dest_stride_uv, | |
| 245 const base::Closure& done) { | |
| 246 TRACE_EVENT2("media", "CopyRowsToNV12Buffer", "bytes_per_row", bytes_per_row, | |
| 247 "rows", rows); | |
| 248 DCHECK_NE(dest_stride_y, 0); | |
| 249 DCHECK_NE(dest_stride_uv, 0); | |
| 250 DCHECK_LE(bytes_per_row, std::abs(dest_stride_y)); | |
| 251 DCHECK_LE(bytes_per_row, std::abs(dest_stride_uv)); | |
| 252 DCHECK_EQ(0, first_row % 2); | |
| 253 libyuv::I420ToNV12( | |
| 254 source_frame->data(VideoFrame::kYPlane) + | |
| 255 first_row * source_frame->stride(VideoFrame::kYPlane), | |
| 256 source_frame->stride(VideoFrame::kYPlane), | |
| 257 source_frame->data(VideoFrame::kUPlane) + | |
| 258 first_row / 2 * source_frame->stride(VideoFrame::kUPlane), | |
| 259 source_frame->stride(VideoFrame::kUPlane), | |
| 260 source_frame->data(VideoFrame::kVPlane) + | |
| 261 first_row / 2 * source_frame->stride(VideoFrame::kVPlane), | |
| 262 source_frame->stride(VideoFrame::kVPlane), | |
| 263 dest_y + first_row * dest_stride_y, dest_stride_y, | |
| 264 dest_uv + first_row / 2 * dest_stride_uv, dest_stride_uv, | |
| 265 bytes_per_row, rows); | |
| 266 done.Run(); | |
| 267 } | |
| 268 | |
| 206 void CopyRowsToUYVYBuffer(int first_row, | 269 void CopyRowsToUYVYBuffer(int first_row, |
| 207 int rows, | 270 int rows, |
| 208 int width, | 271 int width, |
| 209 const scoped_refptr<VideoFrame>& source_frame, | 272 const scoped_refptr<VideoFrame>& source_frame, |
| 210 uint8* output, | 273 uint8* output, |
| 211 int dest_stride, | 274 int dest_stride, |
| 212 const base::Closure& done) { | 275 const base::Closure& done) { |
| 213 TRACE_EVENT2("media", "CopyRowsToUYVYBuffer", "bytes_per_row", width * 2, | 276 TRACE_EVENT2("media", "CopyRowsToUYVYBuffer", "bytes_per_row", width * 2, |
| 214 "rows", rows); | 277 "rows", rows); |
| 215 DCHECK_NE(dest_stride, 0); | 278 DCHECK_NE(dest_stride, 0); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 | 339 |
| 277 worker_task_runner_->PostTask( | 340 worker_task_runner_->PostTask( |
| 278 FROM_HERE, base::Bind(&PoolImpl::CopyVideoFrameToGpuMemoryBuffers, this, | 341 FROM_HERE, base::Bind(&PoolImpl::CopyVideoFrameToGpuMemoryBuffers, this, |
| 279 video_frame, frame_resources, frame_ready_cb)); | 342 video_frame, frame_resources, frame_ready_cb)); |
| 280 } | 343 } |
| 281 | 344 |
| 282 void GpuMemoryBufferVideoFramePool::PoolImpl::OnCopiesDone( | 345 void GpuMemoryBufferVideoFramePool::PoolImpl::OnCopiesDone( |
| 283 const scoped_refptr<VideoFrame>& video_frame, | 346 const scoped_refptr<VideoFrame>& video_frame, |
| 284 FrameResources* frame_resources, | 347 FrameResources* frame_resources, |
| 285 const FrameReadyCB& frame_ready_cb) { | 348 const FrameReadyCB& frame_ready_cb) { |
| 286 const size_t planes = VideoFrame::NumPlanes(output_format_); | 349 for (const auto& plane_resource : frame_resources->plane_resources) { |
| 287 for (size_t i = 0; i < planes; ++i) { | 350 if (plane_resource.gpu_memory_buffer) |
| 288 frame_resources->plane_resources[i].gpu_memory_buffer->Unmap(); | 351 plane_resource.gpu_memory_buffer->Unmap(); |
| 289 } | 352 } |
| 290 | 353 |
| 291 media_task_runner_->PostTask( | 354 media_task_runner_->PostTask( |
| 292 FROM_HERE, | 355 FROM_HERE, |
| 293 base::Bind(&PoolImpl::BindAndCreateMailboxesHardwareFrameResources, this, | 356 base::Bind(&PoolImpl::BindAndCreateMailboxesHardwareFrameResources, this, |
| 294 video_frame, frame_resources, frame_ready_cb)); | 357 video_frame, frame_resources, frame_ready_cb)); |
| 295 } | 358 } |
| 296 | 359 |
| 297 // Copies |video_frame| into |frame_resources| asynchronously, posting n tasks | 360 // Copies |video_frame| into |frame_resources| asynchronously, posting n tasks |
| 298 // that will be synchronized by a barrier. | 361 // that will be synchronized by a barrier. |
| 299 // After the barrier is passed OnCopiesDone will be called. | 362 // After the barrier is passed OnCopiesDone will be called. |
| 300 void GpuMemoryBufferVideoFramePool::PoolImpl::CopyVideoFrameToGpuMemoryBuffers( | 363 void GpuMemoryBufferVideoFramePool::PoolImpl::CopyVideoFrameToGpuMemoryBuffers( |
| 301 const scoped_refptr<VideoFrame>& video_frame, | 364 const scoped_refptr<VideoFrame>& video_frame, |
| 302 FrameResources* frame_resources, | 365 FrameResources* frame_resources, |
| 303 const FrameReadyCB& frame_ready_cb) { | 366 const FrameReadyCB& frame_ready_cb) { |
| 304 // Compute the number of tasks to post and create the barrier. | 367 // Compute the number of tasks to post and create the barrier. |
| 305 const size_t dest_planes = VideoFrame::NumPlanes(output_format_); | 368 const size_t dest_planes = VideoFrame::NumPlanes(output_format_); |
| 306 gfx::Size size = video_frame->visible_rect().size(); | 369 gfx::Size size = video_frame->visible_rect().size(); |
| 307 size_t copies = 0; | 370 size_t copies = 0; |
| 308 for (size_t i = 0; i < dest_planes; ++i) { | 371 for (size_t i = 0; i < dest_planes; i += PlanesPerCopy(output_format_)) { |
| 309 int rows = VideoFrame::Rows(i, output_format_, size.height()); | 372 const int rows = VideoFrame::Rows(i, output_format_, size.height()); |
| 310 int bytes_per_row = VideoFrame::RowBytes(i, output_format_, size.width()); | 373 const int rows_per_copy = RowsPerCopy(i, output_format_, size.width()); |
| 311 // Copy a even number of lines, and at least one. | |
| 312 int rows_per_copy = | |
| 313 std::max<size_t>((kBytesPerCopyTarget / bytes_per_row) & ~1, 1); | |
| 314 copies += rows / rows_per_copy; | 374 copies += rows / rows_per_copy; |
| 315 if (rows % rows_per_copy) | 375 if (rows % rows_per_copy) |
| 316 ++copies; | 376 ++copies; |
| 317 } | 377 } |
| 318 base::Closure copies_done = | 378 base::Closure copies_done = |
| 319 base::Bind(&PoolImpl::OnCopiesDone, this, video_frame, frame_resources, | 379 base::Bind(&PoolImpl::OnCopiesDone, this, video_frame, frame_resources, |
| 320 frame_ready_cb); | 380 frame_ready_cb); |
| 321 base::Closure barrier = base::BarrierClosure(copies, copies_done); | 381 base::Closure barrier = base::BarrierClosure(copies, copies_done); |
| 382 | |
| 322 // Post all the async tasks. | 383 // Post all the async tasks. |
| 323 for (size_t i = 0; i < dest_planes; ++i) { | 384 for (size_t i = 0; i < dest_planes; i += PlanesPerCopy(output_format_)) { |
| 324 int rows = VideoFrame::Rows(i, output_format_, size.height()); | 385 gfx::GpuMemoryBuffer* buffer = |
| 325 int bytes_per_row = VideoFrame::RowBytes(i, output_format_, size.width()); | 386 frame_resources->plane_resources[i].gpu_memory_buffer.get(); |
| 326 int rows_per_copy = | 387 DCHECK(buffer); |
| 327 std::max<size_t>((kBytesPerCopyTarget / bytes_per_row) & ~1, 1); | 388 const size_t buffer_planes = |
| 389 gfx::NumberOfPlanesForBufferFormat(buffer->GetFormat()); | |
| 390 DCHECK_LE(buffer_planes, VideoFrame::kMaxPlanes); | |
| 391 uint8* dest_buffers[VideoFrame::kMaxPlanes]; | |
| 392 int dest_strides[VideoFrame::kMaxPlanes]; | |
| 393 bool rv = buffer->Map(reinterpret_cast<void**>(dest_buffers)); | |
| 394 DCHECK(rv); | |
| 395 buffer->GetStride(dest_strides); | |
| 328 | 396 |
| 329 void* data = nullptr; | 397 const int rows = VideoFrame::Rows(i, output_format_, size.height()); |
| 330 DCHECK_EQ(1u, gfx::NumberOfPlanesForBufferFormat( | 398 const int rows_per_copy = RowsPerCopy(i, output_format_, size.width()); |
| 331 GpuMemoryBufferFormat(output_format_, i))); | |
| 332 bool rv = frame_resources->plane_resources[i].gpu_memory_buffer->Map(&data); | |
| 333 DCHECK(rv); | |
| 334 uint8* mapped_buffer = static_cast<uint8*>(data); | |
| 335 | |
| 336 int dest_stride = 0; | |
| 337 frame_resources->plane_resources[i].gpu_memory_buffer->GetStride( | |
| 338 &dest_stride); | |
| 339 | 399 |
| 340 for (int row = 0; row < rows; row += rows_per_copy) { | 400 for (int row = 0; row < rows; row += rows_per_copy) { |
| 401 const int rows_to_copy = std::min(rows_per_copy, rows - row); | |
| 341 switch (output_format_) { | 402 switch (output_format_) { |
| 342 case PIXEL_FORMAT_I420: | 403 case PIXEL_FORMAT_I420: { |
| 404 DCHECK_EQ(1u, buffer_planes); | |
| 405 const int bytes_per_row = | |
| 406 VideoFrame::RowBytes(i, output_format_, size.width()); | |
| 343 worker_task_runner_->PostTask( | 407 worker_task_runner_->PostTask( |
| 344 FROM_HERE, | 408 FROM_HERE, |
| 345 base::Bind(&CopyRowsToI420Buffer, row, | 409 base::Bind(&CopyRowsToI420Buffer, row, rows_to_copy, |
| 346 std::min(rows_per_copy, rows - row), bytes_per_row, | 410 bytes_per_row, video_frame->data(i), |
| 347 video_frame->data(i), video_frame->stride(i), | 411 video_frame->stride(i), dest_buffers[0], |
| 348 mapped_buffer, dest_stride, barrier)); | 412 dest_strides[0], barrier)); |
| 413 break; | |
| 414 } | |
| 415 case PIXEL_FORMAT_NV12: | |
| 416 DCHECK_EQ(2u, buffer_planes); | |
| 417 worker_task_runner_->PostTask( | |
| 418 FROM_HERE, | |
| 419 base::Bind(&CopyRowsToNV12Buffer, row, rows_to_copy, | |
| 420 size.width(), video_frame, dest_buffers[0], | |
| 421 dest_strides[0], dest_buffers[1], dest_strides[1], | |
| 422 barrier)); | |
| 349 break; | 423 break; |
| 350 case PIXEL_FORMAT_UYVY: | 424 case PIXEL_FORMAT_UYVY: |
| 425 DCHECK_EQ(1u, buffer_planes); | |
| 351 worker_task_runner_->PostTask( | 426 worker_task_runner_->PostTask( |
| 352 FROM_HERE, | 427 FROM_HERE, |
| 353 base::Bind(&CopyRowsToUYVYBuffer, row, | 428 base::Bind(&CopyRowsToUYVYBuffer, row, rows_to_copy, size.width(), |
| 354 std::min(rows_per_copy, rows - row), size.width(), | 429 video_frame, dest_buffers[0], dest_strides[0], |
| 355 video_frame, mapped_buffer, dest_stride, barrier)); | 430 barrier)); |
| 356 break; | 431 break; |
| 357 default: | 432 default: |
| 358 NOTREACHED(); | 433 NOTREACHED(); |
| 359 } | 434 } |
| 360 } | 435 } |
| 361 } | 436 } |
| 362 } | 437 } |
| 363 | 438 |
| 364 void GpuMemoryBufferVideoFramePool::PoolImpl:: | 439 void GpuMemoryBufferVideoFramePool::PoolImpl:: |
| 365 BindAndCreateMailboxesHardwareFrameResources( | 440 BindAndCreateMailboxesHardwareFrameResources( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 frame = VideoFrame::WrapYUV420NativeTextures( | 486 frame = VideoFrame::WrapYUV420NativeTextures( |
| 412 mailbox_holders[VideoFrame::kYPlane], | 487 mailbox_holders[VideoFrame::kYPlane], |
| 413 mailbox_holders[VideoFrame::kUPlane], | 488 mailbox_holders[VideoFrame::kUPlane], |
| 414 mailbox_holders[VideoFrame::kVPlane], | 489 mailbox_holders[VideoFrame::kVPlane], |
| 415 base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources), | 490 base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources), |
| 416 size, video_frame->visible_rect(), video_frame->natural_size(), | 491 size, video_frame->visible_rect(), video_frame->natural_size(), |
| 417 video_frame->timestamp()); | 492 video_frame->timestamp()); |
| 418 if (video_frame->metadata()->IsTrue(VideoFrameMetadata::ALLOW_OVERLAY)) | 493 if (video_frame->metadata()->IsTrue(VideoFrameMetadata::ALLOW_OVERLAY)) |
| 419 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, true); | 494 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, true); |
| 420 break; | 495 break; |
| 496 case PIXEL_FORMAT_NV12: | |
| 421 case PIXEL_FORMAT_UYVY: | 497 case PIXEL_FORMAT_UYVY: |
| 422 frame = VideoFrame::WrapNativeTexture( | 498 frame = VideoFrame::WrapNativeTexture( |
| 423 PIXEL_FORMAT_UYVY, mailbox_holders[VideoFrame::kYPlane], | 499 output_format_, mailbox_holders[VideoFrame::kYPlane], |
| 424 base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources), | 500 base::Bind(&PoolImpl::MailboxHoldersReleased, this, frame_resources), |
| 425 size, video_frame->visible_rect(), video_frame->natural_size(), | 501 size, video_frame->visible_rect(), video_frame->natural_size(), |
| 426 video_frame->timestamp()); | 502 video_frame->timestamp()); |
| 427 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, true); | 503 frame->metadata()->SetBoolean(VideoFrameMetadata::ALLOW_OVERLAY, true); |
| 428 break; | 504 break; |
| 429 default: | 505 default: |
| 430 NOTREACHED(); | 506 NOTREACHED(); |
| 431 } | 507 } |
| 432 frame_ready_cb.Run(frame); | 508 frame_ready_cb.Run(frame); |
| 433 } | 509 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 gles2->ActiveTexture(GL_TEXTURE0); | 551 gles2->ActiveTexture(GL_TEXTURE0); |
| 476 size_t planes = VideoFrame::NumPlanes(format); | 552 size_t planes = VideoFrame::NumPlanes(format); |
| 477 FrameResources* frame_resources = new FrameResources(size); | 553 FrameResources* frame_resources = new FrameResources(size); |
| 478 resources_pool_.push_back(frame_resources); | 554 resources_pool_.push_back(frame_resources); |
| 479 for (size_t i = 0; i < planes; ++i) { | 555 for (size_t i = 0; i < planes; ++i) { |
| 480 PlaneResource& plane_resource = frame_resources->plane_resources[i]; | 556 PlaneResource& plane_resource = frame_resources->plane_resources[i]; |
| 481 const size_t width = VideoFrame::Columns(i, format, size.width()); | 557 const size_t width = VideoFrame::Columns(i, format, size.width()); |
| 482 const size_t height = VideoFrame::Rows(i, format, size.height()); | 558 const size_t height = VideoFrame::Rows(i, format, size.height()); |
| 483 const gfx::Size plane_size(width, height); | 559 const gfx::Size plane_size(width, height); |
| 484 | 560 |
| 561 const gfx::BufferFormat buffer_format = GpuMemoryBufferFormat(format, i); | |
| 485 plane_resource.gpu_memory_buffer = gpu_factories_->AllocateGpuMemoryBuffer( | 562 plane_resource.gpu_memory_buffer = gpu_factories_->AllocateGpuMemoryBuffer( |
| 486 plane_size, GpuMemoryBufferFormat(format, i), gfx::BufferUsage::MAP); | 563 plane_size, buffer_format, gfx::BufferUsage::MAP); |
| 487 | 564 |
| 488 gles2->GenTextures(1, &plane_resource.texture_id); | 565 gles2->GenTextures(1, &plane_resource.texture_id); |
| 489 gles2->BindTexture(texture_target_, plane_resource.texture_id); | 566 gles2->BindTexture(texture_target_, plane_resource.texture_id); |
| 490 gles2->TexParameteri(texture_target_, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 567 gles2->TexParameteri(texture_target_, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 491 gles2->TexParameteri(texture_target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 568 gles2->TexParameteri(texture_target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| 492 gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 569 gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 493 gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 570 gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 494 gles2->GenMailboxCHROMIUM(plane_resource.mailbox.name); | 571 gles2->GenMailboxCHROMIUM(plane_resource.mailbox.name); |
| 495 gles2->ProduceTextureCHROMIUM(texture_target_, plane_resource.mailbox.name); | 572 gles2->ProduceTextureCHROMIUM(texture_target_, plane_resource.mailbox.name); |
| 573 | |
| 574 size_t buffer_planes = gfx::NumberOfPlanesForBufferFormat(buffer_format); | |
| 575 if (buffer_planes > 1) { | |
| 576 // Got a multi-planar buffer, assume all the planes fit in it. | |
| 577 DCHECK_EQ(planes, buffer_planes); | |
| 578 break; | |
| 579 } | |
| 496 } | 580 } |
| 497 return frame_resources; | 581 return frame_resources; |
| 498 } | 582 } |
| 499 | 583 |
| 500 // static | 584 // static |
| 501 void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources( | 585 void GpuMemoryBufferVideoFramePool::PoolImpl::DeleteFrameResources( |
| 502 const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories, | 586 const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories, |
| 503 FrameResources* frame_resources) { | 587 FrameResources* frame_resources) { |
| 504 // TODO(dcastagna): As soon as the context lost is dealt with in media, | 588 // TODO(dcastagna): As soon as the context lost is dealt with in media, |
| 505 // make sure that we won't execute this callback (use a weak pointer to | 589 // make sure that we won't execute this callback (use a weak pointer to |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 } | 635 } |
| 552 | 636 |
| 553 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( | 637 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame( |
| 554 const scoped_refptr<VideoFrame>& video_frame, | 638 const scoped_refptr<VideoFrame>& video_frame, |
| 555 const FrameReadyCB& frame_ready_cb) { | 639 const FrameReadyCB& frame_ready_cb) { |
| 556 DCHECK(video_frame); | 640 DCHECK(video_frame); |
| 557 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); | 641 pool_impl_->CreateHardwareFrame(video_frame, frame_ready_cb); |
| 558 } | 642 } |
| 559 | 643 |
| 560 } // namespace media | 644 } // namespace media |
| OLD | NEW |