diff mbox series

[FFmpeg-devel,v7,4/5] avformat/image2: add Jpeg XL as image2 format

Message ID 20220319172645.82718-4-leo.izen@gmail.com
State New
Headers show
Series [FFmpeg-devel,v7,1/5] avcodec/jpegxl: add Jpeg XL image codec and parser | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished

Commit Message

Leo Izen March 19, 2022, 5:26 p.m. UTC
This commit adds support to libavformat for muxing
and demuxing Jpeg XL images as image2 streams.
---
 libavformat/allformats.c |  1 +
 libavformat/img2.c       |  1 +
 libavformat/img2dec.c    | 21 +++++++++++++++++++++
 libavformat/img2enc.c    |  6 +++---
 libavformat/mov.c        |  1 +
 libavformat/version.h    |  4 ++--
 6 files changed, 29 insertions(+), 5 deletions(-)

Comments

Anton Khirnov March 23, 2022, 11:38 a.m. UTC | #1
Quoting Leo Izen (2022-03-19 18:26:44)
> This commit adds support to libavformat for muxing
> and demuxing Jpeg XL images as image2 streams.
> ---
>  libavformat/allformats.c |  1 +
>  libavformat/img2.c       |  1 +
>  libavformat/img2dec.c    | 21 +++++++++++++++++++++
>  libavformat/img2enc.c    |  6 +++---
>  libavformat/mov.c        |  1 +
>  libavformat/version.h    |  4 ++--
>  6 files changed, 29 insertions(+), 5 deletions(-)
> 
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index 587ad59b3c..941f3643f8 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -510,6 +510,7 @@ extern const AVInputFormat  ff_image_gif_pipe_demuxer;
>  extern const AVInputFormat  ff_image_j2k_pipe_demuxer;
>  extern const AVInputFormat  ff_image_jpeg_pipe_demuxer;
>  extern const AVInputFormat  ff_image_jpegls_pipe_demuxer;
> +extern const AVInputFormat  ff_image_jpegxl_pipe_demuxer;
>  extern const AVInputFormat  ff_image_pam_pipe_demuxer;
>  extern const AVInputFormat  ff_image_pbm_pipe_demuxer;
>  extern const AVInputFormat  ff_image_pcx_pipe_demuxer;
> diff --git a/libavformat/img2.c b/libavformat/img2.c
> index 4153102c92..13b1b997b8 100644
> --- a/libavformat/img2.c
> +++ b/libavformat/img2.c
> @@ -87,6 +87,7 @@ const IdStrMap ff_img_tags[] = {
>      { AV_CODEC_ID_GEM,        "img"      },
>      { AV_CODEC_ID_GEM,        "ximg"     },
>      { AV_CODEC_ID_GEM,        "timg"     },
> +    { AV_CODEC_ID_JPEGXL,     "jxl"      },
>      { AV_CODEC_ID_NONE,       NULL       }
>  };
>  
> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
> index b9c06c5b54..32cadacb9d 100644
> --- a/libavformat/img2dec.c
> +++ b/libavformat/img2dec.c
> @@ -32,6 +32,7 @@
>  #include "libavutil/parseutils.h"
>  #include "libavutil/intreadwrite.h"
>  #include "libavcodec/gif.h"
> +#include "libavcodec/jpegxl.h"
>  #include "avformat.h"
>  #include "avio_internal.h"
>  #include "internal.h"
> @@ -836,6 +837,25 @@ static int jpegls_probe(const AVProbeData *p)
>      return 0;
>  }
>  
> +static int jpegxl_probe(const AVProbeData *p)
> +{
> +    const uint8_t *b = p->buf;
> +
> +    /* ISOBMFF-based container */
> +    /* 0x4a584c20 == "JXL " */
> +    if (AV_RL64(b) == FF_JPEGXL_CONTAINER_SIGNATURE_LE)
> +        return AVPROBE_SCORE_EXTENSION + 1;
> +#if CONFIG_JPEGXL_PARSER
> +    /* Raw codestreams all start with 0xff0a */
> +    if (AV_RL16(b) != FF_JPEGXL_CODESTREAM_SIGNATURE_LE)
> +        return 0;
> +    if (avpriv_jpegxl_verify_codestream_header(NULL, p->buf, p->buf_size) == 0)

This function is way too complicated for a probe function. Can you think
of something simpler?
Leo Izen March 23, 2022, 1:14 p.m. UTC | #2
On 3/23/22 07:38, Anton Khirnov wrote:
> +        return 0;
> +    if (avpriv_jpegxl_verify_codestream_header(NULL, p->buf, 
> p->buf_size) == 0)
> This function is way too complicated for a probe function. Can you think
> of something simpler?
This is necessary to prevent the probetest from returning false 
positives. My original patch lacked something like this and it was 
rejected on those grounds.

Leo Izen (thebombzen)
diff mbox series

Patch

diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 587ad59b3c..941f3643f8 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -510,6 +510,7 @@  extern const AVInputFormat  ff_image_gif_pipe_demuxer;
 extern const AVInputFormat  ff_image_j2k_pipe_demuxer;
 extern const AVInputFormat  ff_image_jpeg_pipe_demuxer;
 extern const AVInputFormat  ff_image_jpegls_pipe_demuxer;
+extern const AVInputFormat  ff_image_jpegxl_pipe_demuxer;
 extern const AVInputFormat  ff_image_pam_pipe_demuxer;
 extern const AVInputFormat  ff_image_pbm_pipe_demuxer;
 extern const AVInputFormat  ff_image_pcx_pipe_demuxer;
diff --git a/libavformat/img2.c b/libavformat/img2.c
index 4153102c92..13b1b997b8 100644
--- a/libavformat/img2.c
+++ b/libavformat/img2.c
@@ -87,6 +87,7 @@  const IdStrMap ff_img_tags[] = {
     { AV_CODEC_ID_GEM,        "img"      },
     { AV_CODEC_ID_GEM,        "ximg"     },
     { AV_CODEC_ID_GEM,        "timg"     },
+    { AV_CODEC_ID_JPEGXL,     "jxl"      },
     { AV_CODEC_ID_NONE,       NULL       }
 };
 
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index b9c06c5b54..32cadacb9d 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -32,6 +32,7 @@ 
 #include "libavutil/parseutils.h"
 #include "libavutil/intreadwrite.h"
 #include "libavcodec/gif.h"
+#include "libavcodec/jpegxl.h"
 #include "avformat.h"
 #include "avio_internal.h"
 #include "internal.h"
@@ -836,6 +837,25 @@  static int jpegls_probe(const AVProbeData *p)
     return 0;
 }
 
+static int jpegxl_probe(const AVProbeData *p)
+{
+    const uint8_t *b = p->buf;
+
+    /* ISOBMFF-based container */
+    /* 0x4a584c20 == "JXL " */
+    if (AV_RL64(b) == FF_JPEGXL_CONTAINER_SIGNATURE_LE)
+        return AVPROBE_SCORE_EXTENSION + 1;
+#if CONFIG_JPEGXL_PARSER
+    /* Raw codestreams all start with 0xff0a */
+    if (AV_RL16(b) != FF_JPEGXL_CODESTREAM_SIGNATURE_LE)
+        return 0;
+    if (avpriv_jpegxl_verify_codestream_header(NULL, p->buf, p->buf_size) == 0)
+        return AVPROBE_SCORE_MAX - 2;
+#endif
+    return 0;
+}
+
+
 static int pcx_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
@@ -1165,6 +1185,7 @@  IMAGEAUTO_DEMUXER(gif,       GIF)
 IMAGEAUTO_DEMUXER_EXT(j2k,   JPEG2000, J2K)
 IMAGEAUTO_DEMUXER_EXT(jpeg,  MJPEG, JPEG)
 IMAGEAUTO_DEMUXER(jpegls,    JPEGLS)
+IMAGEAUTO_DEMUXER(jpegxl,    JPEGXL)
 IMAGEAUTO_DEMUXER(pam,       PAM)
 IMAGEAUTO_DEMUXER(pbm,       PBM)
 IMAGEAUTO_DEMUXER(pcx,       PCX)
diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
index 9b3b8741c8..e6ec6a50aa 100644
--- a/libavformat/img2enc.c
+++ b/libavformat/img2enc.c
@@ -263,9 +263,9 @@  static const AVClass img2mux_class = {
 const AVOutputFormat ff_image2_muxer = {
     .name           = "image2",
     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
-    .extensions     = "bmp,dpx,exr,jls,jpeg,jpg,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,png,"
-                      "ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24,"
-                      "sunras,xbm,xface,pix,y",
+    .extensions     = "bmp,dpx,exr,jls,jpeg,jpg,jxl,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,"
+                      "png,ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,"
+                      "im24,sunras,xbm,xface,pix,y",
     .priv_data_size = sizeof(VideoMuxData),
     .video_codec    = AV_CODEC_ID_MJPEG,
     .write_header   = write_header,
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 6c847de164..c4b8873b0a 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -7697,6 +7697,7 @@  static int mov_probe(const AVProbeData *p)
             if (tag == MKTAG('f','t','y','p') &&
                        (   AV_RL32(p->buf + offset + 8) == MKTAG('j','p','2',' ')
                         || AV_RL32(p->buf + offset + 8) == MKTAG('j','p','x',' ')
+                        || AV_RL32(p->buf + offset + 8) == MKTAG('j','x','l',' ')
                     )) {
                 score = FFMAX(score, 5);
             } else {
diff --git a/libavformat/version.h b/libavformat/version.h
index f4a26c2870..683184d5da 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -31,8 +31,8 @@ 
 
 #include "version_major.h"
 
-#define LIBAVFORMAT_VERSION_MINOR  20
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MINOR  21
+#define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \