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

Unified Diff: media/blink/skcanvas_video_renderer.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, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/video_frame_unittest.cc ('k') | media/blink/video_frame_compositor.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/blink/skcanvas_video_renderer.cc
diff --git a/media/blink/skcanvas_video_renderer.cc b/media/blink/skcanvas_video_renderer.cc
index f86e118d753d49dbb135b1ac3a742487ff75477a..2d3a416b3fd80fa4dc4d69e73ad2fd833e0cb9d2 100644
--- a/media/blink/skcanvas_video_renderer.cc
+++ b/media/blink/skcanvas_video_renderer.cc
@@ -42,27 +42,6 @@ namespace {
// a temporary resource if it is not used for 3 sec.
const int kTemporaryResourceDeletionDelay = 3; // Seconds;
-bool IsYUV(media::VideoFrame::Format format) {
- switch (format) {
- case VideoFrame::YV12:
- case VideoFrame::YV16:
- case VideoFrame::I420:
- case VideoFrame::YV12A:
- case VideoFrame::YV24:
- case VideoFrame::NV12:
- return true;
- case VideoFrame::UNKNOWN:
- case VideoFrame::NATIVE_TEXTURE:
-#if defined(VIDEO_HOLE)
- case VideoFrame::HOLE:
-#endif // defined(VIDEO_HOLE)
- case VideoFrame::ARGB:
- return false;
- }
- NOTREACHED() << "Invalid videoframe format provided: " << format;
- return false;
-}
-
bool CheckColorSpace(const scoped_refptr<VideoFrame>& video_frame,
VideoFrame::ColorSpace color_space) {
int result;
@@ -71,10 +50,6 @@ bool CheckColorSpace(const scoped_refptr<VideoFrame>& video_frame,
result == color_space;
}
-bool IsYUVOrNative(media::VideoFrame::Format format) {
- return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE;
-}
-
bool IsSkBitmapProperlySizedTexture(const SkBitmap* bitmap,
const gfx::Size& size) {
return bitmap->getTexture() && bitmap->width() == size.width() &&
@@ -184,7 +159,7 @@ class VideoImageGenerator : public SkImageGenerator {
void* planes[3],
size_t row_bytes[3],
SkYUVColorSpace* color_space) override {
- if (!frame_.get() || !IsYUV(frame_->format()) ||
+ if (!frame_.get() || !media::VideoFrame::IsYuvPlanar(frame_->format()) ||
// TODO(rileya): Skia currently doesn't support Rec709 YUV conversion,
// or YUVA conversion. Remove this case once it does. As-is we will
// fall back on the pure-software path in this case.
@@ -294,7 +269,8 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
// Paint black rectangle if there isn't a frame available or the
// frame has an unexpected format.
if (!video_frame.get() || video_frame->natural_size().IsEmpty() ||
- !IsYUVOrNative(video_frame->format())) {
+ !(media::VideoFrame::IsYuvPlanar(video_frame->format()) ||
+ (video_frame->storage_type() == media::VideoFrame::STORAGE_TEXTURE))) {
canvas->drawRect(dest, paint);
canvas->flush();
return;
@@ -302,7 +278,7 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
SkBitmap* target_frame = nullptr;
- if (video_frame->format() == VideoFrame::NATIVE_TEXTURE) {
+ if (video_frame->storage_type() == VideoFrame::STORAGE_TEXTURE) {
// Draw HW Video on both SW and HW Canvas.
// In SW Canvas case, rely on skia drawing Ganesh SkBitmap on SW SkCanvas.
if (accelerated_last_frame_.isNull() ||
@@ -329,7 +305,6 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
target_frame = &accelerated_last_frame_;
accelerated_frame_deleting_timer_.Reset();
} else if (canvas->getGrContext()) {
- DCHECK(video_frame->format() != VideoFrame::NATIVE_TEXTURE);
if (accelerated_last_frame_.isNull() ||
video_frame->timestamp() != accelerated_last_frame_timestamp_) {
// Draw SW Video on HW Canvas.
@@ -358,7 +333,7 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
accelerated_frame_deleting_timer_.Reset();
} else {
// Draw SW Video on SW Canvas.
- DCHECK(video_frame->format() != VideoFrame::NATIVE_TEXTURE);
+ DCHECK(VideoFrame::IsMappable(video_frame->storage_type()));
if (last_frame_.isNull() ||
video_frame->timestamp() != last_frame_timestamp_) {
// Check if |bitmap| needs to be (re)allocated.
@@ -442,29 +417,31 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
const scoped_refptr<media::VideoFrame>& video_frame,
void* rgb_pixels,
size_t row_bytes) {
- DCHECK(IsYUVOrNative(video_frame->format()))
- << video_frame->format();
- if (IsYUV(video_frame->format())) {
- DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane),
- video_frame->stride(media::VideoFrame::kVPlane));
+ if (!VideoFrame::IsMappable(video_frame->storage_type())) {
+ NOTREACHED() << "Cannot extract pixels from non-CPU frame formats.";
+ return;
}
-
- size_t y_offset = 0;
- size_t uv_offset = 0;
- if (IsYUV(video_frame->format())) {
- int y_shift = (video_frame->format() == media::VideoFrame::YV16) ? 0 : 1;
- // Use the "left" and "top" of the destination rect to locate the offset
- // in Y, U and V planes.
- y_offset = (video_frame->stride(media::VideoFrame::kYPlane) *
- video_frame->visible_rect().y()) +
- video_frame->visible_rect().x();
- // For format YV12, there is one U, V value per 2x2 block.
- // For format YV16, there is one U, V value per 2x1 block.
- uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) *
- (video_frame->visible_rect().y() >> y_shift)) +
- (video_frame->visible_rect().x() >> 1);
+ if (!media::VideoFrame::IsYuvPlanar(video_frame->format())) {
+ NOTREACHED() << "Non YUV formats are not supported";
+ return;
}
+ DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane),
+ video_frame->stride(media::VideoFrame::kVPlane));
+
+ const int y_shift =
+ (video_frame->format() == media::VideoFrame::YV16) ? 0 : 1;
+ // Use the "left" and "top" of the destination rect to locate the offset
+ // in Y, U and V planes.
+ const size_t y_offset = (video_frame->stride(media::VideoFrame::kYPlane) *
+ video_frame->visible_rect().y()) +
+ video_frame->visible_rect().x();
+ // For format YV12, there is one U, V value per 2x2 block.
+ // For format YV16, there is one U, V value per 2x1 block.
+ const size_t uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) *
+ (video_frame->visible_rect().y() >> y_shift)) +
+ (video_frame->visible_rect().x() >> 1);
+
switch (video_frame->format()) {
case VideoFrame::YV12:
case VideoFrame::I420:
@@ -560,16 +537,12 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
video_frame->visible_rect().height());
#endif
break;
-
- case VideoFrame::NATIVE_TEXTURE:
- NOTREACHED();
- break;
-#if defined(VIDEO_HOLE)
- case VideoFrame::HOLE:
-#endif // defined(VIDEO_HOLE)
+#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
+ case VideoFrame::NV12:
+#endif
case VideoFrame::ARGB:
+ case VideoFrame::XRGB:
case VideoFrame::UNKNOWN:
- case VideoFrame::NV12:
NOTREACHED();
}
}
@@ -583,8 +556,10 @@ void SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(
unsigned int type,
bool premultiply_alpha,
bool flip_y) {
- DCHECK(video_frame && video_frame->format() == VideoFrame::NATIVE_TEXTURE);
- DCHECK_EQ(1u, VideoFrame::NumTextures(video_frame->texture_format()));
+ DCHECK(video_frame);
+ DCHECK_EQ(video_frame->storage_type(), VideoFrame::STORAGE_TEXTURE);
+ DCHECK_EQ(1u, VideoFrame::NumPlanes(video_frame->format()));
+
const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(0);
DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB ||
« no previous file with comments | « media/base/video_frame_unittest.cc ('k') | media/blink/video_frame_compositor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698