From: James Almer <jamrial@gmail.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH v2 1/3] avcodec/jpegxl_parser: add JPEG XL parser Date: Wed, 21 Jun 2023 21:59:35 -0300 Message-ID: <1828a416-62ca-9cf2-d774-845574a88796@gmail.com> (raw) In-Reply-To: <20230622004313.69697-2-leo.izen@gmail.com> On 6/21/2023 9:43 PM, Leo Izen wrote: > diff --git a/libavcodec/jpegxl_parse.c b/libavcodec/jpegxl_parse.c > new file mode 100644 > index 0000000000..be360acb08 > --- /dev/null > +++ b/libavcodec/jpegxl_parse.c > @@ -0,0 +1,22 @@ > +/* > + * JPEG XL Header Parser > + * Copyright (c) 2023 Leo Izen<leo.izen@gmail.com> > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#include "jpegxl_parse.h" This is a really weird way to achieve code sharing between libraries. What you named jpegxl_parse.h should be jpegxl_parse.c instead, and jpegxl_parse.h should only have the prototypes for ff_jpegxl_collect_codestream_header() and ff_jpegxl_parse_codestream_header(), plus the definition of FFJXLMetadata. The enums can stay in jpegxl.h, and they for that matter don't need the FF_ prefix. > diff --git a/libavcodec/jpegxl_parser.c b/libavcodec/jpegxl_parser.c > new file mode 100644 > index 0000000000..096b22be0f > --- /dev/null > +++ b/libavcodec/jpegxl_parser.c > @@ -0,0 +1,165 @@ > +/* > + * JPEG XL Codec Parser > + * Copyright (c) 2023 Leo Izen <leo.izen@gmail.com> > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#include "libavutil/intreadwrite.h" > + > +#include "codec_id.h" > +#include "jpegxl.h" > +#include "parser.h" > + > +typedef struct JXLParseContext { > + ParseContext pc; You don't need this. You're not assembling a packet. > + FFJXLMetadata meta; > + int parsed_header; > +} JXLParseContext; > + > +static int jpegxl_parse(AVCodecParserContext *s, AVCodecContext *avctx, > + const uint8_t **poutbuf, int *poutbuf_size, > + const uint8_t *buf, int buf_size) > +{ > + JXLParseContext *ctx = s->priv_data; > + int ret; > + > + *poutbuf_size = 0; > + *poutbuf = NULL; > + > + if (!ctx->parsed_header) { > + if (AV_RL64(buf) == FF_JPEGXL_CONTAINER_SIGNATURE_LE) { > + int copied; > + uint8_t codestream_header[4096]; > + ret = ff_jpegxl_collect_codestream_header(buf, buf_size, codestream_header, > + sizeof(codestream_header), &copied); > + if (ret < 0) > + return ret; > + /* copied may be larger than the bufsize if stuff was skipped */ > + copied = FFMIN(copied, sizeof(codestream_header)); > + ret = ff_jpegxl_parse_codestream_header(codestream_header, copied, 0, &ctx->meta); > + if (ret < 0) > + return ret; > + } else { > + ret = ff_jpegxl_parse_codestream_header(buf, buf_size, 1, &ctx->meta); > + if (ret < 0) > + return ret; > + } > + avctx->width = ctx->meta.width; > + avctx->height = ctx->meta.height; > + > + switch (ctx->meta.csp) { > + case FF_JPEGXL_CS_RGB: > + case FF_JPEGXL_CS_XYB: > + avctx->colorspace = AVCOL_SPC_RGB; > + break; > + default: > + avctx->colorspace = AVCOL_SPC_UNSPECIFIED; > + } > + > + if (ctx->meta.wp == FF_JPEGXL_WP_D65) { > + switch (ctx->meta.primaries) { > + case FF_JPEGXL_PR_SRGB: > + avctx->color_primaries = AVCOL_PRI_BT709; > + break; > + case FF_JPEGXL_PR_P3: > + avctx->color_primaries = AVCOL_PRI_SMPTE432; > + break; > + case FF_JPEGXL_PR_2100: > + avctx->color_primaries = AVCOL_PRI_BT2020; > + break; > + default: > + avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; > + } > + } else if (ctx->meta.wp == FF_JPEGXL_WP_DCI && ctx->meta.primaries == FF_JPEGXL_PR_P3) { > + avctx->color_primaries = AVCOL_PRI_SMPTE431; > + } else { > + avctx->color_primaries = AVCOL_PRI_UNSPECIFIED; > + } > + > + if (ctx->meta.trc > FF_JPEGXL_TR_GAMMA) { > + FFJXLTransferCharacteristic trc = ctx->meta.trc - FF_JPEGXL_TR_GAMMA; > + switch (trc) { > + case FF_JPEGXL_TR_BT709: > + avctx->color_trc = AVCOL_TRC_BT709; > + break; > + case FF_JPEGXL_TR_LINEAR: > + avctx->color_trc = AVCOL_TRC_LINEAR; > + break; > + case FF_JPEGXL_TR_SRGB: > + avctx->color_trc = AVCOL_TRC_IEC61966_2_1; > + break; > + case FF_JPEGXL_TR_PQ: > + avctx->color_trc = AVCOL_TRC_SMPTEST2084; > + break; > + case FF_JPEGXL_TR_DCI: > + avctx->color_trc = AVCOL_TRC_SMPTE428; > + break; > + case FF_JPEGXL_TR_HLG: > + avctx->color_trc = AVCOL_TRC_ARIB_STD_B67; > + break; > + default: > + avctx->color_trc = AVCOL_TRC_UNSPECIFIED; > + } > + } else if (ctx->meta.trc > 0) { > + if (ctx->meta.trc > 45355 && ctx->meta.trc < 45555) > + avctx->color_trc = AVCOL_TRC_GAMMA22; > + else if (ctx->meta.trc > 35614 && ctx->meta.trc < 35814) > + avctx->color_trc = AVCOL_TRC_GAMMA28; > + else > + avctx->color_trc = AVCOL_TRC_UNSPECIFIED; > + } else { > + avctx->color_trc = AVCOL_TRC_UNSPECIFIED; > + } > + > + if (ctx->meta.csp == FF_JPEGXL_CS_GRAY) { > + if (ctx->meta.bit_depth <= 8) > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_YA8 : AV_PIX_FMT_GRAY8;. Set s->format, not avctx->pix_fmt. The format in an AVCodecContext is set by a decoder, which may not match what the parser sets. > + else if (ctx->meta.bit_depth <= 16) > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_YA16 : AV_PIX_FMT_GRAY16; > + else > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_NONE : AV_PIX_FMT_GRAYF32; > + } else { > + if (ctx->meta.bit_depth <= 8) > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_RGBA : AV_PIX_FMT_RGB24; > + else if (ctx->meta.bit_depth <= 16) > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_RGBA64 : AV_PIX_FMT_RGB48; > + else > + avctx->pix_fmt = ctx->meta.have_alpha ? AV_PIX_FMT_RGBAF32 : AV_PIX_FMT_RGBF32; > + } > + > + ctx->parsed_header = 1; So this is done once for the entire stream? > + } > + > + ctx->pc.frame_start_found = 1; Unnecessary. > + > + ret = ff_combine_frame(&ctx->pc, END_NOT_FOUND, &buf, &buf_size); Also unnecessary. > + if (ret < 0) > + return buf_size; > + > + *poutbuf = buf; > + *poutbuf_size = buf_size; > + > + return END_NOT_FOUND; ??? The process succeeded. Return 0. > +} > + > +const AVCodecParser ff_jpegxl_parser = { > + .codec_ids = { AV_CODEC_ID_JPEGXL }, > + .priv_data_size = sizeof(JXLParseContext), > + .parser_parse = jpegxl_parse, > + .parser_close = ff_parse_close, > +}; _______________________________________________ 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".
next prev parent reply other threads:[~2023-06-22 0:59 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-22 0:43 [FFmpeg-devel] [PATCH v2 0/3] JXL Parser and FATE tests Leo Izen 2023-06-22 0:43 ` [FFmpeg-devel] [PATCH v2 1/3] avcodec/jpegxl_parser: add JPEG XL parser Leo Izen 2023-06-22 0:59 ` James Almer [this message] 2023-06-22 1:06 ` Leo Izen 2023-06-22 1:21 ` James Almer 2023-06-22 14:19 ` James Almer 2023-06-22 0:43 ` [FFmpeg-devel] [PATCH v2 2/3] avformat/jpegxl: remove jpegxl_probe, instead call avcodec/jpegxl_parse Leo Izen 2023-06-22 0:43 ` [FFmpeg-devel] [PATCH v2 3/3] fate/jpegxl_anim: add demuxer fate test for jpegxl_anim Leo Izen
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1828a416-62ca-9cf2-d774-845574a88796@gmail.com \ --to=jamrial@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git