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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "cc/layers/video_frame_provider_client_impl.h" | 12 #include "cc/layers/video_frame_provider_client_impl.h" |
13 #include "cc/quads/stream_video_draw_quad.h" | 13 #include "cc/quads/stream_video_draw_quad.h" |
14 #include "cc/quads/texture_draw_quad.h" | 14 #include "cc/quads/texture_draw_quad.h" |
15 #include "cc/quads/yuv_video_draw_quad.h" | 15 #include "cc/quads/yuv_video_draw_quad.h" |
16 #include "cc/resources/resource_provider.h" | 16 #include "cc/resources/resource_provider.h" |
17 #include "cc/resources/single_release_callback_impl.h" | 17 #include "cc/resources/single_release_callback_impl.h" |
18 #include "cc/trees/layer_tree_impl.h" | 18 #include "cc/trees/layer_tree_impl.h" |
19 #include "cc/trees/occlusion.h" | 19 #include "cc/trees/occlusion.h" |
20 #include "cc/trees/task_runner_provider.h" | 20 #include "cc/trees/task_runner_provider.h" |
21 #include "media/base/video_frame.h" | 21 #include "media/base/video_frame.h" |
22 #include "ui/gfx/color_space.h" | 22 #include "ui/gfx/color_space.h" |
23 | 23 |
24 namespace cc { | 24 namespace cc { |
25 | 25 |
| 26 namespace { |
| 27 |
| 28 gfx::BufferFormat GetBufferFormat(media::VideoPixelFormat pixel_format) { |
| 29 switch (pixel_format) { |
| 30 case media::PIXEL_FORMAT_YV12: |
| 31 return gfx::BufferFormat::YVU_420; |
| 32 case media::PIXEL_FORMAT_NV12: |
| 33 return gfx::BufferFormat::YUV_420_BIPLANAR; |
| 34 case media::PIXEL_FORMAT_UYVY: |
| 35 return gfx::BufferFormat::UYVY_422; |
| 36 case media::PIXEL_FORMAT_ARGB: |
| 37 return gfx::BufferFormat::BGRA_8888; |
| 38 case media::PIXEL_FORMAT_XRGB: |
| 39 return gfx::BufferFormat::BGRX_8888; |
| 40 case media::PIXEL_FORMAT_RGB32: |
| 41 return gfx::BufferFormat::RGBX_8888; |
| 42 case media::PIXEL_FORMAT_Y8: |
| 43 return gfx::BufferFormat::R_8; |
| 44 case media::PIXEL_FORMAT_Y16: |
| 45 return gfx::BufferFormat::RG_88; |
| 46 |
| 47 case media::PIXEL_FORMAT_I420: |
| 48 case media::PIXEL_FORMAT_YV16: |
| 49 case media::PIXEL_FORMAT_YV12A: |
| 50 case media::PIXEL_FORMAT_YV24: |
| 51 case media::PIXEL_FORMAT_NV21: |
| 52 case media::PIXEL_FORMAT_YUY2: |
| 53 case media::PIXEL_FORMAT_RGB24: |
| 54 case media::PIXEL_FORMAT_MJPEG: |
| 55 case media::PIXEL_FORMAT_MT21: |
| 56 case media::PIXEL_FORMAT_YUV420P9: |
| 57 case media::PIXEL_FORMAT_YUV420P10: |
| 58 case media::PIXEL_FORMAT_YUV422P9: |
| 59 case media::PIXEL_FORMAT_YUV422P10: |
| 60 case media::PIXEL_FORMAT_YUV444P9: |
| 61 case media::PIXEL_FORMAT_YUV444P10: |
| 62 case media::PIXEL_FORMAT_YUV420P12: |
| 63 case media::PIXEL_FORMAT_YUV422P12: |
| 64 case media::PIXEL_FORMAT_YUV444P12: |
| 65 case media::PIXEL_FORMAT_I422: |
| 66 // Above pixel format doesn't match exact buffer format. However, this |
| 67 // mismatch is fine because hardware overlay needs to know the buffer |
| 68 // format and above format resources never be overlayed. |
| 69 return gfx::BufferFormat::RGBA_8888; |
| 70 case media::PIXEL_FORMAT_UNKNOWN: |
| 71 break; |
| 72 } |
| 73 NOTREACHED(); |
| 74 return gfx::BufferFormat::RGBA_8888; |
| 75 } |
| 76 |
| 77 } // namespace |
| 78 |
26 // static | 79 // static |
27 std::unique_ptr<VideoLayerImpl> VideoLayerImpl::Create( | 80 std::unique_ptr<VideoLayerImpl> VideoLayerImpl::Create( |
28 LayerTreeImpl* tree_impl, | 81 LayerTreeImpl* tree_impl, |
29 int id, | 82 int id, |
30 VideoFrameProvider* provider, | 83 VideoFrameProvider* provider, |
31 media::VideoRotation video_rotation) { | 84 media::VideoRotation video_rotation) { |
32 DCHECK(tree_impl->task_runner_provider()->IsMainThreadBlocked()); | 85 DCHECK(tree_impl->task_runner_provider()->IsMainThreadBlocked()); |
33 DCHECK(tree_impl->task_runner_provider()->IsImplThread()); | 86 DCHECK(tree_impl->task_runner_provider()->IsImplThread()); |
34 | 87 |
35 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl = | 88 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl = |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 frame_resource_multiplier_ = external_resources.multiplier; | 174 frame_resource_multiplier_ = external_resources.multiplier; |
122 frame_bits_per_channel_ = external_resources.bits_per_channel; | 175 frame_bits_per_channel_ = external_resources.bits_per_channel; |
123 | 176 |
124 DCHECK_EQ(external_resources.mailboxes.size(), | 177 DCHECK_EQ(external_resources.mailboxes.size(), |
125 external_resources.release_callbacks.size()); | 178 external_resources.release_callbacks.size()); |
126 ResourceProvider::ResourceIdArray resource_ids; | 179 ResourceProvider::ResourceIdArray resource_ids; |
127 resource_ids.reserve(external_resources.mailboxes.size()); | 180 resource_ids.reserve(external_resources.mailboxes.size()); |
128 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 181 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
129 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( | 182 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( |
130 external_resources.mailboxes[i], | 183 external_resources.mailboxes[i], |
| 184 GetBufferFormat(external_resources.pixel_format), |
131 SingleReleaseCallbackImpl::Create( | 185 SingleReleaseCallbackImpl::Create( |
132 external_resources.release_callbacks[i]), | 186 external_resources.release_callbacks[i]), |
133 external_resources.read_lock_fences_enabled); | 187 external_resources.read_lock_fences_enabled); |
134 frame_resources_.push_back(FrameResource( | 188 frame_resources_.push_back(FrameResource( |
135 resource_id, external_resources.mailboxes[i].size_in_pixels(), | 189 resource_id, external_resources.mailboxes[i].size_in_pixels(), |
136 external_resources.mailboxes[i].is_overlay_candidate())); | 190 external_resources.mailboxes[i].is_overlay_candidate())); |
137 resource_ids.push_back(resource_id); | 191 resource_ids.push_back(resource_id); |
138 } | 192 } |
139 resource_provider->GenerateSyncTokenForResources(resource_ids); | 193 resource_provider->GenerateSyncTokenForResources(resource_ids); |
140 | 194 |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 void VideoLayerImpl::SetNeedsRedraw() { | 426 void VideoLayerImpl::SetNeedsRedraw() { |
373 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); | 427 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); |
374 layer_tree_impl()->SetNeedsRedraw(); | 428 layer_tree_impl()->SetNeedsRedraw(); |
375 } | 429 } |
376 | 430 |
377 const char* VideoLayerImpl::LayerTypeAsString() const { | 431 const char* VideoLayerImpl::LayerTypeAsString() const { |
378 return "cc::VideoLayerImpl"; | 432 return "cc::VideoLayerImpl"; |
379 } | 433 } |
380 | 434 |
381 } // namespace cc | 435 } // namespace cc |
OLD | NEW |