Reviewers: dnicoara, Daniele Castagna, aleksandar.stojiljkovic
CL:
https://codereview.chromium.org/2113243003/Message:
dnicoara@, could you review?
It's initial patch for support 8bit and 16bit video stream.
Y8 name is after UVC fourcc, as Y means luma;
https://github.com/torvalds/linux/blob/master/include/uapi/linux/videodev2.h#L489Depth 16bit stream will use Y16. Y16 can be used for other cases also.
What do you think? specific Z16 is better than unified Y16?
FYI, UVC fourcc has both Z16 and Y16. I think Y16 is enough.
Description:
media: Introduce Y8 and Y16 video pixel format
Depth and infrared camera uses these format.
TODO: native support for depth camera.
BUG=624436
Base URL:
https://chromium.googlesource.com/chromium/src.git@masterAffected files (+20, -3 lines):
M media/base/video_frame.cc
M media/base/video_types.h
M media/base/video_types.cc
M media/renderers/skcanvas_video_renderer.cc
Index: media/base/video_frame.cc
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
index 2de6bd36d5cdffb60956aa515a3824671db29b7d..38a6438b5972c16c057e11ea72e017746bb28c88 100644
--- a/media/base/video_frame.cc
+++ b/media/base/video_frame.cc
@@ -125,7 +125,7 @@ bool VideoFrame::IsValidConfig(VideoPixelFormat format,
return true;
// Make sure new formats are properly accounted for in the method.
- static_assert(PIXEL_FORMAT_MAX == 21,
+ static_assert(PIXEL_FORMAT_MAX == 23,
"Added pixel format, please review IsValidConfig()");
if (format == PIXEL_FORMAT_UNKNOWN) {
@@ -535,6 +535,8 @@ size_t VideoFrame::NumPlanes(VideoPixelFormat format) {
case PIXEL_FORMAT_RGB24:
case PIXEL_FORMAT_RGB32:
case PIXEL_FORMAT_MJPEG:
+ case PIXEL_FORMAT_Y8:
+ case PIXEL_FORMAT_Y16:
return 1;
case PIXEL_FORMAT_NV12:
case PIXEL_FORMAT_NV21:
@@ -1041,6 +1043,8 @@ gfx::Size VideoFrame::SampleSize(VideoPixelFormat format, size_t plane) {
case PIXEL_FORMAT_RGB24:
case PIXEL_FORMAT_RGB32:
case PIXEL_FORMAT_MJPEG:
+ case PIXEL_FORMAT_Y8:
+ case PIXEL_FORMAT_Y16:
break;
}
}
@@ -1058,6 +1062,7 @@ int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) {
return 4;
case PIXEL_FORMAT_RGB24:
return 3;
+ case PIXEL_FORMAT_Y16:
case PIXEL_FORMAT_UYVY:
case PIXEL_FORMAT_YUY2:
case PIXEL_FORMAT_YUV420P9:
@@ -1079,6 +1084,7 @@ int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) {
case PIXEL_FORMAT_YV16:
case PIXEL_FORMAT_YV12A:
case PIXEL_FORMAT_YV24:
+ case PIXEL_FORMAT_Y8:
return 1;
case PIXEL_FORMAT_MJPEG:
return 0;
Index: media/base/video_types.cc
diff --git a/media/base/video_types.cc b/media/base/video_types.cc
index f8eeb3e1bb433e03cf390223173204664806611e..9059e87a7d075c9fdd7358cf321e5edf2c5c4f14 100644
--- a/media/base/video_types.cc
+++ b/media/base/video_types.cc
@@ -54,6 +54,10 @@ std::string VideoPixelFormatToString(VideoPixelFormat format) {
return "PIXEL_FORMAT_YUV444P9";
case PIXEL_FORMAT_YUV444P10:
return "PIXEL_FORMAT_YUV444P10";
+ case PIXEL_FORMAT_Y8:
+ return "PIXEL_FORMAT_Y8";
+ case PIXEL_FORMAT_Y16:
+ return "PIXEL_FORMAT_Y16";
}
NOTREACHED() << "Invalid VideoPixelFormat provided: " << format;
return "";
@@ -85,6 +89,8 @@ bool IsYuvPlanar(VideoPixelFormat format) {
case PIXEL_FORMAT_RGB24:
case PIXEL_FORMAT_RGB32:
case PIXEL_FORMAT_MJPEG:
+ case PIXEL_FORMAT_Y8:
+ case PIXEL_FORMAT_Y16:
return false;
}
return false;
@@ -111,6 +117,8 @@ bool IsOpaque(VideoPixelFormat format) {
case PIXEL_FORMAT_YUV422P10:
case PIXEL_FORMAT_YUV444P9:
case PIXEL_FORMAT_YUV444P10:
+ case PIXEL_FORMAT_Y8:
+ case PIXEL_FORMAT_Y16:
return true;
case PIXEL_FORMAT_YV12A:
case PIXEL_FORMAT_ARGB:
Index: media/base/video_types.h
diff --git a/media/base/video_types.h b/media/base/video_types.h
index 7590b1b3a25d4e67a0018eda302f129861aa7cdd..8b225fb3f15db6b4465745b234fcf4963d07a4d4 100644
--- a/media/base/video_types.h
+++ b/media/base/video_types.h
@@ -53,10 +53,11 @@ enum VideoPixelFormat {
PIXEL_FORMAT_YUV422P10 = 19,
PIXEL_FORMAT_YUV444P9 = 20,
PIXEL_FORMAT_YUV444P10 = 21,
-
+ PIXEL_FORMAT_Y8 = 22, // single 8bpp plane.
+ PIXEL_FORMAT_Y16 = 23, // single 16bpp plane.
// Please update UMA histogram enumeration when adding new formats here.
PIXEL_FORMAT_MAX =
- PIXEL_FORMAT_YUV444P10, // Must always be equal to largest entry logged.
+ PIXEL_FORMAT_Y16, // Must always be equal to largest entry logged.
};
// Color space or color range used for the pixels.
Index: media/renderers/skcanvas_video_renderer.cc
diff --git a/media/renderers/skcanvas_video_renderer.cc b/media/renderers/skcanvas_video_renderer.cc
index df59249862b7157b68704f493dd636c0ea7151a5..d5634faab54dab6a792c800dd521f8940426a208 100644
--- a/media/renderers/skcanvas_video_renderer.cc
+++ b/media/renderers/skcanvas_video_renderer.cc
@@ -636,6 +636,8 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
case PIXEL_FORMAT_RGB32:
case PIXEL_FORMAT_MJPEG:
case PIXEL_FORMAT_MT21:
+ case PIXEL_FORMAT_Y8:
+ case PIXEL_FORMAT_Y16:
case PIXEL_FORMAT_UNKNOWN:
NOTREACHED();
}