Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: cc/resources/video_resource_updater.cc

Issue 1154153003: Relanding 1143663007: VideoFrame: Separate Pixel Format from Storage Type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added NV12 support in CrOS Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/resources/video_resource_updater.h" 5 #include "cc/resources/video_resource_updater.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 130
131 void VideoResourceUpdater::DeleteResource(ResourceList::iterator resource_it) { 131 void VideoResourceUpdater::DeleteResource(ResourceList::iterator resource_it) {
132 DCHECK_EQ(resource_it->ref_count, 0); 132 DCHECK_EQ(resource_it->ref_count, 0);
133 resource_provider_->DeleteResource(resource_it->resource_id); 133 resource_provider_->DeleteResource(resource_it->resource_id);
134 all_resources_.erase(resource_it); 134 all_resources_.erase(resource_it);
135 } 135 }
136 136
137 VideoFrameExternalResources VideoResourceUpdater:: 137 VideoFrameExternalResources VideoResourceUpdater::
138 CreateExternalResourcesFromVideoFrame( 138 CreateExternalResourcesFromVideoFrame(
139 const scoped_refptr<media::VideoFrame>& video_frame) { 139 const scoped_refptr<media::VideoFrame>& video_frame) {
140 if (!VerifyFrame(video_frame)) 140 if (video_frame->format() == media::VideoFrame::UNKNOWN)
141 return VideoFrameExternalResources(); 141 return VideoFrameExternalResources();
142 142
143 if (video_frame->format() == media::VideoFrame::NATIVE_TEXTURE) 143 if (video_frame->storage_type() == media::VideoFrame::STORAGE_TEXTURE)
144 return CreateForHardwarePlanes(video_frame); 144 return CreateForHardwarePlanes(video_frame);
145 else 145 else
146 return CreateForSoftwarePlanes(video_frame); 146 return CreateForSoftwarePlanes(video_frame);
147 } 147 }
148 148
149 bool VideoResourceUpdater::VerifyFrame(
150 const scoped_refptr<media::VideoFrame>& video_frame) {
151 switch (video_frame->format()) {
152 // Acceptable inputs.
153 case media::VideoFrame::YV12:
154 case media::VideoFrame::I420:
155 case media::VideoFrame::YV12A:
156 case media::VideoFrame::YV16:
157 case media::VideoFrame::YV24:
158 case media::VideoFrame::NATIVE_TEXTURE:
159 #if defined(VIDEO_HOLE)
160 case media::VideoFrame::HOLE:
161 #endif // defined(VIDEO_HOLE)
162 case media::VideoFrame::ARGB:
163 return true;
164
165 // Unacceptable inputs. ¯\(°_o)/¯
166 case media::VideoFrame::UNKNOWN:
167 case media::VideoFrame::NV12:
168 break;
169 }
170 return false;
171 }
172
173 // For frames that we receive in software format, determine the dimensions of 149 // For frames that we receive in software format, determine the dimensions of
174 // each plane in the frame. 150 // each plane in the frame.
175 static gfx::Size SoftwarePlaneDimension( 151 static gfx::Size SoftwarePlaneDimension(
176 const scoped_refptr<media::VideoFrame>& input_frame, 152 const scoped_refptr<media::VideoFrame>& input_frame,
177 bool software_compositor, 153 bool software_compositor,
178 size_t plane_index) { 154 size_t plane_index) {
179 if (!software_compositor) { 155 if (!software_compositor) {
180 return media::VideoFrame::PlaneSize( 156 return media::VideoFrame::PlaneSize(
181 input_frame->format(), plane_index, input_frame->coded_size()); 157 input_frame->format(), plane_index, input_frame->coded_size());
182 } 158 }
183 return input_frame->coded_size(); 159 return input_frame->coded_size();
184 } 160 }
185 161
186 VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( 162 VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
187 const scoped_refptr<media::VideoFrame>& video_frame) { 163 const scoped_refptr<media::VideoFrame>& video_frame) {
188 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForSoftwarePlanes"); 164 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForSoftwarePlanes");
189 media::VideoFrame::Format input_frame_format = video_frame->format(); 165 const media::VideoFrame::Format input_frame_format = video_frame->format();
190 166
191 #if defined(VIDEO_HOLE) 167 #if defined(VIDEO_HOLE)
192 if (input_frame_format == media::VideoFrame::HOLE) { 168 if (video_frame->storage_type() == media::VideoFrame::STORAGE_HOLE) {
193 VideoFrameExternalResources external_resources; 169 VideoFrameExternalResources external_resources;
194 external_resources.type = VideoFrameExternalResources::HOLE; 170 external_resources.type = VideoFrameExternalResources::HOLE;
195 return external_resources; 171 return external_resources;
196 } 172 }
197 #endif // defined(VIDEO_HOLE) 173 #endif // defined(VIDEO_HOLE)
198 174
199 // Only YUV software video frames are supported. 175 // Only YUV software video frames are supported.
200 if (input_frame_format != media::VideoFrame::YV12 && 176 if (!media::VideoFrame::IsYuvPlanar(input_frame_format)) {
201 input_frame_format != media::VideoFrame::I420 && 177 NOTREACHED() << media::VideoFrame::FormatToString(input_frame_format);
202 input_frame_format != media::VideoFrame::YV12A &&
203 input_frame_format != media::VideoFrame::YV16 &&
204 input_frame_format != media::VideoFrame::YV24) {
205 NOTREACHED() << input_frame_format;
206 return VideoFrameExternalResources(); 178 return VideoFrameExternalResources();
207 } 179 }
208 180
209 bool software_compositor = context_provider_ == NULL; 181 const bool software_compositor = context_provider_ == NULL;
210 182
211 ResourceFormat output_resource_format = 183 ResourceFormat output_resource_format =
212 resource_provider_->yuv_resource_format(); 184 resource_provider_->yuv_resource_format();
213 size_t output_plane_count = media::VideoFrame::NumPlanes(input_frame_format); 185 size_t output_plane_count = media::VideoFrame::NumPlanes(input_frame_format);
214 186
215 // TODO(skaslev): If we're in software compositing mode, we do the YUV -> RGB 187 // TODO(skaslev): If we're in software compositing mode, we do the YUV -> RGB
216 // conversion here. That involves an extra copy of each frame to a bitmap. 188 // conversion here. That involves an extra copy of each frame to a bitmap.
217 // Obviously, this is suboptimal and should be addressed once ubercompositor 189 // Obviously, this is suboptimal and should be addressed once ubercompositor
218 // starts shaping up. 190 // starts shaping up.
219 if (software_compositor) { 191 if (software_compositor) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 // returned by the compositor and emit a WaitSyncPointCHROMIUM on 359 // returned by the compositor and emit a WaitSyncPointCHROMIUM on
388 // |video_frame|'s previous sync point using the current GL context. 360 // |video_frame|'s previous sync point using the current GL context.
389 SyncPointClientImpl client(updater->context_provider_->ContextGL(), 361 SyncPointClientImpl client(updater->context_provider_->ContextGL(),
390 sync_point); 362 sync_point);
391 video_frame->UpdateReleaseSyncPoint(&client); 363 video_frame->UpdateReleaseSyncPoint(&client);
392 } 364 }
393 365
394 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( 366 VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes(
395 const scoped_refptr<media::VideoFrame>& video_frame) { 367 const scoped_refptr<media::VideoFrame>& video_frame) {
396 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes"); 368 TRACE_EVENT0("cc", "VideoResourceUpdater::CreateForHardwarePlanes");
397 media::VideoFrame::Format frame_format = video_frame->format(); 369 DCHECK_EQ(video_frame->storage_type(), media::VideoFrame::STORAGE_TEXTURE);
398
399 DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE);
400 if (!context_provider_) 370 if (!context_provider_)
401 return VideoFrameExternalResources(); 371 return VideoFrameExternalResources();
402 372
403 size_t textures = 373 const size_t textures = media::VideoFrame::NumPlanes(video_frame->format());
404 media::VideoFrame::NumTextures(video_frame->texture_format());
405 DCHECK_GE(textures, 1u); 374 DCHECK_GE(textures, 1u);
406 VideoFrameExternalResources external_resources; 375 VideoFrameExternalResources external_resources;
407 switch (video_frame->texture_format()) { 376 switch (video_frame->format()) {
408 case media::VideoFrame::TEXTURE_RGBA: 377 case media::VideoFrame::ARGB:
409 case media::VideoFrame::TEXTURE_RGB: 378 case media::VideoFrame::XRGB:
410 DCHECK_EQ(1u, textures); 379 DCHECK_EQ(1u, textures);
411 switch (video_frame->mailbox_holder(0).texture_target) { 380 switch (video_frame->mailbox_holder(0).texture_target) {
412 case GL_TEXTURE_2D: 381 case GL_TEXTURE_2D:
413 if (video_frame->texture_format() == media::VideoFrame::TEXTURE_RGB) 382 external_resources.type =
414 external_resources.type = VideoFrameExternalResources::RGB_RESOURCE; 383 (video_frame->format() == media::VideoFrame::XRGB)
415 else 384 ? VideoFrameExternalResources::RGB_RESOURCE
416 external_resources.type = 385 : VideoFrameExternalResources::RGBA_RESOURCE;
417 VideoFrameExternalResources::RGBA_RESOURCE;
418 break; 386 break;
419 case GL_TEXTURE_EXTERNAL_OES: 387 case GL_TEXTURE_EXTERNAL_OES:
420 external_resources.type = 388 external_resources.type =
421 VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE; 389 VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE;
422 break; 390 break;
423 case GL_TEXTURE_RECTANGLE_ARB: 391 case GL_TEXTURE_RECTANGLE_ARB:
424 external_resources.type = VideoFrameExternalResources::IO_SURFACE; 392 external_resources.type = VideoFrameExternalResources::IO_SURFACE;
425 break; 393 break;
426 default: 394 default:
427 NOTREACHED(); 395 NOTREACHED();
428 return VideoFrameExternalResources(); 396 return VideoFrameExternalResources();
429 } 397 }
430 break; 398 break;
431 case media::VideoFrame::TEXTURE_YUV_420: 399 case media::VideoFrame::I420:
432 external_resources.type = VideoFrameExternalResources::YUV_RESOURCE; 400 external_resources.type = VideoFrameExternalResources::YUV_RESOURCE;
433 break; 401 break;
402 #if defined(OS_MACOSX) || defined(OS_CHROMEOS)
403 case media::VideoFrame::NV12:
404 #endif
405 case media::VideoFrame::YV12:
406 case media::VideoFrame::YV16:
407 case media::VideoFrame::YV24:
408 case media::VideoFrame::YV12A:
409 case media::VideoFrame::UNKNOWN:
410 DLOG(ERROR) << "Unsupported Texture format"
411 << media::VideoFrame::FormatToString(video_frame->format());
412 return external_resources;
434 } 413 }
435 DCHECK_NE(VideoFrameExternalResources::NONE, external_resources.type); 414 DCHECK_NE(VideoFrameExternalResources::NONE, external_resources.type);
436 415
437 for (size_t i = 0; i < textures; ++i) { 416 for (size_t i = 0; i < textures; ++i) {
438 const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i); 417 const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i);
439 external_resources.mailboxes.push_back( 418 external_resources.mailboxes.push_back(
440 TextureMailbox(mailbox_holder.mailbox, mailbox_holder.texture_target, 419 TextureMailbox(mailbox_holder.mailbox, mailbox_holder.texture_target,
441 mailbox_holder.sync_point)); 420 mailbox_holder.sync_point));
442 external_resources.mailboxes.back().set_allow_overlay( 421 external_resources.mailboxes.back().set_allow_overlay(
443 video_frame->allow_overlay()); 422 video_frame->allow_overlay());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 resource_it->ref_count = 0; 455 resource_it->ref_count = 0;
477 updater->DeleteResource(resource_it); 456 updater->DeleteResource(resource_it);
478 return; 457 return;
479 } 458 }
480 459
481 --resource_it->ref_count; 460 --resource_it->ref_count;
482 DCHECK_GE(resource_it->ref_count, 0); 461 DCHECK_GE(resource_it->ref_count, 0);
483 } 462 }
484 463
485 } // namespace cc 464 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/video_layer_impl.cc ('k') | content/browser/media/capture/content_video_capture_device_core.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698