OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/layers/video_layer_impl.h" | 5 #include "cc/layers/video_layer_impl.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "cc/base/math_util.h" | 8 #include "cc/base/math_util.h" |
9 #include "cc/layers/quad_sink.h" | 9 #include "cc/layers/quad_sink.h" |
10 #include "cc/layers/video_frame_provider_client_impl.h" | 10 #include "cc/layers/video_frame_provider_client_impl.h" |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 | 359 |
360 void VideoLayerImpl::FramePlane::FreeData(ResourceProvider* resource_provider) { | 360 void VideoLayerImpl::FramePlane::FreeData(ResourceProvider* resource_provider) { |
361 if (!resource_id) | 361 if (!resource_id) |
362 return; | 362 return; |
363 | 363 |
364 resource_provider->DeleteResource(resource_id); | 364 resource_provider->DeleteResource(resource_id); |
365 resource_id = 0; | 365 resource_id = 0; |
366 } | 366 } |
367 | 367 |
368 // Convert media::VideoFrame::Format to OpenGL enum values. | 368 // Convert media::VideoFrame::Format to OpenGL enum values. |
369 static GLenum ConvertVFCFormatToGLenum(const media::VideoFrame& frame) { | 369 static GLenum ConvertVFCFormatToGLenum(const media::VideoFrame::Format format) { |
370 switch (frame.format()) { | 370 switch (format) { |
371 case media::VideoFrame::YV12: | 371 case media::VideoFrame::YV12: |
372 case media::VideoFrame::YV16: | 372 case media::VideoFrame::YV16: |
373 return GL_LUMINANCE; | 373 return GL_LUMINANCE; |
| 374 case media::VideoFrame::RGB32: |
| 375 return GL_RGBA; |
374 case media::VideoFrame::NATIVE_TEXTURE: | 376 case media::VideoFrame::NATIVE_TEXTURE: |
375 return frame.texture_target(); | |
376 #if defined(GOOGLE_TV) | 377 #if defined(GOOGLE_TV) |
377 case media::VideoFrame::HOLE: | 378 case media::VideoFrame::HOLE: |
378 return GL_INVALID_VALUE; | |
379 #endif | 379 #endif |
380 case media::VideoFrame::INVALID: | 380 case media::VideoFrame::INVALID: |
381 case media::VideoFrame::RGB32: | |
382 case media::VideoFrame::EMPTY: | 381 case media::VideoFrame::EMPTY: |
383 case media::VideoFrame::I420: | 382 case media::VideoFrame::I420: |
384 NOTREACHED(); | 383 NOTREACHED(); |
385 break; | 384 break; |
386 } | 385 } |
387 return GL_INVALID_VALUE; | 386 return GL_INVALID_VALUE; |
388 } | 387 } |
389 | 388 |
390 size_t VideoLayerImpl::NumPlanes() const { | |
391 if (!frame_) | |
392 return 0; | |
393 | |
394 if (convert_yuv_) | |
395 return 1; | |
396 | |
397 return media::VideoFrame::NumPlanes(frame_->format()); | |
398 } | |
399 | |
400 bool VideoLayerImpl::SetupFramePlanes(ResourceProvider* resource_provider) { | 389 bool VideoLayerImpl::SetupFramePlanes(ResourceProvider* resource_provider) { |
401 const size_t plane_count = NumPlanes(); | 390 const size_t plane_count = media::VideoFrame::NumPlanes(format_); |
402 if (!plane_count) | 391 if (!plane_count) |
403 return true; | 392 return true; |
404 | 393 |
405 const int max_texture_size = resource_provider->max_texture_size(); | 394 const int max_texture_size = resource_provider->max_texture_size(); |
406 const GLenum pixel_format = ConvertVFCFormatToGLenum(*frame_); | 395 const GLenum pixel_format = ConvertVFCFormatToGLenum(format_); |
407 for (size_t plane_index = 0; plane_index < plane_count; ++plane_index) { | 396 for (size_t plane_index = 0; plane_index < plane_count; ++plane_index) { |
408 VideoLayerImpl::FramePlane* plane = &frame_planes_[plane_index]; | 397 VideoLayerImpl::FramePlane* plane = &frame_planes_[plane_index]; |
409 | 398 |
410 gfx::Size required_texture_size = VideoFrameDimension(frame_, plane_index); | 399 gfx::Size required_texture_size = VideoFrameDimension(frame_, plane_index); |
411 // TODO: Remove the test against max_texture_size when tiled layers are | 400 // TODO: Remove the test against max_texture_size when tiled layers are |
412 // implemented. | 401 // implemented. |
413 if (required_texture_size.IsEmpty() || | 402 if (required_texture_size.IsEmpty() || |
414 required_texture_size.width() > max_texture_size || | 403 required_texture_size.width() > max_texture_size || |
415 required_texture_size.height() > max_texture_size) | 404 required_texture_size.height() > max_texture_size) |
416 return false; | 405 return false; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 } | 446 } |
458 return true; | 447 return true; |
459 } | 448 } |
460 | 449 |
461 void VideoLayerImpl::FreeFramePlanes(ResourceProvider* resource_provider) { | 450 void VideoLayerImpl::FreeFramePlanes(ResourceProvider* resource_provider) { |
462 for (size_t i = 0; i < media::VideoFrame::kMaxPlanes; ++i) | 451 for (size_t i = 0; i < media::VideoFrame::kMaxPlanes; ++i) |
463 frame_planes_[i].FreeData(resource_provider); | 452 frame_planes_[i].FreeData(resource_provider); |
464 } | 453 } |
465 | 454 |
466 void VideoLayerImpl::FreeUnusedFramePlanes(ResourceProvider* resource_provider)
{ | 455 void VideoLayerImpl::FreeUnusedFramePlanes(ResourceProvider* resource_provider)
{ |
467 size_t first_unused_plane = NumPlanes(); | 456 size_t first_unused_plane = (frame_ ? media::VideoFrame::NumPlanes(format_) |
| 457 : 0); |
468 for (size_t i = first_unused_plane; i < media::VideoFrame::kMaxPlanes; ++i) | 458 for (size_t i = first_unused_plane; i < media::VideoFrame::kMaxPlanes; ++i) |
469 frame_planes_[i].FreeData(resource_provider); | 459 frame_planes_[i].FreeData(resource_provider); |
470 } | 460 } |
471 | 461 |
472 void VideoLayerImpl::DidLoseOutputSurface() { | 462 void VideoLayerImpl::DidLoseOutputSurface() { |
473 FreeFramePlanes(layer_tree_impl()->resource_provider()); | 463 FreeFramePlanes(layer_tree_impl()->resource_provider()); |
474 } | 464 } |
475 | 465 |
476 void VideoLayerImpl::SetNeedsRedraw() { | 466 void VideoLayerImpl::SetNeedsRedraw() { |
477 layer_tree_impl()->SetNeedsRedraw(); | 467 layer_tree_impl()->SetNeedsRedraw(); |
478 } | 468 } |
479 | 469 |
480 void VideoLayerImpl::SetProviderClientImpl( | 470 void VideoLayerImpl::SetProviderClientImpl( |
481 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { | 471 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { |
482 provider_client_impl_ = provider_client_impl; | 472 provider_client_impl_ = provider_client_impl; |
483 } | 473 } |
484 | 474 |
485 const char* VideoLayerImpl::LayerTypeAsString() const { | 475 const char* VideoLayerImpl::LayerTypeAsString() const { |
486 return "VideoLayer"; | 476 return "VideoLayer"; |
487 } | 477 } |
488 | 478 |
489 } // namespace cc | 479 } // namespace cc |
OLD | NEW |