1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // Note: ported from Chromium commit head: 3b7ce92816e2 5 // Note: only necessary functions are ported from video_types.h 6 7 #ifndef ANDROID_V4L2_CODEC2_COMMON_VIDEO_PIXEL_FORMAT_H 8 #define ANDROID_V4L2_CODEC2_COMMON_VIDEO_PIXEL_FORMAT_H 9 10 #include <string> 11 12 #include "ui/Size.h" 13 14 namespace android { 15 16 // Pixel formats roughly based on FOURCC labels, see: 17 // http://www.fourcc.org/rgb.php and http://www.fourcc.org/yuv.php 18 enum class VideoPixelFormat { 19 I420, // 12bpp YUV planar 1x1 Y, 2x2 UV samples, a.k.a. YU12. 20 YV12, // 12bpp YVU planar 1x1 Y, 2x2 VU samples. 21 I422, // 16bpp YUV planar 1x1 Y, 2x1 UV samples. 22 I420A, // 20bpp YUVA planar 1x1 Y, 2x2 UV, 1x1 A samples. 23 I444, // 24bpp YUV planar, no subsampling. 24 NV12, // 12bpp with Y plane followed by a 2x2 interleaved UV plane. 25 NV21, // 12bpp with Y plane followed by a 2x2 interleaved VU plane. 26 YUY2, // 16bpp interleaved 1x1 Y, 2x1 U, 1x1 Y, 2x1 V samples. 27 ARGB, // 32bpp BGRA (byte-order), 1 plane. 28 XRGB, // 24bpp BGRX (byte-order), 1 plane. 29 RGB24, // 24bpp BGR (byte-order), 1 plane. 30 MJPEG, // MJPEG compressed. 31 Y16, // single 16bpp plane. 32 ABGR, // 32bpp RGBA (byte-order), 1 plane. 33 XBGR, // 24bpp RGBX (byte-order), 1 plane. 34 P016LE, // 24bpp NV12, 16 bits per channel 35 XR30, // 32bpp BGRX, 10 bits per channel, 2 bits ignored, 1 plane 36 XB30, // 32bpp RGBX, 10 bits per channel, 2 bits ignored, 1 plane 37 BGRA, // 32bpp ARGB (byte-order), 1 plane. 38 // The P* in the formats below designates the number of bits per pixel component. I.e. P9 is 39 // 9-bits per pixel component, P10 is 10-bits per pixel component, etc. 40 YUV420P9, 41 YUV420P10, 42 YUV422P9, 43 YUV422P10, 44 YUV444P9, 45 YUV444P10, 46 YUV420P12, 47 YUV422P12, 48 YUV444P12, 49 UNKNOWN, // Unknown or unspecified format value. 50 }; 51 52 // Returns the name of a Format as a string. 53 std::string videoPixelFormatToString(VideoPixelFormat format); 54 55 // Returns human readable fourcc string. If any of the four characters is non-printable, it outputs 56 // "0x<32-bit integer in hex>", e.g. FourccToString(0x66616b00) returns "0x66616b00". 57 std::string fourccToString(uint32_t fourcc); 58 59 // Returns the number of significant bits per channel. 60 size_t bitDepth(VideoPixelFormat format); 61 62 // Returns the number of planes for the |format|. 63 size_t numPlanes(VideoPixelFormat format); 64 65 // Returns required allocation size for a (tightly packed) frame of the given coded size and format. 66 size_t allocationSize(VideoPixelFormat format, const android::ui::Size& coded_size); 67 68 // Returns the plane Size (in bytes) for a plane of the given coded size and format. 69 android::ui::Size planeSize(VideoPixelFormat format, size_t plane, 70 const android::ui::Size& coded_size); 71 72 // Returns horizontal bits per pixel for given |plane| and |format|. 73 int planeHorizontalBitsPerPixel(VideoPixelFormat format, size_t plane); 74 75 // Returns bits per pixel for given |plane| and |format|. 76 int planeBitsPerPixel(VideoPixelFormat format, size_t plane); 77 78 // Returns the number of bytes per element for given |plane| and |format|. 79 int bytesPerElement(VideoPixelFormat format, size_t plane); 80 81 // Returns true if |plane| is a valid plane index for the given |format|. 82 bool isValidPlane(VideoPixelFormat format, size_t plane); 83 84 // Returns the pixel size of each subsample for a given |plane| and |format|. 85 // E.g. 2x2 for the U-plane in I420. 86 android::ui::Size SampleSize(VideoPixelFormat format, size_t plane); 87 88 } // namespace android 89 90 #endif // ANDROID_V4L2_CODEC2_COMMON_VIDEO_PIXEL_FORMAT_H 91