diff mbox

[FFmpeg-devel,1/2] avutil: add P016 pixel format

Message ID 20161120223552.16375-2-philipl@overt.org
State Superseded
Headers show

Commit Message

Philip Langdale Nov. 20, 2016, 10:35 p.m. UTC
P016 is the 16-bit variant of NV12 (planar luma, packed chroma), using
two bytes per component.

It may, and in fact is most likely to, be used in situations where
there are less than 16 bits of data. It is the responsibility of
the writer to zero out any unused LSBs.

Signed-off-by: Philip Langdale <philipl@overt.org>
---
 libavutil/pixdesc.c | 24 ++++++++++++++++++++++++
 libavutil/pixfmt.h  |  4 ++++
 2 files changed, 28 insertions(+)

Comments

wm4 Nov. 21, 2016, 3:43 p.m. UTC | #1
On Sun, 20 Nov 2016 14:35:51 -0800
Philip Langdale <philipl@overt.org> wrote:

> P016 is the 16-bit variant of NV12 (planar luma, packed chroma), using
> two bytes per component.
> 
> It may, and in fact is most likely to, be used in situations where
> there are less than 16 bits of data. It is the responsibility of
> the writer to zero out any unused LSBs.
> 
> Signed-off-by: Philip Langdale <philipl@overt.org>
> ---
>  libavutil/pixdesc.c | 24 ++++++++++++++++++++++++
>  libavutil/pixfmt.h  |  4 ++++
>  2 files changed, 28 insertions(+)
> 
> diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
> index f8092ef..3b9c45d 100644
> --- a/libavutil/pixdesc.c
> +++ b/libavutil/pixdesc.c
> @@ -2078,6 +2078,30 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
>          },
>          .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
>      },
> +    [AV_PIX_FMT_P016LE] = {
> +        .name = "p016le",
> +        .nb_components = 3,
> +        .log2_chroma_w = 1,
> +        .log2_chroma_h = 1,
> +        .comp = {
> +            { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
> +            { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
> +            { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
> +        },
> +        .flags = AV_PIX_FMT_FLAG_PLANAR,
> +    },
> +    [AV_PIX_FMT_P016BE] = {
> +        .name = "p016be",
> +        .nb_components = 3,
> +        .log2_chroma_w = 1,
> +        .log2_chroma_h = 1,
> +        .comp = {
> +            { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
> +            { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
> +            { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
> +        },
> +        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
> +    },
>      [AV_PIX_FMT_GBRAP12LE] = {
>          .name = "gbrap12le",
>          .nb_components = 4,
> diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
> index 96860ce..dfb1b11 100644
> --- a/libavutil/pixfmt.h
> +++ b/libavutil/pixfmt.h
> @@ -311,6 +311,9 @@ enum AVPixelFormat {
>      AV_PIX_FMT_GRAY10BE,   ///<        Y        , 10bpp, big-endian
>      AV_PIX_FMT_GRAY10LE,   ///<        Y        , 10bpp, little-endian
>  
> +    AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian
> +    AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian
> +
>      AV_PIX_FMT_NB         ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
>  };
>  
> @@ -389,6 +392,7 @@ enum AVPixelFormat {
>  #define AV_PIX_FMT_NV20       AV_PIX_FMT_NE(NV20BE,  NV20LE)
>  #define AV_PIX_FMT_AYUV64     AV_PIX_FMT_NE(AYUV64BE, AYUV64LE)
>  #define AV_PIX_FMT_P010       AV_PIX_FMT_NE(P010BE,  P010LE)
> +#define AV_PIX_FMT_P016       AV_PIX_FMT_NE(P016BE,  P016LE)
>  
>  /**
>    * Chromaticity coordinates of the source primaries.

Probably fine, though these pixdesc fields are all kinds of tricky. You
changed shift from 6 to 0 and depth from 10 to 16, which looks right.

Probably lacks a libavutil minor bump or so.
diff mbox

Patch

diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index f8092ef..3b9c45d 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -2078,6 +2078,30 @@  static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
         },
         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
     },
+    [AV_PIX_FMT_P016LE] = {
+        .name = "p016le",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 1,
+        .comp = {
+            { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
+            { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
+            { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_P016BE] = {
+        .name = "p016be",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 1,
+        .comp = {
+            { 0, 2, 0, 0, 16, 1, 15, 1 },       /* Y */
+            { 1, 4, 0, 0, 16, 3, 15, 1 },       /* U */
+            { 1, 4, 2, 0, 16, 3, 15, 3 },       /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_BE,
+    },
     [AV_PIX_FMT_GBRAP12LE] = {
         .name = "gbrap12le",
         .nb_components = 4,
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 96860ce..dfb1b11 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -311,6 +311,9 @@  enum AVPixelFormat {
     AV_PIX_FMT_GRAY10BE,   ///<        Y        , 10bpp, big-endian
     AV_PIX_FMT_GRAY10LE,   ///<        Y        , 10bpp, little-endian
 
+    AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian
+    AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian
+
     AV_PIX_FMT_NB         ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
 };
 
@@ -389,6 +392,7 @@  enum AVPixelFormat {
 #define AV_PIX_FMT_NV20       AV_PIX_FMT_NE(NV20BE,  NV20LE)
 #define AV_PIX_FMT_AYUV64     AV_PIX_FMT_NE(AYUV64BE, AYUV64LE)
 #define AV_PIX_FMT_P010       AV_PIX_FMT_NE(P010BE,  P010LE)
+#define AV_PIX_FMT_P016       AV_PIX_FMT_NE(P016BE,  P016LE)
 
 /**
   * Chromaticity coordinates of the source primaries.