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

Side by Side Diff: media/base/video_frame.cc

Issue 1737253002: Handle Alpha channel in Canvas capture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bbudge@ nit. Created 4 years, 9 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
« no previous file with comments | « media/base/video_frame.h ('k') | media/base/video_frame_pool.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/base/video_frame.h" 5 #include "media/base/video_frame.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <climits> 8 #include <climits>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 // level, DmaBufs are not mappable from userspace. 76 // level, DmaBufs are not mappable from userspace.
77 storage_type != VideoFrame::STORAGE_DMABUFS && 77 storage_type != VideoFrame::STORAGE_DMABUFS &&
78 #endif 78 #endif
79 (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY || 79 (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY ||
80 storage_type == VideoFrame::STORAGE_OWNED_MEMORY || 80 storage_type == VideoFrame::STORAGE_OWNED_MEMORY ||
81 storage_type == VideoFrame::STORAGE_SHMEM || 81 storage_type == VideoFrame::STORAGE_SHMEM ||
82 storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFERS || 82 storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFERS ||
83 storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER); 83 storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER);
84 } 84 }
85 85
86 // Checks if |source_format| can be wrapped into a |target_format| frame.
87 static bool AreValidPixelFormatsForWrap(VideoPixelFormat source_format,
88 VideoPixelFormat target_format) {
89 if (source_format == target_format)
90 return true;
91
92 // It is possible to add other planar to planar format conversions here if the
93 // use case is there.
94 return source_format == PIXEL_FORMAT_YV12A &&
95 target_format == PIXEL_FORMAT_I420;
96 }
97
86 // static 98 // static
87 bool VideoFrame::IsValidConfig(VideoPixelFormat format, 99 bool VideoFrame::IsValidConfig(VideoPixelFormat format,
88 StorageType storage_type, 100 StorageType storage_type,
89 const gfx::Size& coded_size, 101 const gfx::Size& coded_size,
90 const gfx::Rect& visible_rect, 102 const gfx::Rect& visible_rect,
91 const gfx::Size& natural_size) { 103 const gfx::Size& natural_size) {
92 // Check maximum limits for all formats. 104 // Check maximum limits for all formats.
93 int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); 105 int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX);
94 int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); 106 int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX);
95 static_assert(limits::kMaxCanvas < INT_MAX, ""); 107 static_assert(limits::kMaxCanvas < INT_MAX, "");
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 scoped_refptr<VideoFrame> frame(new VideoFrame( 383 scoped_refptr<VideoFrame> frame(new VideoFrame(
372 format, storage, coded_size, visible_rect, natural_size, timestamp)); 384 format, storage, coded_size, visible_rect, natural_size, timestamp));
373 385
374 frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN); 386 frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN);
375 return frame; 387 return frame;
376 } 388 }
377 #endif 389 #endif
378 390
379 // static 391 // static
380 scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame( 392 scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
381 const scoped_refptr<VideoFrame>& frame, 393 const scoped_refptr<VideoFrame>& frame,
382 const gfx::Rect& visible_rect, 394 VideoPixelFormat format,
383 const gfx::Size& natural_size) { 395 const gfx::Rect& visible_rect,
396 const gfx::Size& natural_size) {
384 // Frames with textures need mailbox info propagated, and there's no support 397 // Frames with textures need mailbox info propagated, and there's no support
385 // for that here yet, see http://crbug/362521. 398 // for that here yet, see http://crbug/362521.
386 CHECK(!frame->HasTextures()); 399 CHECK(!frame->HasTextures());
387
388 DCHECK(frame->visible_rect().Contains(visible_rect)); 400 DCHECK(frame->visible_rect().Contains(visible_rect));
389 401
390 if (!IsValidConfig(frame->format(), frame->storage_type(), 402 if (!AreValidPixelFormatsForWrap(frame->format(), format)) {
391 frame->coded_size(), visible_rect, natural_size)) { 403 LOG(DFATAL) << __FUNCTION__ << " Invalid format conversion."
404 << VideoPixelFormatToString(frame->format()) << " to "
405 << VideoPixelFormatToString(format);
406 return nullptr;
407 }
408
409 if (!IsValidConfig(format, frame->storage_type(), frame->coded_size(),
410 visible_rect, natural_size)) {
392 LOG(DFATAL) << __FUNCTION__ << " Invalid config." 411 LOG(DFATAL) << __FUNCTION__ << " Invalid config."
393 << ConfigToString(frame->format(), frame->storage_type(), 412 << ConfigToString(format, frame->storage_type(),
394 frame->coded_size(), visible_rect, 413 frame->coded_size(), visible_rect,
395 natural_size); 414 natural_size);
396 return nullptr; 415 return nullptr;
397 } 416 }
398 417
399 scoped_refptr<VideoFrame> wrapping_frame(new VideoFrame( 418 scoped_refptr<VideoFrame> wrapping_frame(
400 frame->format(), frame->storage_type(), frame->coded_size(), visible_rect, 419 new VideoFrame(format, frame->storage_type(), frame->coded_size(),
401 natural_size, frame->timestamp())); 420 visible_rect, natural_size, frame->timestamp()));
402 421
403 // Copy all metadata to the wrapped frame. 422 // Copy all metadata to the wrapped frame.
404 wrapping_frame->metadata()->MergeMetadataFrom(frame->metadata()); 423 wrapping_frame->metadata()->MergeMetadataFrom(frame->metadata());
405 424
406 for (size_t i = 0; i < NumPlanes(frame->format()); ++i) { 425 for (size_t i = 0; i < NumPlanes(format); ++i) {
407 wrapping_frame->strides_[i] = frame->stride(i); 426 wrapping_frame->strides_[i] = frame->stride(i);
408 wrapping_frame->data_[i] = frame->data(i); 427 wrapping_frame->data_[i] = frame->data(i);
409 } 428 }
410 429
411 #if defined(OS_LINUX) 430 #if defined(OS_LINUX)
412 // If there are any |dmabuf_fds_| plugged in, we should duplicate them. 431 // If there are any |dmabuf_fds_| plugged in, we should duplicate them.
413 if (frame->storage_type() == STORAGE_DMABUFS) { 432 if (frame->storage_type() == STORAGE_DMABUFS) {
414 std::vector<int> original_fds; 433 std::vector<int> original_fds;
415 for (size_t i = 0; i < kMaxPlanes; ++i) 434 for (size_t i = 0; i < kMaxPlanes; ++i)
416 original_fds.push_back(frame->dmabuf_fd(i)); 435 original_fds.push_back(frame->dmabuf_fd(i));
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 if (zero_initialize_memory) 1115 if (zero_initialize_memory)
1097 memset(data, 0, data_size); 1116 memset(data, 0, data_size);
1098 1117
1099 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) 1118 for (size_t plane = 0; plane < NumPlanes(format_); ++plane)
1100 data_[plane] = data + offset[plane]; 1119 data_[plane] = data + offset[plane];
1101 1120
1102 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); 1121 AddDestructionObserver(base::Bind(&base::AlignedFree, data));
1103 } 1122 }
1104 1123
1105 } // namespace media 1124 } // namespace media
OLDNEW
« no previous file with comments | « media/base/video_frame.h ('k') | media/base/video_frame_pool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698