diff mbox series

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

Message ID 20220323110325.5499-4-leo.izen@gmail.com
State New
Headers show
Series [FFmpeg-devel,v9,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
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Leo Izen March 23, 2022, 11:03 a.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

Michael Niedermayer March 24, 2022, 6:38 p.m. UTC | #1
On Wed, Mar 23, 2022 at 07:03:24AM -0400, Leo Izen wrote:
> 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(-)

make -j32 tools/probetest && tools/probetest 256 4096

testing size=1
testing size=2
testing size=4
Assertion n>=0 && n<=32 failed at libavcodec/get_bits.h:549
Aborted (core dumped)


[...]
Leo Izen March 28, 2022, 8:51 p.m. UTC | #2
On 3/24/22 14:38, Michael Niedermayer wrote:
> make -j32 tools/probetest && tools/probetest 256 4096
>
> testing size=1
> testing size=2
> testing size=4
> Assertion n>=0 && n<=32 failed at libavcodec/get_bits.h:549
> Aborted (core dumped)
Not sure where this failure is coming from as I cannot reproduce it.

Leo Izen (thebombzen)
Andreas Rheinhardt March 30, 2022, 11:16 a.m. UTC | #3
Leo Izen:
> On 3/24/22 14:38, Michael Niedermayer wrote:
>> make -j32 tools/probetest && tools/probetest 256 4096
>>
>> testing size=1
>> testing size=2
>> testing size=4
>> Assertion n>=0 && n<=32 failed at libavcodec/get_bits.h:549
>> Aborted (core dumped)
> Not sure where this failure is coming from as I cannot reproduce it.
> 

It's an av_assert2() assert, i.e. only enabled with --assert-level=2
when running configure. And it is expected that this happens, given that
the get_bits-functions are not supposed to be used for skipping.
Actually, setting assert-level=2 should be done when developing FFmpeg;
it is the equivalent of enabling asserts (for non-release builds).

- Andreas
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, \