[FFmpeg-devel] avutil: Add NV24 and NV42 pixel formats

Submitted by Philip Langdale on May 7, 2019, 4:32 a.m.

Details

Message ID 20190507043247.17193-1-philipl@overt.org
State New
Headers show

Commit Message

Philip Langdale May 7, 2019, 4:32 a.m.
These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.

I'm surprised we've not had a reason to add them until now, but
they are the format that VDPAU uses when doing interop for 4:4:4
surfaces.

Signed-off-by: Philip Langdale <philipl@overt.org>
---
 libavutil/pixdesc.c           | 24 ++++++++++++++++++++++++
 libavutil/pixfmt.h            |  3 +++
 libavutil/tests/pixfmt_best.c |  1 +
 libavutil/version.h           |  2 +-
 4 files changed, 29 insertions(+), 1 deletion(-)

Comments

Manoj Bonda May 7, 2019, 9:16 a.m.
Thanks philip for taking this up. 

LGTM.

Thanks,
ManojGupta.

> -----Original Message-----

> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Philip

> Langdale

> Sent: Tuesday, May 7, 2019 10:03 AM

> To: ffmpeg-devel@ffmpeg.org

> Cc: Philip Langdale <philipl@overt.org>

> Subject: [FFmpeg-devel] [PATCH] avutil: Add NV24 and NV42 pixel formats

> 

> These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.

> 

> I'm surprised we've not had a reason to add them until now, but they are

> the format that VDPAU uses when doing interop for 4:4:4 surfaces.

> 

> Signed-off-by: Philip Langdale <philipl@overt.org>

> ---

>  libavutil/pixdesc.c           | 24 ++++++++++++++++++++++++

>  libavutil/pixfmt.h            |  3 +++

>  libavutil/tests/pixfmt_best.c |  1 +

>  libavutil/version.h           |  2 +-

>  4 files changed, 29 insertions(+), 1 deletion(-)

> 

> diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index

> fe38344d73..b97b0665b0 100644

> --- a/libavutil/pixdesc.c

> +++ b/libavutil/pixdesc.c

> @@ -2320,6 +2320,30 @@ static const AVPixFmtDescriptor

> av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {

>          },

>          .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,

>      },

> +    [AV_PIX_FMT_NV24] = {

> +        .name = "nv24",

> +        .nb_components = 3,

> +        .log2_chroma_w = 0,

> +        .log2_chroma_h = 0,

> +        .comp = {

> +            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */

> +            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* U */

> +            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* V */

> +        },

> +        .flags = AV_PIX_FMT_FLAG_PLANAR,

> +    },

> +    [AV_PIX_FMT_NV42] = {

> +        .name = "nv42",

> +        .nb_components = 3,

> +        .log2_chroma_w = 0,

> +        .log2_chroma_h = 0,

> +        .comp = {

> +            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */

> +            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* U */

> +            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* V */

> +        },

> +        .flags = AV_PIX_FMT_FLAG_PLANAR,

> +    },

>  };

>  #if FF_API_PLUS1_MINUS1

>  FF_ENABLE_DEPRECATION_WARNINGS

> diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h index

> 24d1b7e415..8b54c9415b 100644

> --- a/libavutil/pixfmt.h

> +++ b/libavutil/pixfmt.h

> @@ -345,6 +345,9 @@ enum AVPixelFormat {

>      AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb

> sample per 1x1 Y samples), 12b alpha, big-endian

>      AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb

> sample per 1x1 Y samples), 12b alpha, little-endian

> 

> +    AV_PIX_FMT_NV24,      ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1

> plane for the UV components, which are interleaved (first byte U and the

> following byte V)

> +    AV_PIX_FMT_NV42,      ///< as above, but U and V bytes are swapped

> +

>      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

>  };

> 

> diff --git a/libavutil/tests/pixfmt_best.c b/libavutil/tests/pixfmt_best.c index

> e98fcc19a5..53f7264207 100644

> --- a/libavutil/tests/pixfmt_best.c

> +++ b/libavutil/tests/pixfmt_best.c

> @@ -76,6 +76,7 @@ int main(void)

>      TEST(AV_PIX_FMT_P010,      AV_PIX_FMT_YUV420P10);

>      TEST(AV_PIX_FMT_P016,      AV_PIX_FMT_YUV420P16);

>      TEST(AV_PIX_FMT_NV16,      AV_PIX_FMT_YUV422P);

> +    TEST(AV_PIX_FMT_NV24,      AV_PIX_FMT_YUV444P);

>      TEST(AV_PIX_FMT_YUYV422,   AV_PIX_FMT_YUV422P);

>      TEST(AV_PIX_FMT_UYVY422,   AV_PIX_FMT_YUV422P);

>      TEST(AV_PIX_FMT_BGR565,    AV_PIX_FMT_RGB565);

> diff --git a/libavutil/version.h b/libavutil/version.h index

> c0968de621..4922e267cc 100644

> --- a/libavutil/version.h

> +++ b/libavutil/version.h

> @@ -80,7 +80,7 @@

> 

>  #define LIBAVUTIL_VERSION_MAJOR  56

>  #define LIBAVUTIL_VERSION_MINOR  26

> -#define LIBAVUTIL_VERSION_MICRO 101

> +#define LIBAVUTIL_VERSION_MICRO 102

> 

>  #define LIBAVUTIL_VERSION_INT

> AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

>                                                 LIBAVUTIL_VERSION_MINOR, \

> --

> 2.20.1

> 

> _______________________________________________

> ffmpeg-devel mailing list

> ffmpeg-devel@ffmpeg.org

> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

> 

> To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org

> with subject "unsubscribe".


-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------
Carl Eugen Hoyos May 7, 2019, 9:43 p.m.
Am Di., 7. Mai 2019 um 06:33 Uhr schrieb Philip Langdale <philipl@overt.org>:
>
> These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.
>
> I'm surprised we've not had a reason to add them until now, but
> they are the format that VDPAU uses when doing interop for 4:4:4
> surfaces.

Is there already a (libswscale) patch that actually uses the new
formats?

Thank you, Carl Eugen
Philip Langdale May 7, 2019, 10:19 p.m.
On 2019-05-07 14:43, Carl Eugen Hoyos wrote:
> Am Di., 7. Mai 2019 um 06:33 Uhr schrieb Philip Langdale 
> <philipl@overt.org>:
>> 
>> These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.
>> 
>> I'm surprised we've not had a reason to add them until now, but
>> they are the format that VDPAU uses when doing interop for 4:4:4
>> surfaces.
> 
> Is there already a (libswscale) patch that actually uses the new
> formats?

No. I haven't written any swscale code for this yet, although I could,
but there's no specific requirement for it.

ffmpeg doesn't implement any of the (opengl) interop, but I've got an
mpv patch that does it and it needs the pixfmt to be able to work.

--phil
Carl Eugen Hoyos May 8, 2019, 5:59 a.m.
Am Mi., 8. Mai 2019 um 00:20 Uhr schrieb Philip Langdale <philipl@overt.org>:
>
> On 2019-05-07 14:43, Carl Eugen Hoyos wrote:
> > Am Di., 7. Mai 2019 um 06:33 Uhr schrieb Philip Langdale
> > <philipl@overt.org>:
> >>
> >> These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.
> >>
> >> I'm surprised we've not had a reason to add them until now, but
> >> they are the format that VDPAU uses when doing interop for 4:4:4
> >> surfaces.
> >
> > Is there already a (libswscale) patch that actually uses the new
> > formats?
>
> No. I haven't written any swscale code for this yet, although I could,
> but there's no specific requirement for it.
>
> ffmpeg doesn't implement any of the (opengl) interop, but I've got an
> mpv patch that does it and it needs the pixfmt to be able to work.

How is ffmpeg (or any other application using libav*) handling
the vdpau output if there is no conversion available?

Sorry if I misunderstand, Carl Eugen
Michael Niedermayer May 8, 2019, 9 p.m.
On Tue, May 07, 2019 at 03:19:55PM -0700, Philip Langdale wrote:
> On 2019-05-07 14:43, Carl Eugen Hoyos wrote:
> >Am Di., 7. Mai 2019 um 06:33 Uhr schrieb Philip Langdale
> ><philipl@overt.org>:
> >>
> >>These are the 4:4:4 variants of the semi-planar NV12/NV21 formats.
> >>
> >>I'm surprised we've not had a reason to add them until now, but
> >>they are the format that VDPAU uses when doing interop for 4:4:4
> >>surfaces.
> >
> >Is there already a (libswscale) patch that actually uses the new
> >formats?
> 
> No. I haven't written any swscale code for this yet, although I could,
> but there's no specific requirement for it.

being able to convert to and from a format has advantages. So i too
think it would be "nice to have" some support for that

thanks

[...]

Patch hide | download patch | download mbox

diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index fe38344d73..b97b0665b0 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -2320,6 +2320,30 @@  static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = {
         },
         .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
     },
+    [AV_PIX_FMT_NV24] = {
+        .name = "nv24",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
+            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* U */
+            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_NV42] = {
+        .name = "nv42",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
+            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* U */
+            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
 };
 #if FF_API_PLUS1_MINUS1
 FF_ENABLE_DEPRECATION_WARNINGS
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 24d1b7e415..8b54c9415b 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -345,6 +345,9 @@  enum AVPixelFormat {
     AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian
     AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian
 
+    AV_PIX_FMT_NV24,      ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+    AV_PIX_FMT_NV42,      ///< as above, but U and V bytes are swapped
+
     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
 };
 
diff --git a/libavutil/tests/pixfmt_best.c b/libavutil/tests/pixfmt_best.c
index e98fcc19a5..53f7264207 100644
--- a/libavutil/tests/pixfmt_best.c
+++ b/libavutil/tests/pixfmt_best.c
@@ -76,6 +76,7 @@  int main(void)
     TEST(AV_PIX_FMT_P010,      AV_PIX_FMT_YUV420P10);
     TEST(AV_PIX_FMT_P016,      AV_PIX_FMT_YUV420P16);
     TEST(AV_PIX_FMT_NV16,      AV_PIX_FMT_YUV422P);
+    TEST(AV_PIX_FMT_NV24,      AV_PIX_FMT_YUV444P);
     TEST(AV_PIX_FMT_YUYV422,   AV_PIX_FMT_YUV422P);
     TEST(AV_PIX_FMT_UYVY422,   AV_PIX_FMT_YUV422P);
     TEST(AV_PIX_FMT_BGR565,    AV_PIX_FMT_RGB565);
diff --git a/libavutil/version.h b/libavutil/version.h
index c0968de621..4922e267cc 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -80,7 +80,7 @@ 
 
 #define LIBAVUTIL_VERSION_MAJOR  56
 #define LIBAVUTIL_VERSION_MINOR  26
-#define LIBAVUTIL_VERSION_MICRO 101
+#define LIBAVUTIL_VERSION_MICRO 102
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                LIBAVUTIL_VERSION_MINOR, \