diff mbox series

[FFmpeg-devel,1/3] avcodec/libjxlenc: Move JxlBasicInfo to LibJxlEncodeContext

Message ID pS2jlZqMdQ_AGDQU10Aiw8gOViZGDn8qxhQ4I8EXeF7uzIsgtTnBtDDoZr2BMf82o349lMI0seVvZt_WgSR1DQPeCPMyTVIlxSoCvFoKOjw=@protonmail.com
State New
Headers show
Series avcodec/libjxlenc: Add libjxl_animated encoder | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Zsolt Vadász Dec. 11, 2023, 5:05 p.m. UTC
---
 libavcodec/libjxlenc.c | 45 +++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 22 deletions(-)

Comments

Leo Izen Dec. 12, 2023, 8:17 p.m. UTC | #1
On 12/11/23 12:05, Zsolt Vadász via ffmpeg-devel wrote:
> ---
>   libavcodec/libjxlenc.c | 45 +++++++++++++++++++++---------------------
>   1 file changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c
> index d707f3a61b..92a458d51a 100644

Why?
Zsolt Vadász Dec. 13, 2023, 6:12 p.m. UTC | #2
On Tuesday, December 12th, 2023 at 9:17 PM, Leo Izen <leo.izen@gmail.com> wrote:
> On 12/11/23 12:05, Zsolt Vadász via ffmpeg-devel wrote:
> 
> > ---
> > libavcodec/libjxlenc.c | 45 +++++++++++++++++++++---------------------
> > 1 file changed, 23 insertions(+), 22 deletions(-)
> > 
> > diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c
> > index d707f3a61b..92a458d51a 100644
> 
> 
> Why?
My apologies, I have to admit this patch set has a lot of things left over from me figuring out how to go about patching the code. Will clean it up for V2.
diff mbox series

Patch

diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c
index d707f3a61b..92a458d51a 100644
--- a/libavcodec/libjxlenc.c
+++ b/libavcodec/libjxlenc.c
@@ -49,6 +49,7 @@  typedef struct LibJxlEncodeContext {
     void *runner;
     JxlEncoder *encoder;
     JxlEncoderFrameSettings *options;
+    JxlBasicInfo info;
     int effort;
     float distance;
     int modular;
@@ -95,9 +96,6 @@  static int libjxl_init_jxl_encoder(AVCodecContext *avctx)
 {
     LibJxlEncodeContext *ctx = avctx->priv_data;
 
-    /* reset the encoder every frame for image2 muxer */
-    JxlEncoderReset(ctx->encoder);
-
     ctx->options = JxlEncoderFrameSettingsCreate(ctx->encoder, NULL);
     if (!ctx->options) {
         av_log(avctx, AV_LOG_ERROR, "Failed to create JxlEncoderOptions\n");
@@ -247,7 +245,7 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
     LibJxlEncodeContext *ctx = avctx->priv_data;
     AVFrameSideData *sd;
     const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(frame->format);
-    JxlBasicInfo info;
+    JxlBasicInfo *info = &ctx->info;
     JxlColorEncoding jxl_color;
     JxlPixelFormat jxl_fmt;
     int bits_per_sample;
@@ -260,6 +258,9 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
     size_t bytes_written = 0;
     uint8_t *next_out = ctx->buffer;
 
+    /* reset the encoder every frame for image2 muxer */
+    JxlEncoderReset(ctx->encoder);
+
     ret = libjxl_init_jxl_encoder(avctx);
     if (ret) {
         av_log(avctx, AV_LOG_ERROR, "Error frame-initializing JxlEncoder\n");
@@ -267,31 +268,31 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
     }
 
     /* populate the basic info settings */
-    JxlEncoderInitBasicInfo(&info);
+    JxlEncoderInitBasicInfo(info);
     jxl_fmt.num_channels = pix_desc->nb_components;
-    info.xsize = frame->width;
-    info.ysize = frame->height;
-    info.num_extra_channels = (jxl_fmt.num_channels + 1) % 2;
-    info.num_color_channels = jxl_fmt.num_channels - info.num_extra_channels;
+    info->xsize = frame->width;
+    info->ysize = frame->height;
+    info->num_extra_channels = (jxl_fmt.num_channels + 1) % 2;
+    info->num_color_channels = jxl_fmt.num_channels - info->num_extra_channels;
     bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt.num_channels;
-    info.bits_per_sample = avctx->bits_per_raw_sample > 0 && !(pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT)
+    info->bits_per_sample = avctx->bits_per_raw_sample > 0 && !(pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT)
                            ? avctx->bits_per_raw_sample : bits_per_sample;
-    info.alpha_bits = (info.num_extra_channels > 0) * info.bits_per_sample;
+    info->alpha_bits = (info->num_extra_channels > 0) * info->bits_per_sample;
     if (pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
-        info.exponent_bits_per_sample = info.bits_per_sample > 16 ? 8 : 5;
-        info.alpha_exponent_bits = info.alpha_bits ? info.exponent_bits_per_sample : 0;
-        jxl_fmt.data_type = info.bits_per_sample > 16 ? JXL_TYPE_FLOAT : JXL_TYPE_FLOAT16;
+        info->exponent_bits_per_sample = info->bits_per_sample > 16 ? 8 : 5;
+        info->alpha_exponent_bits = info->alpha_bits ? info->exponent_bits_per_sample : 0;
+        jxl_fmt.data_type = info->bits_per_sample > 16 ? JXL_TYPE_FLOAT : JXL_TYPE_FLOAT16;
     } else {
-        info.exponent_bits_per_sample = 0;
-        info.alpha_exponent_bits = 0;
-        jxl_fmt.data_type = info.bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16;
+        info->exponent_bits_per_sample = 0;
+        info->alpha_exponent_bits = 0;
+        jxl_fmt.data_type = info->bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16;
     }
 
 #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
     jxl_bit_depth.bits_per_sample = bits_per_sample;
     jxl_bit_depth.type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT;
     jxl_bit_depth.exponent_bits_per_sample = pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT ?
-                                             info.exponent_bits_per_sample : 0;
+                                             info->exponent_bits_per_sample : 0;
 #endif
 
     /* JPEG XL format itself does not support limited range */
@@ -302,9 +303,9 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
         av_log(avctx, AV_LOG_WARNING, "Unknown color range, assuming full (pc)\n");
 
     /* bitexact lossless requires there to be no XYB transform */
-    info.uses_original_profile = ctx->distance == 0.0;
+    info->uses_original_profile = ctx->distance == 0.0;
 
-    if (JxlEncoderSetBasicInfo(ctx->encoder, &info) != JXL_ENC_SUCCESS) {
+    if (JxlEncoderSetBasicInfo(ctx->encoder, info) != JXL_ENC_SUCCESS) {
         av_log(avctx, AV_LOG_ERROR, "Failed to set JxlBasicInfo\n");
         return AVERROR_EXTERNAL;
     }
@@ -353,7 +354,7 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
 
     /* This should be implied to be honest
      * but a libjxl bug makes it fail otherwise */
-    if (info.num_color_channels == 1)
+    if (info->num_color_channels == 1)
         jxl_color.color_space = JXL_COLOR_SPACE_GRAY;
     else
         jxl_color.color_space = JXL_COLOR_SPACE_RGB;
@@ -385,7 +386,7 @@  static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra
     jxl_fmt.endianness = JXL_NATIVE_ENDIAN;
     jxl_fmt.align = frame->linesize[0];
 
-    if (JxlEncoderAddImageFrame(ctx->options, &jxl_fmt, frame->data[0], jxl_fmt.align * info.ysize) != JXL_ENC_SUCCESS) {
+    if (JxlEncoderAddImageFrame(ctx->options, &jxl_fmt, frame->data[0], jxl_fmt.align * info->ysize) != JXL_ENC_SUCCESS) {
         av_log(avctx, AV_LOG_ERROR, "Failed to add Image Frame\n");
         return AVERROR_EXTERNAL;
     }