From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 16C614751E for ; Mon, 11 Dec 2023 17:05:36 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4B94E68D1B4; Mon, 11 Dec 2023 19:05:32 +0200 (EET) Received: from mail-40130.protonmail.ch (mail-40130.protonmail.ch [185.70.40.130]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4D20A68D1A6 for ; Mon, 11 Dec 2023 19:05:26 +0200 (EET) Date: Mon, 11 Dec 2023 17:05:19 +0000 To: FFmpeg development discussions and patches Message-ID: Feedback-ID: 28710920:user:proton MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/libjxlenc: Move image initialization code into libjxl_encode_init_image X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: =?utf-8?q?Zsolt_Vad=C3=A1sz_via_ffmpeg-devel?= Reply-To: FFmpeg development discussions and patches Cc: =?utf-8?Q?Zsolt_Vad=C3=A1sz?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --- libavcodec/libjxlenc.c | 69 +++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c index 92a458d51a..6110c42a7c 100644 --- a/libavcodec/libjxlenc.c +++ b/libavcodec/libjxlenc.c @@ -50,6 +50,9 @@ typedef struct LibJxlEncodeContext { JxlEncoder *encoder; JxlEncoderFrameSettings *options; JxlBasicInfo info; + JxlPixelFormat jxl_fmt; + int animated; + int first_frame; int effort; float distance; int modular; @@ -181,6 +184,9 @@ static av_cold int libjxl_encode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } + ctx->animated = 0; + ctx->first_frame = 1; + return 0; } @@ -235,28 +241,19 @@ static int libjxl_populate_primaries(void *avctx, JxlColorEncoding *jxl_color, e return 0; } -/** - * Encode an entire frame. Currently animation, is not supported by - * this encoder, so this will always reinitialize a new still image - * and encode a one-frame image (for image2 and image2pipe). - */ -static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet) +static int libjxl_encode_init_image(AVCodecContext *avctx, const AVFrame *frame) { LibJxlEncodeContext *ctx = avctx->priv_data; - AVFrameSideData *sd; - const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(frame->format); + int ret; JxlBasicInfo *info = &ctx->info; + JxlPixelFormat *jxl_fmt = &ctx->jxl_fmt; JxlColorEncoding jxl_color; - JxlPixelFormat jxl_fmt; int bits_per_sample; #if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlBitDepth jxl_bit_depth; #endif - JxlEncoderStatus jret; - int ret; - size_t available = ctx->buffer_size; - size_t bytes_written = 0; - uint8_t *next_out = ctx->buffer; + const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(frame->format); + AVFrameSideData *sd; /* reset the encoder every frame for image2 muxer */ JxlEncoderReset(ctx->encoder); @@ -269,23 +266,23 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra /* populate the basic info settings */ JxlEncoderInitBasicInfo(info); - jxl_fmt.num_channels = pix_desc->nb_components; + 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; - bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt.num_channels; + 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) ? avctx->bits_per_raw_sample : 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; + 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; + 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) @@ -383,17 +380,41 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra av_log(avctx, AV_LOG_WARNING, "Could not increase codestream level\n"); } - jxl_fmt.endianness = JXL_NATIVE_ENDIAN; - jxl_fmt.align = frame->linesize[0]; + jxl_fmt->endianness = JXL_NATIVE_ENDIAN; + jxl_fmt->align = frame->linesize[0]; + + return 0; +} + +/** + * Encode an entire frame. Currently animation, is not supported by + * this encoder, so this will always reinitialize a new still image + * and encode a one-frame image (for image2 and image2pipe). + */ +static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet) +{ + LibJxlEncodeContext *ctx = avctx->priv_data; + JxlEncoderStatus jret; + JxlBasicInfo *info = &ctx->info; + JxlPixelFormat *jxl_fmt = &ctx->jxl_fmt; + int ret; + size_t available = ctx->buffer_size; + size_t bytes_written = 0; + uint8_t *next_out = ctx->buffer; + + if(!ctx->animated || ctx->first_frame) { + if((ret = libjxl_encode_init_image(avctx, frame)) < 0) + return ret; + ctx->first_frame = 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; } /* * Run this after the last frame in the image has been passed. - * TODO support animation */ JxlEncoderCloseInput(ctx->encoder); -- 2.43.0 _______________________________________________ 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".