From: Leo Izen <leo.izen@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:06:23 -0400 Message-ID: <4c842347-9cec-5205-36f4-9da7355d6c28@gmail.com> (raw) In-Reply-To: <1828a416-62ca-9cf2-d774-845574a88796@gmail.com> On 6/21/23 20:59, James Almer wrote: > 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. This is based on JEEB's recommendation. He provided these as examples: https://github.com/jeeb/ffmpeg/commit/b74e47c4ff5bca998936c0d8b9a0892104a7403d https://github.com/jeeb/ffmpeg/commit/d7a75d21635eab4f4a1efea22945933059c2e36f How else should I do it? If I do the usual thing where I put prototypes and structs in the header file and the implementation in the C file, then I won't be able to compile them into avformat as well, as it will just grab the stubs, and the ff_funcs won't be exported from avcodec. > >> 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? That's the intention. > >> + } >> + >> + 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. If I'm not packetizing, I wasn't sure if I could return any other value, but I can change it to 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". _______________________________________________ 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 1:06 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 2023-06-22 1:06 ` Leo Izen [this message] 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=4c842347-9cec-5205-36f4-9da7355d6c28@gmail.com \ --to=leo.izen@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