From patchwork Tue Jun 14 14:39:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36222 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1113066pzb; Tue, 14 Jun 2022 07:39:14 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sKWoQOlaL/4rzbStv76pc3HSl+AdGLaS/V1JizvAp532oPslO/Blnfd+s9vJeactyAFcBu X-Received: by 2002:a17:906:5e59:b0:711:2d24:5152 with SMTP id b25-20020a1709065e5900b007112d245152mr4622604eju.71.1655217553660; Tue, 14 Jun 2022 07:39:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217553; cv=none; d=google.com; s=arc-20160816; b=cUJGMUgZqIxwxY6lJzavilw5b2jSkO5BRufOFCK2dmlTcqWc+TyP9gPTigpeOjz26D PaOCVV50wrBYyMilELupMn998z78ehNzNSEB6/XyhKuRnrhMCuCO9rPkVdarg03a9qaB 68FBgQ82nKfWc6xl9lub1DYk0BzC1U071oU6GWUE+yog+i+Jh9H1UiEghLv8WaKDTe6Y Plw5mmxvVryqQ4ZjdJTkg2MmgyTpObVP/Ovxf3PxEQ+D5IIrU0hGVEyhNx/xeBhGwIGy HebmA9+bm28TmSrqXNrcjJ4poNBqV0I6IMtE1Ij403pIj7GTegNs8Wpd7junR+W9OCWP 2fnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:date:to:from:message-id:dkim-signature :dkim-signature:delivered-to; bh=ZcDheWvRk4Mdac3/Q42YbA0PjZFPfSl+5+xlPXc9gkM=; b=LX7tJkN1oB01yIfnBafGt5abJVw2D5D9lxueLPrqwSwxOKr3UZ0Zl7KLe3io8tS3Wh OdMmULWzm87NAMpF6AM8RbSOM4uH/WjQmwqUrWrZsVA76/EcKTzHkWKXcL7ua9IlP1P8 +gr6Jn+17v71IGYIWbzgs9IUdwT2Qv2CSJVgAKTrs4ceyciBt9+yIcHeh8j8YCoj8wyv r0mApcN/bg0dwt7fPeQ7D/KdCdXiRIQp69PpEEnh3f3Tyuqp1vrMbPTUBQlxtrgByoce kaj6OJJryNpI6EwLr3MG1KLKYhnBa3DmBxS5HOpqObGVextvD5imiGELZUqP2Y58Kypm eGqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=Ma236UBT; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=Ur96UjzA; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q20-20020a056402519400b0042600959715si13881550edd.204.2022.06.14.07.39.13; Tue, 14 Jun 2022 07:39:13 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=Ma236UBT; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=Ur96UjzA; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2164568B647; Tue, 14 Jun 2022 17:39:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2CBFF68B194 for ; Tue, 14 Jun 2022 17:39:03 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 3A0A744DCB for ; Tue, 14 Jun 2022 16:39:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217542; bh=Pus9GxSPzoGwuHuJRUx9JMCn+j9BxbZfSxUlhOwV9C8=; h=Subject:From:To:Date:From; b=Ma236UBTdfPLvzIa0hQiZHfT04uNDonLipv26ZoAaBy5DFS4ydOqGd10ac8U/1VXU UjVHGllP+YoG5BCSE7FJLaQPvFXV+otD43ftVqAFGrg6OXIxscFB3LGkfzEfrh47Pd qHm65LkwtyEbQrEUknDY97eDlduE4SR4SJXJMkkYYLsC2FFJbPvZ89kNvDDW4I8blu Sb/IzcQKt04sqGYA0lU2xbtMbvtX8zh8tMx0Kee/6shKzCKXHthkc2CzWr7X43iUDH kp9X050HAMOT0P5MkuDUn9Oqx5Xek8BQo/9hmAvej9cDcmo8L4dL6vToY4O75gjApx g1dxpNEmhtxcg== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 6463644DC6 for ; Tue, 14 Jun 2022 16:39:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217541; bh=Pus9GxSPzoGwuHuJRUx9JMCn+j9BxbZfSxUlhOwV9C8=; h=Subject:From:To:Date:From; b=Ur96UjzAH9MaHzCJ0qV1AyMcuVYjPtUg5WRNKdWq7mGctLGyGnveQBv+Hr1uM0tGy vekNQlb94EyHYPA3Bz+EreA47mJNfVKA5ghqyIgEj5IWCVGgbtn+dEuDDzpfU4wuOj +qAaVOf8P9afHepxgcsAl98k5/qVX/2Mz6bFNhY19Wo99EQF4eWTJyGm0gkt5e1OpZ qKUcx8jBQwTIo7TlYGY7w+Hlx7VTCyAlOrA1OeW5Pa5NOXSEBP40kmg4zu0mzfjrhv GrP2zdI0jGx8ZPrzXcbhYYlUENt6INOUisoe1rAYjycgN189ggLZsz5rL7DyqYF4bS 9pZeWY8bCjEVQ== Message-ID: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:39:00 +0200 User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/13] lavc/jpeg2000dec: Finer granularity threading 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: GQazqJC7Gq7A Patch 12 in this series is optional since it's just me getting the speed up on a specific machine /Tomas From 115aa26c343419e81c1b5ba0bfdb1615cbec27e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Fri, 10 Jun 2022 14:10:02 +0200 Subject: [PATCH 01/13] lavc/jpeg2000dec: Finer granularity threading Decoding and dequant is now threaded on codeblock level. IDWT is threaded on component level. MCT and write_frame() remain threaded on tile level. This brings lossless 4K J2K with -lowres 2 -thread_type slice -threads 96 on an AMD EPYC 7R32 from 4.8 fps (177% CPU) to 31 fps (1284% CPU). --- libavcodec/jpeg2000dec.c | 196 ++++++++++++++++++++++++++++----------- 1 file changed, 142 insertions(+), 54 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 92966b11f5..d9754fc50e 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -92,6 +92,15 @@ typedef struct Jpeg2000Tile { int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} } Jpeg2000Tile; +typedef struct Jpeg2000IdwtThread { + int cb_start, cb_end; +} Jpeg2000IdwtThread; + +typedef struct Jpeg2000CodeblockThread { + int tileno, compno, reslevelno, bandno, precno, cblkno; + int coded; +} Jpeg2000CodeblockThread; + typedef struct Jpeg2000DecoderContext { AVClass *class; AVCodecContext *avctx; @@ -136,6 +145,11 @@ typedef struct Jpeg2000DecoderContext { /*options parameters*/ int reduction_factor; + + Jpeg2000IdwtThread *idwt; + unsigned int idwt_size; + Jpeg2000CodeblockThread *cb; + unsigned int cb_size; } Jpeg2000DecoderContext; /* get_bits functions for JPEG2000 packet bitstream @@ -1937,54 +1951,33 @@ static inline void roi_scale_cblk(Jpeg2000Cblk *cblk, } } -static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) +static int jpeg2000_decode_cb(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) { Jpeg2000T1Context t1; - - int compno, reslevelno, bandno; - - /* Loop on tile components */ - for (compno = 0; compno < s->ncomponents; compno++) { - Jpeg2000Component *comp = tile->comp + compno; - Jpeg2000CodingStyle *codsty = tile->codsty + compno; - int coded = 0; - - t1.stride = (1<log2_cblk_width) + 2; - - /* Loop on resolution levels */ - for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) { - Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; - /* Loop on bands */ - for (bandno = 0; bandno < rlevel->nbands; bandno++) { - int nb_precincts, precno; - Jpeg2000Band *band = rlevel->band + bandno; - int cblkno = 0, bandpos; - - bandpos = bandno + (reslevelno > 0); - - if (band->coord[0][0] == band->coord[0][1] || - band->coord[1][0] == band->coord[1][1]) - continue; - - nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y; - /* Loop on precincts */ - for (precno = 0; precno < nb_precincts; precno++) { - Jpeg2000Prec *prec = band->prec + precno; - - /* Loop on codeblocks */ - for (cblkno = 0; - cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; - cblkno++) { - int x, y; - Jpeg2000Cblk *cblk = prec->cblk + cblkno; - int ret = decode_cblk(s, codsty, &t1, cblk, + Jpeg2000DecoderContext *s = avctx->priv_data; + Jpeg2000CodeblockThread *cb = s->cb + jobnr; + Jpeg2000Tile *tile = s->tile + cb->tileno; + Jpeg2000Component *comp = tile->comp + cb->compno; + Jpeg2000CodingStyle *codsty = tile->codsty + cb->compno; + Jpeg2000ResLevel *rlevel = comp->reslevel + cb->reslevelno; + Jpeg2000Band *band = rlevel->band + cb->bandno; + Jpeg2000Prec *prec = band->prec + cb->precno; + Jpeg2000Cblk *cblk = prec->cblk + cb->cblkno; + int ret, x, y, bandpos = cb->bandno + (cb->reslevelno > 0); + + t1.stride = (1<log2_cblk_width) + 2; + cb->coded = 0; + + ret = decode_cblk(s, codsty, &t1, cblk, cblk->coord[0][1] - cblk->coord[0][0], cblk->coord[1][1] - cblk->coord[1][0], bandpos, comp->roi_shift); if (ret) - coded = 1; + cb->coded = 1; else - continue; + return 0; + x = cblk->coord[0][0] - band->coord[0][0]; y = cblk->coord[1][0] - band->coord[1][0]; @@ -1996,16 +1989,28 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile dequantization_int_97(x, y, cblk, comp, &t1, band); else dequantization_int(x, y, cblk, comp, &t1, band); - } /* end cblk */ - } /*end prec */ - } /* end band */ - } /* end reslevel */ - /* inverse DWT */ - if (coded) + return 0; +} + +static int jpeg2000_idwt(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) +{ + Jpeg2000DecoderContext *s = avctx->priv_data; + Jpeg2000IdwtThread *idwt = s->idwt + jobnr; + Jpeg2000Tile *tile = s->tile + jobnr / s->ncomponents; + int compno = jobnr % s->ncomponents; + Jpeg2000Component *comp = tile->comp + compno; + Jpeg2000CodingStyle *codsty = tile->codsty + compno; + + for (int i = idwt->cb_start; i < idwt->cb_end; i++) { + if (s->cb[i].coded) { ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data); + break; + } + } - } /*end comp */ + return 0; } #define WRITE_FRAME(D, PIXEL) \ @@ -2075,15 +2080,13 @@ WRITE_FRAME(16, uint16_t) #undef WRITE_FRAME -static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td, - int jobnr, int threadnr) +static int jpeg2000_mct_write_frame(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) { Jpeg2000DecoderContext *s = avctx->priv_data; AVFrame *picture = td; Jpeg2000Tile *tile = s->tile + jobnr; - tile_codeblocks(s, tile); - /* inverse MCT transformation */ if (tile->codsty[0].mct) mct_decode(s, tile); @@ -2473,11 +2476,80 @@ static av_cold int jpeg2000_decode_init(AVCodecContext *avctx) return 0; } +static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out) +{ + if (s->numXtiles * s->numYtiles > INT_MAX/sizeof(*s->idwt)/s->ncomponents) + return AVERROR(ENOMEM); + + av_fast_malloc(&s->idwt, &s->idwt_size, s->numXtiles * s->numYtiles * s->ncomponents * sizeof(*s->idwt)); + if (!s->idwt) + return AVERROR(ENOMEM); + + for (int pass = 0; pass < 2; pass++) { + int cbs = 0; + for (int tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) { + for (int compno = 0; compno < s->ncomponents; compno++) { + Jpeg2000Tile *tile = s->tile + tileno; + Jpeg2000Component *comp = tile->comp + compno; + Jpeg2000CodingStyle *codsty = tile->codsty + compno; + Jpeg2000IdwtThread *idwt = s->idwt + compno + tileno * s->ncomponents; + + idwt->cb_start = cbs; + + for (int reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) { + Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; + for (int bandno = 0; bandno < rlevel->nbands; bandno++) { + int nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y; + Jpeg2000Band *band = rlevel->band + bandno; + + if (band->coord[0][0] == band->coord[0][1] || + band->coord[1][0] == band->coord[1][1]) + continue; + + for (int precno = 0; precno < nb_precincts; precno++) { + Jpeg2000Prec *prec = band->prec + precno; + int prec_cbs = prec->nb_codeblocks_width * prec->nb_codeblocks_height; + + if (cbs > INT_MAX - prec_cbs) + return AVERROR(ENOMEM); + + for (int cblkno = 0; cblkno < prec_cbs; cblkno++, cbs++) { + if (pass == 1) { + Jpeg2000CodeblockThread *cb = s->cb + cbs; + cb->tileno = tileno; + cb->compno = compno; + cb->reslevelno = reslevelno; + cb->bandno = bandno; + cb->precno = precno; + cb->cblkno = cblkno; + } + } + } + } + } + + idwt->cb_end = cbs; + } + } + + if (pass == 0) { + if (cbs > INT_MAX/sizeof(*s->cb)) + return AVERROR(ENOMEM); + av_fast_malloc(&s->cb, &s->cb_size, cbs*sizeof(*s->cb)); + if (!s->cb) + return AVERROR(ENOMEM); + } + + *cbs_out = cbs; + } + return 0; +} + static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt) { Jpeg2000DecoderContext *s = avctx->priv_data; - int ret; + int ret, cbs; s->avctx = avctx; bytestream2_init(&s->g, avpkt->data, avpkt->size); @@ -2535,7 +2607,12 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, } } - avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles); + if ((ret = jpeg2000_setup_cbs(s, &cbs))) + goto end; + + avctx->execute2(avctx, jpeg2000_decode_cb, NULL, NULL, cbs); + avctx->execute2(avctx, jpeg2000_idwt, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents); + avctx->execute2(avctx, jpeg2000_mct_write_frame, picture, NULL, s->numXtiles * s->numYtiles); jpeg2000_dec_cleanup(s); @@ -2554,6 +2631,16 @@ end: return ret; } +static av_cold int jpeg2000_decode_close(AVCodecContext *avctx) +{ + Jpeg2000DecoderContext *s = avctx->priv_data; + + av_freep(&s->idwt); + av_freep(&s->cb); + + return 0; +} + #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x) #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM @@ -2579,6 +2666,7 @@ const FFCodec ff_jpeg2000_decoder = { .priv_data_size = sizeof(Jpeg2000DecoderContext), .init = jpeg2000_decode_init, FF_CODEC_DECODE_CB(jpeg2000_decode_frame), + .close = jpeg2000_decode_close, .p.priv_class = &jpeg2000_class, .p.max_lowres = 5, .p.profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles), -- 2.30.2 From patchwork Tue Jun 14 14:39:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36221 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1113403pzb; Tue, 14 Jun 2022 07:40:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwwoi+qV1Gd7Ne/Ng0OzFWvZqfPykDEZcl/uco+dXOfQ6IKGfoucsVF5qWhujArollWHDZ9 X-Received: by 2002:a17:907:1620:b0:711:da21:d836 with SMTP id hb32-20020a170907162000b00711da21d836mr4758517ejc.427.1655217599745; Tue, 14 Jun 2022 07:39:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217599; cv=none; d=google.com; s=arc-20160816; b=UDjKR+5xgLSX68tfKnWKBA7oI7lnmW2Vq53dKELAWwKdGIehnDq94aUCqyx1u0XDGD JlbOikLluqfgtun98/CvE22DdHdhXVIQcY6B7JT9UE0nuHCXKkpEEnNBfW+p/xvETbHU RPJ8UlYO/U3qG/V8H1LDfCVNQZvvoqL41Tf4YPHztGLMpb5dxyoI/ATpKUgUKUtzDFBR jWp/oB166BX5ne6be4+GIW14KOOhFi3HtjELtosuj35PTmdb67z6qWAMyQDu0IGShAvA 105VvFhbMS3SVBETNp3i5ZSSmusMbrHh4n084IFFO8loaSegin/+MN3QD2vjiI9MFNbh HH6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=9NT04fgw2oBQIMy01z6ciKcJWWolbqDhCWU6wUE4KqY=; b=Gw4tKnjHTJd/FgvLVAy6hJd4jP2DxKzQxU/w/vyncpstnUHkzdRDuTdq995cvXbv/p cB0SRZIBWAvsf4mpw83n9sOZ+VWj0HDt834K4vhbAYBF6ddsYVp7xMnDDmWn8J+bD+JD C+2WeEYoqfhRmMyY7IZfBikvlvnbIGOMV5sx4a7QK3fx0xiPOq1AnCUor6y6dO9CVvpu OgQO3FzTicSiW+EqN5U+GYXqsKfl7y2dvG4vXVAJUne1jOsjxAD0jPxKzDcRlZiqX4BJ lmBW4d6972OsWMnNib2Ka62gcjylGXeif33BedPoJJKCsIspl3cpc7y+NTcJX9rP3noX TzTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=GYGxTbJs; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b="aE/JBFdR"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u25-20020aa7d999000000b0042dcbb47403si11082598eds.116.2022.06.14.07.39.59; Tue, 14 Jun 2022 07:39:59 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=GYGxTbJs; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b="aE/JBFdR"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4520768B679; Tue, 14 Jun 2022 17:39:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DCF1C68B64E for ; Tue, 14 Jun 2022 17:39:50 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 73C0E44DCB for ; Tue, 14 Jun 2022 16:39:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217590; bh=zWozmcwP7VslEJ4VD62UGCno6sD7ARMbG98MptK9VXk=; h=Subject:From:To:Date:In-Reply-To:References:From; b=GYGxTbJsUMNiGFg1CYCfXQ/INhX/cntqYQRaF8RKBmfSJFA6IlYSnc2wO/GA+2Q7r UBmf/daRuS7qI32sIaeWph9m4AdkgiW0G0mpb60alJ6rKr1dBMXzMAagAf+bylSR5J IItbhzb8IWLj7lhe/7+J3/It/AsnwbryuWws8iSs9WQFPrSBEBDD1DHax6LEgcHpGN nZrT2SKBMvcvSbvVTfqBJdlmkvKA3hNB7idQGQ7MA7IogD4RUdoTINVK17wDy7+XbN w3IMAKvNRDTGt5h8m9GuQIadcQma1/U9QNgXnhSr8PsT+gNAATWCoKiIjZo+voCGSc hc9ALNLhWd9aQ== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id DF4ED44DC6 for ; Tue, 14 Jun 2022 16:39:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217589; bh=zWozmcwP7VslEJ4VD62UGCno6sD7ARMbG98MptK9VXk=; h=Subject:From:To:Date:In-Reply-To:References:From; b=aE/JBFdRXa9/gp6c66ZkLdWVVthEeAL1+ph/5x9X8BEoQ6cJCuY3q/xku7BtdicP8 1qOzLZOriMF7B3NhuxyVVgJaSw5otuGzPRe64h8p4ATzrBlwo3kmymxhjgmfU10Sua V0OvIQAG8cPAF8tczF2mYVKW79vH9jqzSZatBHxq7W0ua7vNUs2Ega8ag+1EYkM0o/ E6NTFQZ6YsoP0MIJ/Zu5bXNZD5/T8KQjBAhsbAXq+EfQ1WVACQnS1XgV18E4YaHtt1 vttEDG3uqP5FglMPYtoXz1HPMHH8tjg4VLUSm365XS22adFvP+lNTHKo/41uy2zqbS Z+2vM/s8rOmsQ== Message-ID: <7c5f93f13cb4bc37da1d3f0fc7cad39d39c540bf.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:39:49 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/13] lavc/jpeg2000dec: Reindent 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: gZCrkNvDG4LG From 86c30e327e1eb8ba913d74d5394ea90a87b55a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Fri, 10 Jun 2022 14:12:11 +0200 Subject: [PATCH 02/13] lavc/jpeg2000dec: Reindent --- libavcodec/jpeg2000dec.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index d9754fc50e..9d3d406870 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1969,26 +1969,26 @@ static int jpeg2000_decode_cb(AVCodecContext *avctx, void *td, t1.stride = (1<log2_cblk_width) + 2; cb->coded = 0; - ret = decode_cblk(s, codsty, &t1, cblk, - cblk->coord[0][1] - cblk->coord[0][0], - cblk->coord[1][1] - cblk->coord[1][0], - bandpos, comp->roi_shift); - if (ret) - cb->coded = 1; - else - return 0; + ret = decode_cblk(s, codsty, &t1, cblk, + cblk->coord[0][1] - cblk->coord[0][0], + cblk->coord[1][1] - cblk->coord[1][0], + bandpos, comp->roi_shift); + if (ret) + cb->coded = 1; + else + return 0; - x = cblk->coord[0][0] - band->coord[0][0]; - y = cblk->coord[1][0] - band->coord[1][0]; + x = cblk->coord[0][0] - band->coord[0][0]; + y = cblk->coord[1][0] - band->coord[1][0]; - if (comp->roi_shift) - roi_scale_cblk(cblk, comp, &t1); - if (codsty->transform == FF_DWT97) - dequantization_float(x, y, cblk, comp, &t1, band); - else if (codsty->transform == FF_DWT97_INT) - dequantization_int_97(x, y, cblk, comp, &t1, band); - else - dequantization_int(x, y, cblk, comp, &t1, band); + if (comp->roi_shift) + roi_scale_cblk(cblk, comp, &t1); + if (codsty->transform == FF_DWT97) + dequantization_float(x, y, cblk, comp, &t1, band); + else if (codsty->transform == FF_DWT97_INT) + dequantization_int_97(x, y, cblk, comp, &t1, band); + else + dequantization_int(x, y, cblk, comp, &t1, band); return 0; } -- 2.30.2 From patchwork Tue Jun 14 14:40:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36223 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1113648pzb; Tue, 14 Jun 2022 07:40:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxyHruTh0+fjKdpnM6Hof4nUduS7/RHJJ+n2zaqRU0x9jsYmpcjma8U1flAjIwmIp0alqwZ X-Received: by 2002:a05:6402:f14:b0:42d:f989:4a21 with SMTP id i20-20020a0564020f1400b0042df9894a21mr6572326eda.168.1655217627107; Tue, 14 Jun 2022 07:40:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217627; cv=none; d=google.com; s=arc-20160816; b=QmwOrGahrwMpOqrr3KUNhyL7gtNXdfhFXqn7nAcS8zMh5LGPgqaMeXHvnbXetZgl5P 5pKNBemr4bEdj60JKHkCEps0C7ooFgLixiO5B6vx4a1wGbaSxcecDHcJk2pSx2Krvkrf FGp9RJ8cHzIObapyyAYkeDTR2o/CJGqcWc33S7yecjP8Sni5Xf35ent+97dHA/QUVgJb 4syHa0H4FWLTQIHVB+KpGbIZbHW4LYb9JFEpc6OHmn7IRwonbEP790lKgUR7p/KnT4Lg VFkj99ptdXRVUGjYCZblhf7kdde10ZmQz6IFlD3ApFAzuSZUxpPPIEQTxbQ6Qz+uNh+5 uWgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=8hIFEI9mnw20hbp+yKBFOJJrUScI/WOENolQv10az+w=; b=k5HJSSz7FjseYt/XIpEcgHIU+iXlMCuXMIpClfjtTm5b4cPLrc7O2+yt1coGgYoLnO QMlDLV9STQZnFnxZJ+OVbZY0dhI/3sUfDKvDvPrnSe7OxZiPT2UI6HGL24PcADKDR8zM U0OTzvsgJC6QZYVdNKy4X5kQ+b7/slv902BrH+ZI/MyW4lZlEF+SSBcUuLxRQ+DwGYR4 DyTuzDJSbbZbTEJ95yxs8VWo1AUrydaetEmT7v6toU9EPqkNCdiWVvXr5ksTVl0u8zG7 3m7Q2o92S+xIDw5Gr5BBgvYol8Igq0gf82TI3eB+fcP58RhRIgGhckaJ1o4LP737Vt+2 jdvg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=WWQEHLgu; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=W43IUQ6Q; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z2-20020a05640240c200b0042bd7234fb9si14088902edb.27.2022.06.14.07.40.25; Tue, 14 Jun 2022 07:40:27 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=WWQEHLgu; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=W43IUQ6Q; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3FD6C68B650; Tue, 14 Jun 2022 17:40:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B689368B194 for ; Tue, 14 Jun 2022 17:40:21 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 3A90544DCB for ; Tue, 14 Jun 2022 16:40:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217621; bh=SMIJHewPFOzB94o+2JLpapjWWXH5xxXzJBFAfaOeVKc=; h=Subject:From:To:Date:In-Reply-To:References:From; b=WWQEHLguXRlNhf9/eSoCEQQIdwHXBhOTFHN2GSo6VG7To9fH3P2ZqzDa0OPb31WGb fFoTIg5ueRVJstx5Man43o/RIaV72zo4O9LedZHWtPS0tNHf5a4hhcuzL4nqtYx05P 9M3/XGe0IXHWpYYOC2EKeHhQuH0dmNNNl8JT15S9Fd3YLOa1wzHNhNUpESVljU7sGR 5XA2kGCnu2bjGtxAqmMUGQsDZOfuDWhCM4Td7gaC1SBqtv1NRFEZ9aKJkAF/82tg6T wq9MsJ3HU9p1u1pEUDCt77gljXC8UayH+i0WSie3Bl6Jqsvlh/JgPYWeWR5eFRFt/d tKt9vgz6098ZA== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 3296244DC6 for ; Tue, 14 Jun 2022 16:40:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217620; bh=SMIJHewPFOzB94o+2JLpapjWWXH5xxXzJBFAfaOeVKc=; h=Subject:From:To:Date:In-Reply-To:References:From; b=W43IUQ6Qfe1TMvnhWLsce6xoLF+Y2OM0R6ZIbG7xNpZKUWErbxuAOOkvv2VQDAV0h TIhNG+VsfHAvCXNgxN0Bk6RsbK4Xll6L2YH1JLXPNOZ63rz6+dKLVvl9zpXbWAfXFT +oc9rmPUn0JdVXzPhlCDlg95bta1Xy2PHYHjwU+mRSu+Nrg6l71z98pBS3LVlziDCD Z+ju3O+Dx2reVoZCFxGbUfPSCZiNGkteAHJbMmnMjmZCSEleuJz2IXLurU8C1a5sYK Nsp/aJn1GdkbzUFyP0a1YVbY9dAZoAikMBt3fxaS0RdRgkPFD+QYcRgDrDTLRUg/2M NmD5I9mTAIQCw== Message-ID: <12504be2356f3e0109db088f69a105c571460a94.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:40:19 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/13] lavc/jpeg2000dwt: Implement sliced transforms 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: n0k1kayK0sOk From 6ab67531c946ca320e49bc93f4f086835ffd2c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Fri, 10 Jun 2022 17:18:14 +0200 Subject: [PATCH 03/13] lavc/jpeg2000dwt: Implement sliced transforms lavc/tests/jpeg2000dwt tests this. --- libavcodec/j2kenc.c | 3 +- libavcodec/jpeg2000.c | 5 +- libavcodec/jpeg2000.h | 2 +- libavcodec/jpeg2000dec.c | 2 +- libavcodec/jpeg2000dwt.c | 131 +++++++++++++++++++-------------- libavcodec/jpeg2000dwt.h | 5 +- libavcodec/tests/jpeg2000dwt.c | 15 ++-- 7 files changed, 94 insertions(+), 69 deletions(-) diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 0b761d0b00..4de596ffa9 100644 --- a/libavcodec/j2kenc.c +++ b/libavcodec/j2kenc.c @@ -496,7 +496,8 @@ static int init_tiles(Jpeg2000EncoderContext *s) s->cbps[compno], compno?1<chroma_shift[0]:1, compno?1<chroma_shift[1]:1, - s->avctx + s->avctx, + 1 )) < 0) return ret; } diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 0aa984bc53..945b787565 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -467,7 +467,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty, Jpeg2000QuantStyle *qntsty, int cbps, int dx, int dy, - AVCodecContext *avctx) + AVCodecContext *avctx, int max_slices) { int reslevelno, bandno, gbandno = 0, ret, i, j; uint32_t csize; @@ -479,7 +479,8 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, if (ret = ff_jpeg2000_dwt_init(&comp->dwt, comp->coord, codsty->nreslevels2decode - 1, - codsty->transform)) + codsty->transform, + max_slices)) return ret; if (av_image_check_size(comp->coord[0][1] - comp->coord[0][0], diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h index d06313425e..cbb8e0d951 100644 --- a/libavcodec/jpeg2000.h +++ b/libavcodec/jpeg2000.h @@ -278,7 +278,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty, Jpeg2000QuantStyle *qntsty, int cbps, int dx, int dy, - AVCodecContext *ctx); + AVCodecContext *ctx, int max_slices); void ff_jpeg2000_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 9d3d406870..8999974a56 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1052,7 +1052,7 @@ static int init_tile(Jpeg2000DecoderContext *s, int tileno) return AVERROR_INVALIDDATA; if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty, s->cbps[compno], s->cdx[compno], - s->cdy[compno], s->avctx)) + s->cdy[compno], s->avctx, 1)) return ret; } return 0; diff --git a/libavcodec/jpeg2000dwt.c b/libavcodec/jpeg2000dwt.c index f2da7307c4..42a92b6c64 100644 --- a/libavcodec/jpeg2000dwt.c +++ b/libavcodec/jpeg2000dwt.c @@ -322,24 +322,24 @@ static void sr_1d53(unsigned *p, int i0, int i1) p[2 * i + 1] += (int)(p[2 * i] + p[2 * i + 2]) >> 1; } -static void dwt_decode53(DWTContext *s, int *t) +static void dwt_decode53(DWTContext *s, int *t, int lev, int dir, int slice, int slices) { - int lev; int w = s->linelen[s->ndeclevels - 1][0]; - int32_t *line = s->i_linebuf; - line += 3; + int32_t *line = s->i_linebuf + slice * s->linesize + 3; - for (lev = 0; lev < s->ndeclevels; lev++) { int lh = s->linelen[lev][0], lv = s->linelen[lev][1], mh = s->mod[lev][0], mv = s->mod[lev][1], + sh = (lh + slices - 1)/slices, + sv = (lv + slices - 1)/slices, lp; int *l; + if (dir == 0) { // HOR_SD l = line + mh; - for (lp = 0; lp < lv; lp++) { + for (lp = slice*sv; lp < lv && lp - sv < slice*sv; lp++) { int i, j = 0; // copy with interleaving for (i = mh; i < lh; i += 2, j++) @@ -352,10 +352,10 @@ static void dwt_decode53(DWTContext *s, int *t) for (i = 0; i < lh; i++) t[w * lp + i] = l[i]; } - + } else { // VER_SD l = line + mv; - for (lp = 0; lp < lh; lp++) { + for (lp = slice*sh; lp < lh && lp - sh < slice*sh; lp++) { int i, j = 0; // copy with interleaving for (i = mv; i < lv; i += 2, j++) @@ -398,25 +398,26 @@ static void sr_1d97_float(float *p, int i0, int i1) p[2 * i + 1] += F_LFTG_ALPHA * (p[2 * i] + p[2 * i + 2]); } -static void dwt_decode97_float(DWTContext *s, float *t) +static void dwt_decode97_float(DWTContext *s, float *t, int lev, int dir, int slice, int slices) { - int lev; int w = s->linelen[s->ndeclevels - 1][0]; - float *line = s->f_linebuf; - float *data = t; /* position at index O of line range [0-5,w+5] cf. extend function */ - line += 5; + float *line = s->f_linebuf + slice * s->linesize + 5; + float *data = t; - for (lev = 0; lev < s->ndeclevels; lev++) { int lh = s->linelen[lev][0], lv = s->linelen[lev][1], mh = s->mod[lev][0], mv = s->mod[lev][1], + sh = (lh + slices - 1)/slices, + sv = (lv + slices - 1)/slices, lp; float *l; + + if (dir == 0) { // HOR_SD l = line + mh; - for (lp = 0; lp < lv; lp++) { + for (lp = slice*sv; lp < lv && lp - sv < slice*sv; lp++) { int i, j = 0; // copy with interleaving for (i = mh; i < lh; i += 2, j++) @@ -429,10 +430,10 @@ static void dwt_decode97_float(DWTContext *s, float *t) for (i = 0; i < lh; i++) data[w * lp + i] = l[i]; } - + } else { // VER_SD l = line + mv; - for (lp = 0; lp < lh; lp++) { + for (lp = slice*sh; lp < lh && lp - sh < slice*sh; lp++) { int i, j = 0; // copy with interleaving for (i = mv; i < lv; i += 2, j++) @@ -475,30 +476,26 @@ static void sr_1d97_int(int32_t *p, int i0, int i1) p[2 * i + 1] += (I_LFTG_ALPHA * (p[2 * i] + (int64_t)p[2 * i + 2]) + (1 << 15)) >> 16; } -static void dwt_decode97_int(DWTContext *s, int32_t *t) +static void dwt_decode97_int(DWTContext *s, int32_t *t, int lev, int dir, int slice, int slices) { - int lev; int w = s->linelen[s->ndeclevels - 1][0]; - int h = s->linelen[s->ndeclevels - 1][1]; - int i; - int32_t *line = s->i_linebuf; - int32_t *data = t; /* position at index O of line range [0-5,w+5] cf. extend function */ - line += 5; - - for (i = 0; i < w * h; i++) - data[i] *= 1LL << I_PRESHIFT; + int32_t *line = s->i_linebuf + slice * s->linesize + 5; + int32_t *data = t; - for (lev = 0; lev < s->ndeclevels; lev++) { int lh = s->linelen[lev][0], lv = s->linelen[lev][1], mh = s->mod[lev][0], mv = s->mod[lev][1], + sh = (lh + slices - 1)/slices, + sv = (lv + slices - 1)/slices, lp; int32_t *l; + + if (dir == 0) { // HOR_SD l = line + mh; - for (lp = 0; lp < lv; lp++) { + for (lp = slice*sv; lp < lv && lp - sv < slice*sv; lp++) { int i, j = 0; // rescale with interleaving for (i = mh; i < lh; i += 2, j++) @@ -511,10 +508,10 @@ static void dwt_decode97_int(DWTContext *s, int32_t *t) for (i = 0; i < lh; i++) data[w * lp + i] = l[i]; } - + } else { // VER_SD l = line + mv; - for (lp = 0; lp < lh; lp++) { + for (lp = slice*sh; lp < lh && lp - sh < slice*sh; lp++) { int i, j = 0; // rescale with interleaving for (i = mv; i < lv; i += 2, j++) @@ -528,26 +525,29 @@ static void dwt_decode97_int(DWTContext *s, int32_t *t) data[w * i + lp] = l[i]; } } - - for (i = 0; i < w * h; i++) - data[i] = (data[i] + ((1LL<>1)) >> I_PRESHIFT; } int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2], - int decomp_levels, int type) + int decomp_levels, int type, int max_slices) { - int i, j, lev = decomp_levels, maxlen, + int i, j, lev = decomp_levels, b[2][2]; s->ndeclevels = decomp_levels; s->type = type; + s->max_slices = max_slices; + + if (s->max_slices > INT_MAX/FFMAX(sizeof(*s->f_linebuf),sizeof(*s->i_linebuf))) + return AVERROR(ENOMEM); for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) b[i][j] = border[i][j]; - maxlen = FFMAX(b[0][1] - b[0][0], - b[1][1] - b[1][0]); + s->linesize = FFMAX(b[0][1] - b[0][0], + b[1][1] - b[1][0]) + + (type == FF_DWT53 ? 6 : 12); + while (--lev >= 0) for (i = 0; i < 2; i++) { s->linelen[lev][i] = b[i][1] - b[i][0]; @@ -555,24 +555,15 @@ int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2], for (j = 0; j < 2; j++) b[i][j] = (b[i][j] + 1) >> 1; } - switch (type) { - case FF_DWT97: - s->f_linebuf = av_malloc_array((maxlen + 12), sizeof(*s->f_linebuf)); + + if (type == FF_DWT97) { + s->f_linebuf = av_malloc_array(s->linesize, s->max_slices*sizeof(*s->f_linebuf)); if (!s->f_linebuf) return AVERROR(ENOMEM); - break; - case FF_DWT97_INT: - s->i_linebuf = av_malloc_array((maxlen + 12), sizeof(*s->i_linebuf)); - if (!s->i_linebuf) - return AVERROR(ENOMEM); - break; - case FF_DWT53: - s->i_linebuf = av_malloc_array((maxlen + 6), sizeof(*s->i_linebuf)); + } else { + s->i_linebuf = av_malloc_array(s->linesize, s->max_slices*sizeof(*s->i_linebuf)); if (!s->i_linebuf) return AVERROR(ENOMEM); - break; - default: - return -1; } return 0; } @@ -597,18 +588,46 @@ int ff_dwt_encode(DWTContext *s, void *t) int ff_dwt_decode(DWTContext *s, void *t) { - if (s->ndeclevels == 0) + int w = s->linelen[s->ndeclevels - 1][0]; + int h = s->linelen[s->ndeclevels - 1][1]; + int32_t *data = t; + + if (s->type == FF_DWT97_INT) + for (int i = 0; i < w * h; i++) + data[i] *= 1LL << I_PRESHIFT; + + for (int lev = 0; lev < s->ndeclevels; lev++) + for (int dir = 0; dir < 2; dir++) + for (int slice = 0; slice < s->max_slices; slice++) { + int ret = ff_dwt_decode_thread(s, t, lev, dir, slice, s->max_slices); + if (ret) + return ret; + } + + if (s->type == FF_DWT97_INT) + for (int i = 0; i < w * h; i++) + data[i] = (data[i] + ((1LL<>1)) >> I_PRESHIFT; + + return 0; +} + +int ff_dwt_decode_thread(DWTContext *s, void *t, int lev, int dir, int slice, int slices) +{ + slices = FFMIN(s->max_slices, slices); + + // lev can be >= s->ndeclevels in files with mixed reslevels in tiles/components + if (s->ndeclevels == 0 || lev >= s->ndeclevels || slice >= slices) return 0; switch (s->type) { case FF_DWT97: - dwt_decode97_float(s, t); + dwt_decode97_float(s, t, lev, dir, slice, slices); break; case FF_DWT97_INT: - dwt_decode97_int(s, t); + dwt_decode97_int(s, t, lev, dir, slice, slices); break; case FF_DWT53: - dwt_decode53(s, t); + dwt_decode53(s, t, lev, dir, slice, slices); break; default: return -1; diff --git a/libavcodec/jpeg2000dwt.h b/libavcodec/jpeg2000dwt.h index 718d183ac1..0589c8355c 100644 --- a/libavcodec/jpeg2000dwt.h +++ b/libavcodec/jpeg2000dwt.h @@ -48,6 +48,8 @@ typedef struct DWTContext { uint8_t type; ///< 0 for 9/7; 1 for 5/3 int32_t *i_linebuf; ///< int buffer used by transform float *f_linebuf; ///< float buffer used by transform + int max_slices; + int linesize; } DWTContext; /** @@ -58,10 +60,11 @@ typedef struct DWTContext { * @param type 0 for DWT 9/7; 1 for DWT 5/3 */ int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2], - int decomp_levels, int type); + int decomp_levels, int type, int max_slices); int ff_dwt_encode(DWTContext *s, void *t); int ff_dwt_decode(DWTContext *s, void *t); +int ff_dwt_decode_thread(DWTContext *s, void *t, int lev, int dir, int slice, int slices); void ff_dwt_destroy(DWTContext *s); diff --git a/libavcodec/tests/jpeg2000dwt.c b/libavcodec/tests/jpeg2000dwt.c index 0e5a6ed947..d4d9e6d224 100644 --- a/libavcodec/tests/jpeg2000dwt.c +++ b/libavcodec/tests/jpeg2000dwt.c @@ -31,12 +31,12 @@ #define MAX_W 256 -static int test_dwt(int *array, int *ref, int border[2][2], int decomp_levels, int type, int max_diff) { +static int test_dwt(int *array, int *ref, int border[2][2], int decomp_levels, int type, int max_diff, int slices) { int ret, j; DWTContext s1={{{0}}}, *s= &s1; int64_t err2 = 0; - ret = ff_jpeg2000_dwt_init(s, border, decomp_levels, type); + ret = ff_jpeg2000_dwt_init(s, border, decomp_levels, type, slices); if (ret < 0) { fprintf(stderr, "ff_jpeg2000_dwt_init failed\n"); return 1; @@ -70,12 +70,12 @@ static int test_dwt(int *array, int *ref, int border[2][2], int decomp_levels, i return 0; } -static int test_dwtf(float *array, float *ref, int border[2][2], int decomp_levels, float max_diff) { +static int test_dwtf(float *array, float *ref, int border[2][2], int decomp_levels, float max_diff, int slices) { int ret, j; DWTContext s1={{{0}}}, *s= &s1; double err2 = 0; - ret = ff_jpeg2000_dwt_init(s, border, decomp_levels, FF_DWT97); + ret = ff_jpeg2000_dwt_init(s, border, decomp_levels, FF_DWT97, slices); if (ret < 0) { fprintf(stderr, "ff_jpeg2000_dwt_init failed\n"); return 1; @@ -125,19 +125,20 @@ int main(void) { arrayf[i] = reff[i] = array[i] = ref[i] = av_lfg_get(&prng) % 2048; for (i = 0; i < 100; i++) { + int slices = 1 + (i % 10); for (j=0; j<4; j++) border[j>>1][j&1] = av_lfg_get(&prng) % MAX_W; if (border[0][0] >= border[0][1] || border[1][0] >= border[1][1]) continue; decomp_levels = av_lfg_get(&prng) % FF_DWT_MAX_DECLVLS; - ret = test_dwt(array, ref, border, decomp_levels, FF_DWT53, 0); + ret = test_dwt(array, ref, border, decomp_levels, FF_DWT53, 0, slices); if (ret) return ret; - ret = test_dwt(array, ref, border, decomp_levels, FF_DWT97_INT, FFMIN(7+5*decomp_levels, 15+3*decomp_levels)); + ret = test_dwt(array, ref, border, decomp_levels, FF_DWT97_INT, FFMIN(7+5*decomp_levels, 15+3*decomp_levels), slices); if (ret) return ret; - ret = test_dwtf(arrayf, reff, border, decomp_levels, 0.05); + ret = test_dwtf(arrayf, reff, border, decomp_levels, 0.05, slices); if (ret) return ret; } -- 2.30.2 From patchwork Tue Jun 14 14:40:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36224 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1113868pzb; Tue, 14 Jun 2022 07:40:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyP0GwyUDt1Bq7+op7DUB8nRc7XshB2jzljNt2wwgoSJkD3pXWyEA20RnXj3uFRiQ8y+VQL X-Received: by 2002:a17:907:206b:b0:70f:8724:d441 with SMTP id qp11-20020a170907206b00b0070f8724d441mr4648737ejb.430.1655217653516; Tue, 14 Jun 2022 07:40:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217653; cv=none; d=google.com; s=arc-20160816; b=H6iPmi8fDVKfQiA8hBWAap64LHA6IgVx8/PnTNlLdRcyqG9WDIQqZTqVOjjIGy0XnN RADzxjsYMfm/V2m9cwnsMoAxGLuIUbd0nxQfRQZgjyFEcYkj3mEdVZcvBNP0FfGai6Ub a1avfz5x+ihypQnfYxm0amzqN7jGezHaJoFLbVAc+wHG1oDpyirOna+3eoGM9aAT5ZIb VBhyqewblZHhOk4hncOosbTmpMvr1p98ydI4ZhSLvecZOfZ+4g4YNKUNA8ZY7850uHi/ YnKzWdh/UEsy2SsApDnkcHHeMt68z2DC5QbAPsqJZfdTCs8O0WYTUAyAt8P3FBh3RYkQ eeqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=jGoRfwPKL+EpAnUDaAJevQUTXIlZ/Nou0uvWbw9sETU=; b=R8fk5q+sPh0eBk0GJEhR7UD5UCaKzecg3r9D6B7jhQZ8WdLIr+nRpOmtxYkIz4I3n1 039UABR2x45LtOrLOKWBaYfRHWeWFxwK544GOyE3scQcKFYtBuIZRc7yEVl7k4fQcV+J edYGZ/hqdojLJ5AiFfoFv/wi1KCi7Gr6sX55YFrqqTZiQJAnaPp/FsB/Aze3MopI3x8b NFZpoOjmnATJh28X4HgFfr8CbnJEzDcN9t0G4/jUH/ohgPxfRnDuUMLLHassDubjeOiN jFsWRuOSJU5Rm+mCKSm96qD3EVZsqILMcsaWjjq8vXevZFZdjtBLKGGsAxGt5YnpVJ8b zubA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=vOAfihVU; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=RYcbzuAX; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hq35-20020a1709073f2300b00715867834dasi8984611ejc.758.2022.06.14.07.40.53; Tue, 14 Jun 2022 07:40:53 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=vOAfihVU; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=RYcbzuAX; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 430D068B61C; Tue, 14 Jun 2022 17:40:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0F7E068A7FD for ; Tue, 14 Jun 2022 17:40:47 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 87B9A44DC6 for ; Tue, 14 Jun 2022 16:40:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217647; bh=OfgxUgtJXZinN1qjPOUDkBOjnD+S8j8uNLhow2Scnd8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=vOAfihVUisv5FixhfbAmUavWJGgDwImu3D0GwKm2oSJCrQGiDytvmJ66Z3XsRi6gK oGT9LhNDOMJdvXDNt89Gp9OFBpM/o3NJ3riWfGSzKwtfpihf9Qg2ui+eO3j/BAkLb4 mgzfWU88LMlj8Swcvmi4uWJCz04IIiKgio92HMtuIM/cig5/+MOdjkt7bQofZ5PGZT LyXuAKM65c8Cnou4AfDEZu5Q0ByGPpqwqR6cZcYcDiddxdYn7xZSemJth4CxY7dIQz AD8yKcujvT+2PjDwScULyBJ49fEUyG2XEiq+btbrDkG4frsQhAr8xKMdac6J6wdtZS BD82RLtXjXrNA== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id ABAB144DCB for ; Tue, 14 Jun 2022 16:40:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217646; bh=OfgxUgtJXZinN1qjPOUDkBOjnD+S8j8uNLhow2Scnd8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=RYcbzuAXD1w2m718pax8G25Vgrdnz6iz6CSIL0sGCoBpREe43iy3xvCQNSlC5GZyD drxVJb6qnwFnBk89HYS1OrJVx5wYXUsk0qeSJgDNOx+cckvet9xhNeRouqDQHXQenV Hiyqye74nDUR5H7HfxbIWnFQGDS9w4dkdQyczoiJf0kIrcM93WLxw2BaRNa1RUREEI ekbLpD+JECGeO7TEBZFjEHM3R7hLsSNlET8LxqEt7Y9n4yN50i2ehi1puUsbK6w0Z2 QnLOYSuO2gESu43R/I+TS5jYh4xxI4Gkk8RQv4bzQL0ITseJPfIcEAOefcnWpOi/z9 lz3lhWTou7xtg== Message-ID: <188b5011c7be29b073a107e5913620cb315977dd.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:40:46 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/13] lavc/jpeg2000dec: Implement IDWT slicing 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wPtyGX7FutyD From d0ec602b0f61dd7f8d53efccc2c4859058a5d55d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Mon, 13 Jun 2022 14:45:07 +0200 Subject: [PATCH 04/13] lavc/jpeg2000dec: Implement IDWT slicing --- libavcodec/jpeg2000dec.c | 99 +++++++++++++++++++++++++++++++++++----- libavcodec/jpeg2000dwt.c | 1 - libavcodec/jpeg2000dwt.h | 1 + 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 8999974a56..9344630c6f 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -150,6 +150,10 @@ typedef struct Jpeg2000DecoderContext { unsigned int idwt_size; Jpeg2000CodeblockThread *cb; unsigned int cb_size; + + // used for idwt slicing + int reslevel, dir, slices; + int have_dwt97_int; // 1 if any coding style is FF_DWT97_INT } Jpeg2000DecoderContext; /* get_bits functions for JPEG2000 packet bitstream @@ -541,9 +545,10 @@ static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c) } c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type /* set integer 9/7 DWT in case of BITEXACT flag */ - if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97)) + if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97)) { c->transform = FF_DWT97_INT; - else if (c->transform == FF_DWT53) { + s->have_dwt97_int = 1; + } else if (c->transform == FF_DWT53) { s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS; } @@ -1052,7 +1057,7 @@ static int init_tile(Jpeg2000DecoderContext *s, int tileno) return AVERROR_INVALIDDATA; if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty, s->cbps[compno], s->cdx[compno], - s->cdy[compno], s->avctx, 1)) + s->cdy[compno], s->avctx, s->slices)) return ret; } return 0; @@ -1993,19 +1998,74 @@ static int jpeg2000_decode_cb(AVCodecContext *avctx, void *td, return 0; } +static int jpeg2000_dwt97_int_preshift(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) +{ + Jpeg2000DecoderContext *s = avctx->priv_data; + Jpeg2000IdwtThread *idwt = s->idwt + jobnr / s->slices; + Jpeg2000Tile *tile = s->tile + jobnr / s->slices / s->ncomponents; + int compno = (jobnr / s->slices) % s->ncomponents; + int slice = jobnr % s->slices; + Jpeg2000Component *comp = tile->comp + compno; + Jpeg2000CodingStyle *codsty = tile->codsty + compno; + int a = comp->dwt.linelen[comp->dwt.ndeclevels - 1][0] * + comp->dwt.linelen[comp->dwt.ndeclevels - 1][1]; + int as = (a + s->slices - 1)/s->slices; + + for (int i = idwt->cb_start; i < idwt->cb_end; i++) { + if (s->cb[i].coded) { + if (codsty->transform == FF_DWT97_INT) { + for (int i = as*slice; i - as < as*slice; i++) + comp->i_data[i] *= 1LL << I_PRESHIFT; + } + break; + } + } + + return 0; +} + static int jpeg2000_idwt(AVCodecContext *avctx, void *td, int jobnr, int threadnr) { Jpeg2000DecoderContext *s = avctx->priv_data; - Jpeg2000IdwtThread *idwt = s->idwt + jobnr; - Jpeg2000Tile *tile = s->tile + jobnr / s->ncomponents; - int compno = jobnr % s->ncomponents; + Jpeg2000IdwtThread *idwt = s->idwt + jobnr / s->slices; + Jpeg2000Tile *tile = s->tile + jobnr / s->slices / s->ncomponents; + int compno = (jobnr / s->slices) % s->ncomponents; + int slice = jobnr % s->slices; Jpeg2000Component *comp = tile->comp + compno; Jpeg2000CodingStyle *codsty = tile->codsty + compno; for (int i = idwt->cb_start; i < idwt->cb_end; i++) { if (s->cb[i].coded) { - ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data); + ff_dwt_decode_thread(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data, s->reslevel, s->dir, slice, s->slices); + break; + } + } + + return 0; +} + +static int jpeg2000_dwt97_int_postshift(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) +{ + Jpeg2000DecoderContext *s = avctx->priv_data; + Jpeg2000IdwtThread *idwt = s->idwt + jobnr / s->slices; + Jpeg2000Tile *tile = s->tile + jobnr / s->slices / s->ncomponents; + int compno = (jobnr / s->slices) % s->ncomponents; + int slice = jobnr % s->slices; + Jpeg2000Component *comp = tile->comp + compno; + Jpeg2000CodingStyle *codsty = tile->codsty + compno; + int a = comp->dwt.linelen[comp->dwt.ndeclevels - 1][0] * + comp->dwt.linelen[comp->dwt.ndeclevels - 1][1]; + int as = (a + s->slices - 1)/s->slices; + + for (int i = idwt->cb_start; i < idwt->cb_end; i++) { + if (s->cb[i].coded) { + if (codsty->transform == FF_DWT97_INT) { + for (int i = as*slice; i - as < as*slice; i++) + comp->i_data[i] = (comp->i_data[i] + ((1LL<>1)) >> I_PRESHIFT; + } break; } } @@ -2476,7 +2536,7 @@ static av_cold int jpeg2000_decode_init(AVCodecContext *avctx) return 0; } -static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out) +static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out, int *maxreslevels_out) { if (s->numXtiles * s->numYtiles > INT_MAX/sizeof(*s->idwt)/s->ncomponents) return AVERROR(ENOMEM); @@ -2486,7 +2546,7 @@ static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out) return AVERROR(ENOMEM); for (int pass = 0; pass < 2; pass++) { - int cbs = 0; + int cbs = 0, maxreslevels = 0; for (int tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) { for (int compno = 0; compno < s->ncomponents; compno++) { Jpeg2000Tile *tile = s->tile + tileno; @@ -2495,6 +2555,7 @@ static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out) Jpeg2000IdwtThread *idwt = s->idwt + compno + tileno * s->ncomponents; idwt->cb_start = cbs; + maxreslevels = FFMAX(maxreslevels, codsty->nreslevels2decode); for (int reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) { Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; @@ -2541,6 +2602,7 @@ static int jpeg2000_setup_cbs(Jpeg2000DecoderContext *s, int *cbs_out) } *cbs_out = cbs; + *maxreslevels_out = maxreslevels; } return 0; } @@ -2549,7 +2611,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt) { Jpeg2000DecoderContext *s = avctx->priv_data; - int ret, cbs; + int ret, cbs, maxreslevels; s->avctx = avctx; bytestream2_init(&s->g, avpkt->data, avpkt->size); @@ -2592,6 +2654,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, goto end; picture->pict_type = AV_PICTURE_TYPE_I; picture->key_frame = 1; + s->slices = avctx->active_thread_type == FF_THREAD_SLICE ? avctx->thread_count : 1; if (ret = jpeg2000_read_bitstream_packets(s)) goto end; @@ -2607,11 +2670,23 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, } } - if ((ret = jpeg2000_setup_cbs(s, &cbs))) + if ((ret = jpeg2000_setup_cbs(s, &cbs, &maxreslevels))) goto end; avctx->execute2(avctx, jpeg2000_decode_cb, NULL, NULL, cbs); - avctx->execute2(avctx, jpeg2000_idwt, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents); + + if (s->have_dwt97_int) + avctx->execute2(avctx, jpeg2000_dwt97_int_preshift, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents * s->slices); + + for (s->reslevel = 0; s->reslevel < maxreslevels; s->reslevel++) { + for (s->dir = 0; s->dir < 2; s->dir++) { + avctx->execute2(avctx, jpeg2000_idwt, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents * s->slices); + } + } + + if (s->have_dwt97_int) + avctx->execute2(avctx, jpeg2000_dwt97_int_postshift, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents * s->slices); + avctx->execute2(avctx, jpeg2000_mct_write_frame, picture, NULL, s->numXtiles * s->numYtiles); jpeg2000_dec_cleanup(s); diff --git a/libavcodec/jpeg2000dwt.c b/libavcodec/jpeg2000dwt.c index 42a92b6c64..921461b6d7 100644 --- a/libavcodec/jpeg2000dwt.c +++ b/libavcodec/jpeg2000dwt.c @@ -45,7 +45,6 @@ #define I_LFTG_DELTA 29066ll #define I_LFTG_K 80621ll #define I_LFTG_X 53274ll -#define I_PRESHIFT 8 static inline void extend53(int *p, int i0, int i1) { diff --git a/libavcodec/jpeg2000dwt.h b/libavcodec/jpeg2000dwt.h index 0589c8355c..d5e94c9916 100644 --- a/libavcodec/jpeg2000dwt.h +++ b/libavcodec/jpeg2000dwt.h @@ -32,6 +32,7 @@ #define FF_DWT_MAX_DECLVLS 32 ///< max number of decomposition levels #define F_LFTG_K 1.230174104914001f #define F_LFTG_X 0.812893066115961f +#define I_PRESHIFT 8 enum DWTType { FF_DWT97, -- 2.30.2 From patchwork Tue Jun 14 14:41:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36225 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1114117pzb; Tue, 14 Jun 2022 07:41:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyapOiBhCi7DosaS45jQRQbYylxvPSw3WP0yS0JPnlTYpi8GwPVmcm2OoED9qaPb3ppADbd X-Received: by 2002:a05:6402:d:b0:431:98fe:c5fd with SMTP id d13-20020a056402000d00b0043198fec5fdmr6418597edu.170.1655217684827; Tue, 14 Jun 2022 07:41:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217684; cv=none; d=google.com; s=arc-20160816; b=gsVwpSbXzPoTFmLjq0JM9tDtDpS+y0eU5b1TyvZReDHLcTySRxixbtKn4ws94NPMjq Dk88hcFkzPNbBS1WyH84u2BE6zA11n7D/CeXOCaFAkK/dLRPR4xq0AqEU87nuoVSSId+ S+9NaNwzShxBPAmlM+t9Sp/xJCduFF4JRyyBoSwbFkVdUd3OU21C6p1Vgzq6o7cD18cl yemZclK2YyAI/7LVV644IrgO9CMMT7OALAvSwTN/qqcavPT3fah6mlOVpXoNdHcbu483 y8tHeDb0IwyFXQTK9VqXzoW4zemfcrdALoP1/EaiWC75zp5fUIko13dXcCHk42MqrFCi sVow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=ar2xY9mfQ9B5XuZ+FYC/ubLa22/MKfl/aN/dhepPjF4=; b=MqEf88Q4xqIrqDFo7BKcbLqDhPqh21pVuAe4umB4MiiKtwJMHIPrfY+uW5bi9CnnEy X3Nc07z4sS6s/VU4aDy8swXcsDJZtXSd84hD0TNHlsxXTQ49pBsChq3a8W2Q/I1xs3TQ ruYreWR35g3aCrTsXoCDSs9bLPeOzMqR/CmFpRaFWKYODor7wovv0l3A5JAHkaOqYOoG JI1WMiylpxGtNRn/RtuRWgOTlavHmmokPi4/Y+hCHEipdhXFoPmUqYEyeNmPddnsi6u6 PgKJrivSTfgi28x+7EhCyVO2Q1U7ySwI8KBEUGgIWsVpYFa5IJUy6c6nI23MIZsb9YZM PTpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=pyOyG1w7; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HmhfRqsN; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e9-20020a170906044900b0070b6d46c7eesi10624662eja.105.2022.06.14.07.41.24; Tue, 14 Jun 2022 07:41:24 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=pyOyG1w7; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HmhfRqsN; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4475D680C0D; Tue, 14 Jun 2022 17:41:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7C659680C0D for ; Tue, 14 Jun 2022 17:41:15 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 13EE644DCB for ; Tue, 14 Jun 2022 16:41:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217675; bh=0dslA+wrBsmStcQCPb9M6AtxQtfZa1VDs9drVWXRR0I=; h=Subject:From:To:Date:In-Reply-To:References:From; b=pyOyG1w73I0coAMI0qND3uSHxSGZxEtbojcRqr6yJj1qgMu73RWj2mofMMrl07DOm ylkZuPdc6IZy7hCv7jayx4pL2/n272TCX/HBnhrvHLQ/8FzYYN6gIgLrC8dc4dD4F5 dsxx7nlc8O3iF5bGfDJZa9v+UzD5gRgPXoK+GZgKTmsSro/jxkAA2Ou7JZ0diDVEve +I6xf3+qH0IJQaQ4l2OT3gAohNRoFN1W6/mtMc5RYsEbfL7/FdVDX8fZ7dKO9QSFcu WsoV4gp3dXdvacpBSmV/rsamsSwj8eaiTKeYvDlKVNGV6e4IOdlndop25zNqhWCy5t F8tVUiGTO+xwQ== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 8F59D44DC6 for ; Tue, 14 Jun 2022 16:41:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217674; bh=0dslA+wrBsmStcQCPb9M6AtxQtfZa1VDs9drVWXRR0I=; h=Subject:From:To:Date:In-Reply-To:References:From; b=HmhfRqsNFgRbKUHg3n9E3A1uap/yz88XipT1YLFg31LLnzvvYAnEFg+SSLlcMLjeu TBqiQIjH158zN0kBlGhTQufBeMxs9/RMY2FH+X6y4HTUsYPcY0nEj7lXJRLXbeMWXQ g/xtAAXO+cYg55OPvc0maiDHRAOYU3iHw+Gohz7F+CGjUmsOPhsEGmQZQEwHbE26t5 6EXPLEqRcUdpOAB/f6zqywkgSlUKGcKgPLpICFj/kPylfVbN7hKPducnKuN+ZAN2+P Aa9AyFRWIUFEKT+unZDTTynzoI27oKJFnjczTBlEOym9feSnHj5uUzwFBdzYlom7qB a2PZqWoJW4sDw== Message-ID: <2ab7238154c98289a19f655c87a20c339561b3e8.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:41:14 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/13] lavc/jpeg2000dec: Thread init_tile() 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: d29nA3pqe2Su From 080ebdc9bad130098bff575f9ce690b8a522c9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Mon, 13 Jun 2022 15:09:17 +0200 Subject: [PATCH 05/13] lavc/jpeg2000dec: Thread init_tile() --- libavcodec/jpeg2000dec.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 9344630c6f..ef5167c29e 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1015,12 +1015,19 @@ static int get_ppt(Jpeg2000DecoderContext *s, int n) return 0; } -static int init_tile(Jpeg2000DecoderContext *s, int tileno) +static int init_tile(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) { - int compno; - int tilex = tileno % s->numXtiles; - int tiley = tileno / s->numXtiles; - Jpeg2000Tile *tile = s->tile + tileno; + Jpeg2000DecoderContext *s = avctx->priv_data; + int tileno = jobnr / s->ncomponents; + int tilex = tileno % s->numXtiles; + int tiley = tileno / s->numXtiles; + int compno = jobnr % s->ncomponents; + Jpeg2000Tile *tile = s->tile + tileno; + Jpeg2000Component *comp = tile->comp + compno; + Jpeg2000CodingStyle *codsty = tile->codsty + compno; + Jpeg2000QuantStyle *qntsty = tile->qntsty + compno; + int ret; // global bandno if (!tile->comp) return AVERROR(ENOMEM); @@ -1030,12 +1037,6 @@ static int init_tile(Jpeg2000DecoderContext *s, int tileno) tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height); tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height); - for (compno = 0; compno < s->ncomponents; compno++) { - Jpeg2000Component *comp = tile->comp + compno; - Jpeg2000CodingStyle *codsty = tile->codsty + compno; - Jpeg2000QuantStyle *qntsty = tile->qntsty + compno; - int ret; // global bandno - comp->coord_o[0][0] = tile->coord[0][0]; comp->coord_o[0][1] = tile->coord[0][1]; comp->coord_o[1][0] = tile->coord[1][0]; @@ -1059,7 +1060,7 @@ static int init_tile(Jpeg2000DecoderContext *s, int tileno) s->cbps[compno], s->cdx[compno], s->cdy[compno], s->avctx, s->slices)) return ret; - } + return 0; } @@ -2367,9 +2368,6 @@ static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s) for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) { Jpeg2000Tile *tile = s->tile + tileno; - if ((ret = init_tile(s, tileno)) < 0) - return ret; - if ((ret = jpeg2000_decode_packets(s, tile)) < 0) return ret; } @@ -2656,6 +2654,8 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, picture->key_frame = 1; s->slices = avctx->active_thread_type == FF_THREAD_SLICE ? avctx->thread_count : 1; + avctx->execute2(avctx, init_tile, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents); + if (ret = jpeg2000_read_bitstream_packets(s)) goto end; -- 2.30.2 From patchwork Tue Jun 14 14:42:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36220 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1114521pzb; Tue, 14 Jun 2022 07:42:18 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uDuw+IiUBoSkAohnqEK3EWwGQ1iN2YPkWrWAbQToPdvmbzrXtWD0MOgy5CK/5OtD7ZlMcH X-Received: by 2002:a17:906:3985:b0:70c:a5fe:d4fb with SMTP id h5-20020a170906398500b0070ca5fed4fbmr4668568eje.127.1655217738064; Tue, 14 Jun 2022 07:42:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217738; cv=none; d=google.com; s=arc-20160816; b=SeItxSoDMK4+slDobC7of0cfSfWBd5HncHmAxlGG492fjwjZgzoWlgwtkNsjIU7+S9 0C552ukphiwoV27QD3fGqNUloADNBauyFtSFUSYe1JUeJz+xsKSYOmbFUx3Xy9H0YjMe GChzN/l5ZcmY+5Ter3RV504gkoTjvULH0ShByoOOGsitBQ/ojEGFSjxbDwqA3S8i4/2R 1oLnSNeI/vnCY+xwtZyh0wZ7/zy64S+MSuxFwo6ASTHcm3jSQZUtwG+ghLhgB57qoTGa GA8msqg3UZEce4gM6Kjj20x6M7zw5F+4CBSdMtWljdEfe5Tn+MyeGappaQKWwcYfsjgP 1QMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=W7LoP4VqyYIokWlS1QmtfV5W7gMLqNtI9NlkPK6mH1M=; b=JCWysgD78+9OZCs8FtkzxCQ6wXOipE/a52ncpojagX3HSL1qHF6DIWvudvS4ceAazK hCw0uaRrn7gmT46NuovrzRJ1F90sdEJ4mzTKPH1hxUarDqa3Xf+0XNEx5otF6pSA6sUn bB7+ubYv7ltJMKEX5g6OF5qmBp8wWyW+05lKiLUfAnjjDIwnetTVLpHnTAPgMnDhzlfo T0kx7lh50YhvoNVt0TkbCJRi+RrGYB+4obzATMVhr+fgG3hEKYRO64Vr9dhXQtKCMoqL vDBw6gET/4sQIbqmTfrs/Mn0bTlDr3qxzNEw0R229xFP26wLKYo51FMrNCKVlwcBmEMt P93A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HJ338Gt1; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HJ338Gt1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gt17-20020a1709072d9100b00704c106f27csi10940398ejc.714.2022.06.14.07.42.17; Tue, 14 Jun 2022 07:42:18 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HJ338Gt1; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=HJ338Gt1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 592BE68B682; Tue, 14 Jun 2022 17:42:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4F0F668B4D2 for ; Tue, 14 Jun 2022 17:42:08 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id D848E44DCB for ; Tue, 14 Jun 2022 16:42:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217727; bh=zKpItBREfg9ZzMZzcMhIJTzxNbA1EI1kjR152sNauL8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=HJ338Gt1/aFSoTmu/YyqwS/x3d+nnSnZ/Tr1ofGQENgaptoCT3Tcj0NLM9wAIr38o yWpj72f5maND3Bl0W2jiDLoZGuz4nyk4JOKvkXR0PpW7OOy/NNPyG3jlJiqMn6Dyhx nv2xIr24BOabJof5mJ+CKMnc9UYMFn+xqWFkOOiE53RJOcWZ6AcYN9cVE75/TJJvVz pHXNBoULi0GLuLfAnhOaTobmqrQB5prVi2oMbmOcgfFLA55+vc/bSUNo/hR6ERYuRG YdSyFiTeUAvZj1i/JM0NFOrMdewSGfkFlU+yzWfkpGDHL5BqWIaMxkKdiAATmnvJwg /5KgMIUksoAIA== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 3335644DC6 for ; Tue, 14 Jun 2022 16:42:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217727; bh=zKpItBREfg9ZzMZzcMhIJTzxNbA1EI1kjR152sNauL8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=HJ338Gt1/aFSoTmu/YyqwS/x3d+nnSnZ/Tr1ofGQENgaptoCT3Tcj0NLM9wAIr38o yWpj72f5maND3Bl0W2jiDLoZGuz4nyk4JOKvkXR0PpW7OOy/NNPyG3jlJiqMn6Dyhx nv2xIr24BOabJof5mJ+CKMnc9UYMFn+xqWFkOOiE53RJOcWZ6AcYN9cVE75/TJJvVz pHXNBoULi0GLuLfAnhOaTobmqrQB5prVi2oMbmOcgfFLA55+vc/bSUNo/hR6ERYuRG YdSyFiTeUAvZj1i/JM0NFOrMdewSGfkFlU+yzWfkpGDHL5BqWIaMxkKdiAATmnvJwg /5KgMIUksoAIA== Message-ID: <9fab6eb579616c28441096f3cecf827ff1262c88.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:42:06 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/13] lavu/mem: Add ff_fast_recalloc() 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: OZB8NNU97O9n Left this as an ff_ funtion for now since it's only used by the j2k code /Tomas From 5d36d431ffe4c8ba0f698d0c288ebc16b83f0bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 14 Jun 2022 13:35:18 +0200 Subject: [PATCH 06/13] lavu/mem: Add ff_fast_recalloc() --- libavutil/mem.c | 24 +++++++++++++++++++++ libavutil/mem.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/libavutil/mem.c b/libavutil/mem.c index a0c9a42849..7781b715a0 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -530,6 +530,30 @@ void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size) return ptr; } +int ff_fast_recalloc(void *ptr, unsigned int *size, size_t nelem, size_t elsize) +{ + void *val; + void *new_ptr; + unsigned int new_size = *size; + size_t product; + int ret; + memcpy(&val, ptr, sizeof(val)); + + if ((ret = av_size_mult(nelem, elsize, &product)) < 0) + return ret; + + if (!(new_ptr = av_fast_realloc(val, &new_size, product))) + return AVERROR(ENOMEM); + + if (new_size > *size) { + memset((uint8_t*)new_ptr + *size, 0, new_size - *size); + *size = new_size; + memcpy(ptr, &new_ptr, sizeof(new_ptr)); + } + + return 0; +} + static inline void fast_malloc(void *ptr, unsigned int *size, size_t min_size, int zero_realloc) { size_t max_size; diff --git a/libavutil/mem.h b/libavutil/mem.h index d91174196c..74abf3dce2 100644 --- a/libavutil/mem.h +++ b/libavutil/mem.h @@ -380,6 +380,61 @@ int av_reallocp_array(void *ptr, size_t nmemb, size_t size); */ void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); +/** + * Reallocate the pointed-to buffer if it is not large enough, otherwise do + * nothing. Old data is memcpy()'d to the start of the new buffer. The newly + * allocated space at the end of the buffer is zero-initialized. In other + * words the buffer is expanded with zeroes when necessary. + * + * If the pointed-to buffer is `NULL`, then a new zero-initialized buffer is + * allocated. + * + * If the pointed-to buffer is not large enough, and reallocation fails, + * `AVERROR(ENOMEM)` is returned. + * + * If nelem*elsize is too large then `AVERROR(EINVAL)` is returned. + * + * Contrary to av_fast_malloc(), *ptr and *size are not touched in case of + * error, to allow for proper cleanup. + * + * *ptr is not guaranteed to be an exact multiple of elsize bytes. + * + * This function is intended for use with arrays of structures that contain + * pointers that are allowed to grow and typically don't shrink. + * + * A typical use pattern follows: + * + * @code{.c} + * int foo_work(SomeContext *s) { + * if (ff_fast_recalloc(&s->foo, &s->foo_size, s->nfoo, sizeof(Foo))) + * return AVERROR(ENOMEM); + * for (x = 0; x < s->nfoo; x++) + * do stuff with s->foo[x] + * return 0; + * } + * + * void foo_close(SomeContext *s) { + * // note the use of s->foo_size, not s->nfoo + * for (x = 0; x < s->foo_size/sizeof(Foo); x++) + * av_freep(&s->foo[x].bar); + * av_freep(&s->foo); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success and will be left alone on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size and will be left + * along on failure. + * @param[in] nelem Number of desired elements in *ptr + * @param[in] elsize Size of each element in *ptr + * @return Zero on success, <0 on error. + * @see av_fast_realloc() + * @see av_fast_malloc() + */ +int ff_fast_recalloc(void *ptr, unsigned int *size, size_t nelem, size_t elsize); + /** * Allocate a buffer, reusing the given one if large enough. * -- 2.30.2 From patchwork Tue Jun 14 14:42:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36219 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1114808pzb; Tue, 14 Jun 2022 07:42:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLS30tWImndWazzABuh59hQeRA1jPqoAOJXwbHoWyvAqNr4M5w+TmiLiyK6/I0ET/uWR7r X-Received: by 2002:a05:6402:2687:b0:430:328f:e46b with SMTP id w7-20020a056402268700b00430328fe46bmr6620916edd.33.1655217775552; Tue, 14 Jun 2022 07:42:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217775; cv=none; d=google.com; s=arc-20160816; b=a7/bHOuf2fKHsoSiHa9xIj+InjME/GK6WXq/wrsOZXCYIzHwieqHsQxsHkHnuyH7I2 vLo2BR8/Xb33QlpkRVR9BiTDenIabEwo1zKUzlPyuVISux78zgy0IfhJozbVz+BctybN Q4AFJZZxIiPLyzOsBmhWdYwpzrmltdD1LRAD33pB+8VTvXuMEEEtMFghB5e7uDPRneCb Q4D5gIiNYQGiZaebluXRZ08X3ql6hpTYIXVA6ygtATntYmKLfiL5vyE/aMtOTfJt6VsC lDHr0h02sqIpk5p8/CYLNfobNVDeOlKR/mS+w63ewLDNKwmmJDkdTK8CUlcf4ySbJgCt Y0EA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=PsY9lunQgSq7v6d+eHsAV7JLT2PHDmrYwD3SJXwS0bA=; b=jfVQcxJeanViRcgjOUqAmhLMOnQkFJHQpNZxXZqMqGbrfgQeQiqKnjppFIFWOlbeli Vpy/OFHbIYgI25emn8EkjWwRyghuiayZ7fLuD2rT+VVovuUowU24TAMMiHkG8DBHJEz7 7xoZSHk5nvocw6YUzhQG0F/XTElMQXVsCX8fhni6icM5oWlLx72HNG7/9UXRyOubKm8k /AXzAFU4scEIkmhUq9Z+F1Inl/O/kegZlMhBNCvKmzAFL6YDQkd4UZlgKYzEuG3F23lC DUgpJYYris0EJ6U3HigAofVhwbLJJ7ZfpggfoNrRA+5JdXRGN6GiIcL+ljImHP3o7sHt ZVVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=v3qz1xiu; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=v3qz1xiu; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z14-20020a17090674ce00b006ff149c2b6asi11376083ejl.588.2022.06.14.07.42.55; Tue, 14 Jun 2022 07:42:55 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=v3qz1xiu; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=v3qz1xiu; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5FE3968B692; Tue, 14 Jun 2022 17:42:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3F18768B687 for ; Tue, 14 Jun 2022 17:42:45 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id CB59A44DCB for ; Tue, 14 Jun 2022 16:42:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217764; bh=b4c+1QRz9dKYeSX40b1XucNA7CiFZubDDjdCTzK0vpw=; h=Subject:From:To:Date:In-Reply-To:References:From; b=v3qz1xiuGKV8Hg9hs0b/mUlQM0JB08+jDmQ85oeLSwaNuDR33COI+GaNP67XywPQ+ XB/o1PXznpK9x2NoVG0QgtktYTtZ9Fh+g6L6GN5TcBqrrIVaEKWjSAoTsHY/WFpgIz NGdh7A9xbHdwqCmq0jDm7o3GOngJRiMGS/KX5kIZ3uyJmZvPlZkHY/bQiyMBCLRFvY Ut4y08vToOV1NiqCS8qt0aCKpyxwflU5Ce/XLYbpRrqquMrzCIKw6V72uChZzGl4h0 CsOIRKinF62j82QZVBhaBrItVivSIwcZUS6eboaII62LGed5hy/z4JJxubjCMOuE+Z 46Zp0p19GYPZA== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id E6BCC44DC6 for ; Tue, 14 Jun 2022 16:42:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217764; bh=b4c+1QRz9dKYeSX40b1XucNA7CiFZubDDjdCTzK0vpw=; h=Subject:From:To:Date:In-Reply-To:References:From; b=v3qz1xiuGKV8Hg9hs0b/mUlQM0JB08+jDmQ85oeLSwaNuDR33COI+GaNP67XywPQ+ XB/o1PXznpK9x2NoVG0QgtktYTtZ9Fh+g6L6GN5TcBqrrIVaEKWjSAoTsHY/WFpgIz NGdh7A9xbHdwqCmq0jDm7o3GOngJRiMGS/KX5kIZ3uyJmZvPlZkHY/bQiyMBCLRFvY Ut4y08vToOV1NiqCS8qt0aCKpyxwflU5Ce/XLYbpRrqquMrzCIKw6V72uChZzGl4h0 CsOIRKinF62j82QZVBhaBrItVivSIwcZUS6eboaII62LGed5hy/z4JJxubjCMOuE+Z 46Zp0p19GYPZA== Message-ID: From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:42:43 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/13] lavc/jpeg2000*: Use ff_fast_recalloc() to eliminate lots of allocations 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KHFjy4WK8+xd From 72a5f47503338a4fff816440ad64bc62cc23a738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Mon, 13 Jun 2022 17:04:10 +0200 Subject: [PATCH 07/13] lavc/jpeg2000*: Use ff_fast_recalloc() to eliminate lots of allocations --- libavcodec/jpeg2000.c | 72 +++++++++++++++++++++------------------- libavcodec/jpeg2000.h | 9 +++++ libavcodec/jpeg2000dec.c | 28 ++++++++-------- libavcodec/jpeg2000dwt.c | 9 +++-- libavcodec/jpeg2000dwt.h | 2 ++ 5 files changed, 70 insertions(+), 50 deletions(-) diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 945b787565..7ec5986875 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -52,17 +52,23 @@ static int32_t tag_tree_size(int w, int h) } /* allocate the memory for tag tree */ -static Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h) +static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, int w, int h) { int pw = w, ph = h; - Jpeg2000TgtNode *res, *t, *t2; + Jpeg2000TgtNode *t, *t2; int32_t tt_size; + size_t prod; tt_size = tag_tree_size(w, h); - t = res = av_calloc(tt_size, sizeof(*t)); - if (!res) - return NULL; + if (av_size_mult(tt_size, sizeof(*t), &prod)) + return AVERROR(ENOMEM); + + av_fast_malloc(old, size, prod); + if (!*old) + return AVERROR(ENOMEM); + t = *old; + memset(*old, 0, prod); while (w > 1 || h > 1) { int i, j; @@ -80,7 +86,7 @@ static Jpeg2000TgtNode *ff_jpeg2000_tag_tree_init(int w, int h) t = t2; } t[0].parent = NULL; - return res; + return 0; } void ff_tag_tree_zero(Jpeg2000TgtNode *t, int w, int h, int val) @@ -316,16 +322,14 @@ static int init_prec(AVCodecContext *avctx, /* Tag trees initialization */ - prec->cblkincl = - ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width, - prec->nb_codeblocks_height); - if (!prec->cblkincl) - return AVERROR(ENOMEM); - - prec->zerobits = - ff_jpeg2000_tag_tree_init(prec->nb_codeblocks_width, - prec->nb_codeblocks_height); - if (!prec->zerobits) + if (ff_jpeg2000_tag_tree_init(&prec->cblkincl, + &prec->cblkincl_size, + prec->nb_codeblocks_width, + prec->nb_codeblocks_height) || + ff_jpeg2000_tag_tree_init(&prec->zerobits, + &prec->zerobits_size, + prec->nb_codeblocks_width, + prec->nb_codeblocks_height)) return AVERROR(ENOMEM); if (prec->nb_codeblocks_width * (uint64_t)prec->nb_codeblocks_height > INT_MAX) { @@ -333,8 +337,7 @@ static int init_prec(AVCodecContext *avctx, return AVERROR(ENOMEM); } nb_codeblocks = prec->nb_codeblocks_width * prec->nb_codeblocks_height; - prec->cblk = av_calloc(nb_codeblocks, sizeof(*prec->cblk)); - if (!prec->cblk) + if (ff_fast_recalloc(&prec->cblk, &prec->cblk_size, nb_codeblocks, sizeof(*prec->cblk))) return AVERROR(ENOMEM); for (cblkno = 0; cblkno < nb_codeblocks; cblkno++) { Jpeg2000Cblk *cblk = prec->cblk + cblkno; @@ -376,6 +379,7 @@ static int init_prec(AVCodecContext *avctx, cblk->length = 0; cblk->npasses = 0; if (av_codec_is_encoder(avctx->codec)) { + av_freep(&cblk->layers); cblk->layers = av_calloc(codsty->nlayers, sizeof(*cblk->layers)); if (!cblk->layers) return AVERROR(ENOMEM); @@ -448,8 +452,7 @@ static int init_band(AVCodecContext *avctx, return AVERROR(ENOMEM); } nb_precincts = reslevel->num_precincts_x * reslevel->num_precincts_y; - band->prec = av_calloc(nb_precincts, sizeof(*band->prec)); - if (!band->prec) + if (ff_fast_recalloc(&band->prec, &band->prec_size, nb_precincts, sizeof(*band->prec))) return AVERROR(ENOMEM); for (precno = 0; precno < nb_precincts; precno++) { @@ -471,6 +474,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, { int reslevelno, bandno, gbandno = 0, ret, i, j; uint32_t csize; + size_t prod; if (codsty->nreslevels2decode <= 0) { av_log(avctx, AV_LOG_ERROR, "nreslevels2decode %d invalid or uninitialized\n", codsty->nreslevels2decode); @@ -496,19 +500,22 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, if (codsty->transform == FF_DWT97) { csize += AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->f_data); - comp->i_data = NULL; - comp->f_data = av_calloc(csize, sizeof(*comp->f_data)); + if (av_size_mult(csize, sizeof(*comp->f_data), &prod)) + return AVERROR(ENOMEM); + av_fast_malloc(&comp->f_data, &comp->f_data_size, prod); if (!comp->f_data) return AVERROR(ENOMEM); + memset(comp->f_data, 0, prod); } else { csize += AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->i_data); - comp->f_data = NULL; - comp->i_data = av_calloc(csize, sizeof(*comp->i_data)); + if (av_size_mult(csize, sizeof(*comp->i_data), &prod)) + return AVERROR(ENOMEM); + av_fast_malloc(&comp->i_data, &comp->i_data_size, prod); if (!comp->i_data) return AVERROR(ENOMEM); + memset(comp->i_data, 0, prod); } - comp->reslevel = av_calloc(codsty->nreslevels, sizeof(*comp->reslevel)); - if (!comp->reslevel) + if (ff_fast_recalloc(&comp->reslevel, &comp->reslevel_size, codsty->nreslevels, sizeof(*comp->reslevel))) return AVERROR(ENOMEM); /* LOOP on resolution levels */ for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { @@ -555,8 +562,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, reslevel->log2_prec_height) - (reslevel->coord[1][0] >> reslevel->log2_prec_height); - reslevel->band = av_calloc(reslevel->nbands, sizeof(*reslevel->band)); - if (!reslevel->band) + if (ff_fast_recalloc(&reslevel->band, &reslevel->band_size, reslevel->nbands, sizeof(*reslevel->band))) return AVERROR(ENOMEM); if (reslevel->num_precincts_x * (uint64_t)reslevel->num_precincts_y * reslevel->nbands > avctx->max_pixels / sizeof(*reslevel->band->prec)) @@ -599,7 +605,7 @@ void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) { int reslevelno, bandno, precno; for (reslevelno = 0; - comp->reslevel && reslevelno < codsty->nreslevels; + comp->reslevel && reslevelno < comp->reslevel_size/sizeof(*comp->reslevel); reslevelno++) { Jpeg2000ResLevel *reslevel; @@ -607,23 +613,21 @@ void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty) continue; reslevel = comp->reslevel + reslevelno; - for (bandno = 0; bandno < reslevel->nbands; bandno++) { + for (bandno = 0; bandno < reslevel->band_size/sizeof(*reslevel->band); bandno++) { Jpeg2000Band *band; if (!reslevel->band) continue; band = reslevel->band + bandno; - for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++) { + for (precno = 0; precno < band->prec_size/sizeof(*band->prec); precno++) { if (band->prec) { Jpeg2000Prec *prec = band->prec + precno; - int nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width; - av_freep(&prec->zerobits); av_freep(&prec->cblkincl); if (prec->cblk) { int cblkno; - for (cblkno = 0; cblkno < nb_code_blocks; cblkno ++) { + for (cblkno = 0; cblkno < prec->cblk_size/sizeof(*prec->cblk); cblkno ++) { Jpeg2000Cblk *cblk = &prec->cblk[cblkno]; av_freep(&cblk->data); av_freep(&cblk->passes); diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h index cbb8e0d951..3bf85a6669 100644 --- a/libavcodec/jpeg2000.h +++ b/libavcodec/jpeg2000.h @@ -177,6 +177,7 @@ typedef struct Jpeg2000Cblk { uint8_t incl; uint16_t length; uint16_t *lengthinc; + unsigned int lengthinc_size; uint8_t nb_lengthinc; uint8_t lblock; uint8_t *data; @@ -193,8 +194,11 @@ typedef struct Jpeg2000Prec { int nb_codeblocks_width; int nb_codeblocks_height; Jpeg2000TgtNode *zerobits; + unsigned int zerobits_size; Jpeg2000TgtNode *cblkincl; + unsigned int cblkincl_size; Jpeg2000Cblk *cblk; + unsigned int cblk_size; int decoded_layers; int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} } Jpeg2000Prec; // precinct @@ -205,6 +209,7 @@ typedef struct Jpeg2000Band { int i_stepsize; // quantization stepsize float f_stepsize; // quantization stepsize Jpeg2000Prec *prec; + unsigned int prec_size; } Jpeg2000Band; // subband typedef struct Jpeg2000ResLevel { @@ -213,13 +218,17 @@ typedef struct Jpeg2000ResLevel { int num_precincts_x, num_precincts_y; // number of precincts in x/y direction uint8_t log2_prec_width, log2_prec_height; // exponent of precinct size Jpeg2000Band *band; + unsigned int band_size; } Jpeg2000ResLevel; // resolution level typedef struct Jpeg2000Component { Jpeg2000ResLevel *reslevel; + unsigned int reslevel_size; DWTContext dwt; float *f_data; + unsigned int f_data_size; int *i_data; + unsigned int i_data_size; int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- can be reduced with lowres option int coord_o[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- original values from jpeg2000 headers uint8_t roi_shift; // ROI scaling value for the component diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index ef5167c29e..a3fc05ea97 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -79,6 +79,7 @@ typedef struct Jpeg2000TilePart { * one per component, so tile_part elements have a size of 3 */ typedef struct Jpeg2000Tile { Jpeg2000Component *comp; + unsigned int comp_size; uint8_t properties[4]; Jpeg2000CodingStyle codsty[4]; Jpeg2000QuantStyle qntsty[4]; @@ -141,6 +142,7 @@ typedef struct Jpeg2000DecoderContext { int curtileno; Jpeg2000Tile *tile; + unsigned int tile_size; Jpeg2000DSPContext dsp; /*options parameters*/ @@ -380,8 +382,7 @@ static int get_siz(Jpeg2000DecoderContext *s) return AVERROR(EINVAL); } - s->tile = av_calloc(s->numXtiles * s->numYtiles, sizeof(*s->tile)); - if (!s->tile) { + if (ff_fast_recalloc(&s->tile, &s->tile_size, s->numXtiles * s->numYtiles, sizeof(*s->tile))) { s->numXtiles = s->numYtiles = 0; return AVERROR(ENOMEM); } @@ -389,8 +390,7 @@ static int get_siz(Jpeg2000DecoderContext *s) for (i = 0; i < s->numXtiles * s->numYtiles; i++) { Jpeg2000Tile *tile = s->tile + i; - tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp)); - if (!tile->comp) + if (ff_fast_recalloc(&tile->comp, &tile->comp_size, s->ncomponents, sizeof(*tile->comp))) return AVERROR(ENOMEM); } @@ -1196,9 +1196,7 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, cblk->nb_lengthinc = 0; cblk->nb_terminationsinc = 0; - av_free(cblk->lengthinc); - cblk->lengthinc = av_calloc(newpasses, sizeof(*cblk->lengthinc)); - if (!cblk->lengthinc) + if (ff_fast_recalloc(&cblk->lengthinc, &cblk->lengthinc_size, newpasses, sizeof(*cblk->lengthinc))) return AVERROR(ENOMEM); tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1, sizeof(*cblk->data_start)); if (!tmp) @@ -1292,7 +1290,6 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, cblk->data_start[cblk->nb_terminations] = cblk->length; } } - av_freep(&cblk->lengthinc); } } // Save state of stream @@ -2166,12 +2163,13 @@ static int jpeg2000_mct_write_frame(AVCodecContext *avctx, void *td, return 0; } -static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s) +static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s, int close) { int tileno, compno; - for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) { + if (close) { + for (tileno = 0; tileno < s->tile_size/sizeof(*s->tile); tileno++) { if (s->tile[tileno].comp) { - for (compno = 0; compno < s->ncomponents; compno++) { + for (compno = 0; compno < s->tile[tileno].comp_size/sizeof(*s->tile[tileno].comp); compno++) { Jpeg2000Component *comp = s->tile[tileno].comp + compno; Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno; @@ -2182,10 +2180,11 @@ static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s) s->tile[tileno].packed_headers_size = 0; } } + av_freep(&s->tile); + } av_freep(&s->packed_headers); s->packed_headers_size = 0; memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream)); - av_freep(&s->tile); memset(s->codsty, 0, sizeof(s->codsty)); memset(s->qntsty, 0, sizeof(s->qntsty)); memset(s->properties, 0, sizeof(s->properties)); @@ -2689,7 +2688,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, avctx->execute2(avctx, jpeg2000_mct_write_frame, picture, NULL, s->numXtiles * s->numYtiles); - jpeg2000_dec_cleanup(s); + jpeg2000_dec_cleanup(s, 0); *got_frame = 1; @@ -2702,7 +2701,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, return bytestream2_tell(&s->g); end: - jpeg2000_dec_cleanup(s); + jpeg2000_dec_cleanup(s, 0); return ret; } @@ -2712,6 +2711,7 @@ static av_cold int jpeg2000_decode_close(AVCodecContext *avctx) av_freep(&s->idwt); av_freep(&s->cb); + jpeg2000_dec_cleanup(s, 1); return 0; } diff --git a/libavcodec/jpeg2000dwt.c b/libavcodec/jpeg2000dwt.c index 921461b6d7..f3ddefe48f 100644 --- a/libavcodec/jpeg2000dwt.c +++ b/libavcodec/jpeg2000dwt.c @@ -531,6 +531,7 @@ int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2], { int i, j, lev = decomp_levels, b[2][2]; + size_t prod; s->ndeclevels = decomp_levels; s->type = type; @@ -556,11 +557,15 @@ int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2], } if (type == FF_DWT97) { - s->f_linebuf = av_malloc_array(s->linesize, s->max_slices*sizeof(*s->f_linebuf)); + if (av_size_mult(s->linesize, s->max_slices*sizeof(*s->f_linebuf), &prod)) + return AVERROR(ENOMEM); + av_fast_malloc(&s->f_linebuf, &s->f_linebuf_size, prod); if (!s->f_linebuf) return AVERROR(ENOMEM); } else { - s->i_linebuf = av_malloc_array(s->linesize, s->max_slices*sizeof(*s->i_linebuf)); + if (av_size_mult(s->linesize, s->max_slices*sizeof(*s->i_linebuf), &prod)) + return AVERROR(ENOMEM); + av_fast_malloc(&s->i_linebuf, &s->i_linebuf_size, prod); if (!s->i_linebuf) return AVERROR(ENOMEM); } diff --git a/libavcodec/jpeg2000dwt.h b/libavcodec/jpeg2000dwt.h index d5e94c9916..fb6fc8f121 100644 --- a/libavcodec/jpeg2000dwt.h +++ b/libavcodec/jpeg2000dwt.h @@ -48,7 +48,9 @@ typedef struct DWTContext { uint8_t ndeclevels; ///< number of decomposition levels uint8_t type; ///< 0 for 9/7; 1 for 5/3 int32_t *i_linebuf; ///< int buffer used by transform + unsigned int i_linebuf_size; float *f_linebuf; ///< float buffer used by transform + unsigned int f_linebuf_size; int max_slices; int linesize; } DWTContext; -- 2.30.2 From patchwork Tue Jun 14 14:43:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36227 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1115002pzb; Tue, 14 Jun 2022 07:43:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzmfmnVXz2TcpMf4IoozDZD+yiYBNOmwbTfijD/TJhr+KCTsz+9+rTqBaEdpaOYP1mVzrDe X-Received: by 2002:a17:906:73d2:b0:716:14a4:43d with SMTP id n18-20020a17090673d200b0071614a4043dmr4538094ejl.434.1655217802319; Tue, 14 Jun 2022 07:43:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217802; cv=none; d=google.com; s=arc-20160816; b=PcMLJCMe3HT7Mhmc4YtZfgKBra9minqveLfgTKJv7V3yktwnKfut4lyH2uBi3vz/wa 8f9RLOq0USk+MGaHa9CEe1TC0Z1A3X554ga2g3pq2GYQK3rww25W8ovui+cChOO/Bidt vgr8/ScDM7HEinlsQswf6q89JZT6y+FA4gZCCsQo6wQRz/qx9W/I8RO9ir2OLMlopAJ3 SRzsNO7mZJrl2ZqdSKdXsq4UwadNGFxlxMSLH8AstUvUdljXE452kdwNAaW5h6WYMWcx mrgZYSwnRTfbOr9jM5Hgn3h7ARb6VsooJ2AU/puJwDFf+MteYeDmwAlxdp/y1icOlUws bklg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=WI8iyXbfQjTiS7jN0Rq2Dr/xXKdy6u0sWSucH63UbU4=; b=LJMlb1ZRpiNIthNqInisA6Ul7sD7Ync3unHK2+hejzYquDqhqU0VHJydv51medaek3 8HqHNz9Rh84nYzFQjSj4eqBfbiacdNmrg6arh+kPdVxfBfaqNsEm5FLvtRr1ueeykNGn yw6kSrFXpDlZS2Z8xPiY6Vq4cYLtg6+dV+81ieL1Skv6SPRQjya+x940jub/TtaY5xT2 6BbEy/O1WCa7WZt8fWcKMQ4dGMdgB3Fz/Dg+z7xtqfvHcvqTzJV1SRjZVJm5Rk0DSuRi jR3LzYhQcAKan5IO0TN3WkwmREK8lp+jlk08i5YGnWtYfjUBW2hgplC/7tQQx3AF4eOS yXEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=AMgLLKuZ; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=AMgLLKuZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l23-20020aa7c3d7000000b0043348e6ef79si10814717edr.296.2022.06.14.07.43.20; Tue, 14 Jun 2022 07:43:22 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=AMgLLKuZ; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=AMgLLKuZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 814E168B646; Tue, 14 Jun 2022 17:43:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 616DB68B67B for ; Tue, 14 Jun 2022 17:43:15 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id DB82644DCB for ; Tue, 14 Jun 2022 16:43:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217794; bh=wSUFQnLVZUmuIsT4PlghYZ1GjWFlw9BZXyHXkgMhva4=; h=Subject:From:To:Date:In-Reply-To:References:From; b=AMgLLKuZDZadZ1M/CBrmdhkzUqu7Pv79z4oQHoy6YeuedSmCz75CZpwta1JAxfBR1 zCVgSa+Dp583p3VsBMnvdM6YM2GilwQNGpyO1h2Uus457wkThC+M9a5vIubLslOcvp NGIPVokAxeNdFQppsigJnibD0X8iLHwyUCYYE4Md4jqgt/WawNCMDCrGkq4yI1nt6v sdOnKGlgg8S9uM8WOXOI7r5udbddGbihd+DBpfkg3h9Ff5Y2P9sh0M0Q6ozOzNyXtW Ax8Wa69u2qF3hbT0LgFunpiRXGGUSTFDG/h3mn/sUu70Dgtb2pcD07Zfk8LVf4VAL9 WWauyEp2g/Q4g== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 36FF844DC6 for ; Tue, 14 Jun 2022 16:43:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217794; bh=wSUFQnLVZUmuIsT4PlghYZ1GjWFlw9BZXyHXkgMhva4=; h=Subject:From:To:Date:In-Reply-To:References:From; b=AMgLLKuZDZadZ1M/CBrmdhkzUqu7Pv79z4oQHoy6YeuedSmCz75CZpwta1JAxfBR1 zCVgSa+Dp583p3VsBMnvdM6YM2GilwQNGpyO1h2Uus457wkThC+M9a5vIubLslOcvp NGIPVokAxeNdFQppsigJnibD0X8iLHwyUCYYE4Md4jqgt/WawNCMDCrGkq4yI1nt6v sdOnKGlgg8S9uM8WOXOI7r5udbddGbihd+DBpfkg3h9Ff5Y2P9sh0M0Q6ozOzNyXtW Ax8Wa69u2qF3hbT0LgFunpiRXGGUSTFDG/h3mn/sUu70Dgtb2pcD07Zfk8LVf4VAL9 WWauyEp2g/Q4g== Message-ID: <521787bdce69bf8faf7cf1cd8c7470c4f69307ac.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:43:13 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/13] lavc/jpeg2000: Switch Jpeg2000TgtNode to int32_t parent 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: W3tR2V54Ih3r From c0e00cf03f5a1fcffc90395d4b26607e1681690c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 7 Jun 2022 16:43:40 +0200 Subject: [PATCH 08/13] lavc/jpeg2000: Switch Jpeg2000TgtNode to int32_t parent --- libavcodec/j2kenc.c | 44 ++++++++++++++++++++-------------------- libavcodec/jpeg2000.c | 20 +++++++++--------- libavcodec/jpeg2000.h | 2 +- libavcodec/jpeg2000dec.c | 18 ++++++++-------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 4de596ffa9..a3d8144acc 100644 --- a/libavcodec/j2kenc.c +++ b/libavcodec/j2kenc.c @@ -249,36 +249,36 @@ static void j2k_flush(Jpeg2000EncoderContext *s) /* tag tree routines */ /** code the value stored in node */ -static void tag_tree_code(Jpeg2000EncoderContext *s, Jpeg2000TgtNode *node, int threshold) +static void tag_tree_code(Jpeg2000EncoderContext *s, Jpeg2000TgtNode *nodes, int32_t node, int threshold) { - Jpeg2000TgtNode *stack[30]; + int32_t stack[30]; int sp = -1, curval = 0; - while(node->parent){ + while(nodes[node].parent >= 0){ stack[++sp] = node; - node = node->parent; + node = nodes[node].parent; } while (1) { - if (curval > node->temp_val) - node->temp_val = curval; + if (curval > nodes[node].temp_val) + nodes[node].temp_val = curval; else { - curval = node->temp_val; + curval = nodes[node].temp_val; } - if (node->val >= threshold) { + if (nodes[node].val >= threshold) { put_bits(s, 0, threshold - curval); curval = threshold; } else { - put_bits(s, 0, node->val - curval); - curval = node->val; - if (!node->vis) { + put_bits(s, 0, nodes[node].val - curval); + curval = nodes[node].val; + if (!nodes[node].vis) { put_bits(s, 1, 1); - node->vis = 1; + nodes[node].vis = 1; } } - node->temp_val = curval; + nodes[node].temp_val = curval; if (sp < 0) break; node = stack[sp--]; @@ -286,14 +286,14 @@ static void tag_tree_code(Jpeg2000EncoderContext *s, Jpeg2000TgtNode *node, int } /** update the value in node */ -static void tag_tree_update(Jpeg2000TgtNode *node) +static void tag_tree_update(Jpeg2000TgtNode *nodes, int node) { int lev = 0; - while (node->parent){ - if (node->parent->val <= node->val) + while (nodes[node].parent >= 0){ + if (nodes[nodes[node].parent].val <= nodes[node].val) break; - node->parent->val = node->val; - node = node->parent; + nodes[nodes[node].parent].val = nodes[node].val; + node = nodes[node].parent; lev++; } } @@ -814,7 +814,7 @@ static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, in prec->zerobits[pos].val = expn[bandno] + numgbits - 1 - cblk->nonzerobits; cblk->incl = 0; cblk->lblock = 3; - tag_tree_update(prec->zerobits + pos); + tag_tree_update(prec->zerobits, pos); for (i = 0; i < nlayers; i++) { if (cblk->layers[i].npasses > 0) { prec->cblkincl[pos].val = i; @@ -823,7 +823,7 @@ static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, in } if (i == nlayers) prec->cblkincl[pos].val = i; - tag_tree_update(prec->cblkincl + pos); + tag_tree_update(prec->cblkincl, pos); } } } @@ -877,7 +877,7 @@ static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, in // inclusion information if (!cblk->incl) - tag_tree_code(s, prec->cblkincl + pos, layno + 1); + tag_tree_code(s, prec->cblkincl, pos, layno + 1); else { put_bits(s, cblk->layers[layno].npasses > 0, 1); } @@ -887,7 +887,7 @@ static int encode_packet(Jpeg2000EncoderContext *s, Jpeg2000ResLevel *rlevel, in // zerobits information if (!cblk->incl) { - tag_tree_code(s, prec->zerobits + pos, 100); + tag_tree_code(s, prec->zerobits, pos, 100); cblk->incl = 1; } diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 7ec5986875..0bec2e187d 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -55,8 +55,8 @@ static int32_t tag_tree_size(int w, int h) static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, int w, int h) { int pw = w, ph = h; - Jpeg2000TgtNode *t, *t2; - int32_t tt_size; + Jpeg2000TgtNode *t; + int32_t tt_size, ofs = 0; size_t prod; tt_size = tag_tree_size(w, h); @@ -77,15 +77,15 @@ static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, w = (w + 1) >> 1; h = (h + 1) >> 1; - t2 = t + pw * ph; + ofs += pw * ph; for (i = 0; i < ph; i++) for (j = 0; j < pw; j++) - t[i * pw + j].parent = &t2[(i >> 1) * w + (j >> 1)]; + t[i * pw + j].parent = (i >> 1) * w + (j >> 1) + ofs; - t = t2; + t += pw * ph; } - t[0].parent = NULL; + t[0].parent = -1; return 0; } @@ -320,6 +320,10 @@ static int init_prec(AVCodecContext *avctx, band->log2_cblk_height) - (prec->coord[1][0] >> band->log2_cblk_height); + /* \sum_{i=0}^\inf 4^-i = 4/3 */ + if (prec->nb_codeblocks_width * (uint64_t)prec->nb_codeblocks_height > INT32_MAX / 4 * 3) { + return AVERROR(ENOMEM); + } /* Tag trees initialization */ if (ff_jpeg2000_tag_tree_init(&prec->cblkincl, @@ -332,10 +336,6 @@ static int init_prec(AVCodecContext *avctx, prec->nb_codeblocks_height)) return AVERROR(ENOMEM); - if (prec->nb_codeblocks_width * (uint64_t)prec->nb_codeblocks_height > INT_MAX) { - prec->cblk = NULL; - return AVERROR(ENOMEM); - } nb_codeblocks = prec->nb_codeblocks_width * prec->nb_codeblocks_height; if (ff_fast_recalloc(&prec->cblk, &prec->cblk_size, nb_codeblocks, sizeof(*prec->cblk))) return AVERROR(ENOMEM); diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h index 3bf85a6669..1fd9d193e7 100644 --- a/libavcodec/jpeg2000.h +++ b/libavcodec/jpeg2000.h @@ -126,10 +126,10 @@ typedef struct Jpeg2000T1Context { } Jpeg2000T1Context; typedef struct Jpeg2000TgtNode { + int32_t parent; uint8_t val; uint8_t temp_val; uint8_t vis; - struct Jpeg2000TgtNode *parent; } Jpeg2000TgtNode; typedef struct Jpeg2000CodingStyle { diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index a3fc05ea97..a2b9f0166b 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -185,24 +185,24 @@ static void jpeg2000_flush(Jpeg2000DecoderContext *s) } /* decode the value stored in node */ -static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node, +static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *nodes, int32_t node, int threshold) { Jpeg2000TgtNode *stack[30]; int sp = -1, curval = 0; - if (!node) { + if (node < 0) { av_log(s->avctx, AV_LOG_ERROR, "missing node\n"); return AVERROR_INVALIDDATA; } - while (node && !node->vis) { - stack[++sp] = node; - node = node->parent; + while (node >= 0 && !nodes[node].vis) { + stack[++sp] = &nodes[node]; + node = nodes[node].parent; } - if (node) - curval = node->val; + if (node >= 0) + curval = nodes[node].val; else curval = stack[sp]->val; @@ -1161,7 +1161,7 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, if (cblk->npasses) incl = get_bits(s, 1); else - incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno; + incl = tag_tree_decode(s, prec->cblkincl, cblkno, layno + 1) == layno; if (!incl) continue; else if (incl < 0) @@ -1169,7 +1169,7 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, if (!cblk->npasses) { int v = expn[bandno] + numgbits - 1 - - tag_tree_decode(s, prec->zerobits + cblkno, 100); + tag_tree_decode(s, prec->zerobits, cblkno, 100); if (v < 0 || v > 30) { av_log(s->avctx, AV_LOG_ERROR, "nonzerobits %d invalid or unsupported\n", v); -- 2.30.2 From patchwork Tue Jun 14 14:43:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36228 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1115172pzb; Tue, 14 Jun 2022 07:43:45 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v1f3cxCHKzz5WuzIkyhnBnJKtHxxRJoSGgh/sjmi11CfxUSBqLDXPv/ad9uoTUXPI41rJF X-Received: by 2002:a17:906:a245:b0:708:ce69:e38b with SMTP id bi5-20020a170906a24500b00708ce69e38bmr4644458ejb.100.1655217825578; Tue, 14 Jun 2022 07:43:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217825; cv=none; d=google.com; s=arc-20160816; b=FtxI3dPEU2yreSb6B4n5SNUz3itGJxbbnh+JjxtUKaz9pBdMtpQhI04y1hgITGv/Ni 46swyc+ont+kIxJFi0pDPexxYjVXss6mKKoDprYPCnuSXEONExUUGJE1TIL0AVCvttja cAvWNDp8vxYD9vheXNo9nJZmt5nWJpBjHPiVZNRpMrCCFOeETu4ECbnMKoRtnidaAI+G fIdee3crS8c+roJXmgotKtDpkdl5yU78geoutfuDkOsJHQFhAN6H7+dW72CHAhrf5rW2 zODi1aY4C6S1thJ5KzHZEv97M0OSbR3m6iNzDKCnBZvRm4106Kmnv7t8P02gYh1LcrZR 0HxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=4HGA4VYTRD+acS5IWUzNkWdsy7I92RTIgYp0Vbqssxo=; b=wrjU5L6ASADFns8eRNiro1h/POYqaA1cmd9QUuPWEVlHhWUWpdx8qKPrqVxm6z+fO6 /e5EygDWcunEWKGK/FuLdVRKyXug8ywYR0x7UrtusvN4Sdlv6RIFUWu1pvJ2sWUSOG2J k1iNEYUjlkuH02yeMvzE5+yhvnCM3Eq0D7IYrZn0BSefZ67+8P5/oXF5YQv7VXrPlYcs aoQFjOeGw8SgjJitK3nVlrth53lHV7iJ/weNrM1ttZpTiM4cb4qpEg6HubOZ5c4wctxv BthiyJ7Z5itjGkeuoi2gjIURyfF3At7QvowJbGQM34YOKSUvEz/GzvnxeCCsRQS1mB9b IAqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=UOiyHew2; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=UOiyHew2; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cs16-20020a170906dc9000b006f3d2558d4bsi12802793ejc.496.2022.06.14.07.43.45; Tue, 14 Jun 2022 07:43:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=UOiyHew2; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=UOiyHew2; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B0D368B6A3; Tue, 14 Jun 2022 17:43:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 79CFC68B68F for ; Tue, 14 Jun 2022 17:43:40 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id F1CD444DCB for ; Tue, 14 Jun 2022 16:43:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217819; bh=aAd4xBRACtCKL98UF8NpKE3Pz1io6OF2n63x82J/P8k=; h=Subject:From:To:Date:In-Reply-To:References:From; b=UOiyHew2ePEFPXwj/Ck97L1/hFJPCYwyHyPEWGhfJ/LICSPM29n7EfesYSx5A14Ff ZJKVUtjQI6N4VSAFX9V/vj65ZKvqY24CW8q1vtSoNDMErj2tO2vpX5Axgpktpfg2v8 v71/sHXzqeH16FbuRTb7C1dcvUWZfr9wlM7X00550yFCiBnlmJ9/g66GkxBIb/XZKk SIz5gn/aTDblf79oaFzMIemNPFAuTNr4MavU2aL32et1ytXHHlwMqDiOXUViFSgTN0 LLnGUeWs3kOHhn61qbkFIilXg9E+1ONH+NeTbUfm/TYwcsNGXYO5ENOS7FhZ6ne4K7 8L43xs40fvaUQ== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 3D86A44DC6 for ; Tue, 14 Jun 2022 16:43:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217819; bh=aAd4xBRACtCKL98UF8NpKE3Pz1io6OF2n63x82J/P8k=; h=Subject:From:To:Date:In-Reply-To:References:From; b=UOiyHew2ePEFPXwj/Ck97L1/hFJPCYwyHyPEWGhfJ/LICSPM29n7EfesYSx5A14Ff ZJKVUtjQI6N4VSAFX9V/vj65ZKvqY24CW8q1vtSoNDMErj2tO2vpX5Axgpktpfg2v8 v71/sHXzqeH16FbuRTb7C1dcvUWZfr9wlM7X00550yFCiBnlmJ9/g66GkxBIb/XZKk SIz5gn/aTDblf79oaFzMIemNPFAuTNr4MavU2aL32et1ytXHHlwMqDiOXUViFSgTN0 LLnGUeWs3kOHhn61qbkFIilXg9E+1ONH+NeTbUfm/TYwcsNGXYO5ENOS7FhZ6ne4K7 8L43xs40fvaUQ== Message-ID: <5141c5587ce703481b716b9898e086e47f763a49.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:43:38 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/13] lavc/jpeg2000: Speed up ff_jpeg2000_tag_tree_init() using stereotypes for sizes <= 4x4 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EQtZhfqdPJyZ From 03b806f89453571310dcb14edbd9f51e059b7476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Wed, 8 Jun 2022 10:08:15 +0200 Subject: [PATCH 09/13] lavc/jpeg2000: Speed up ff_jpeg2000_tag_tree_init() using stereotypes for sizes <= 4x4 --- libavcodec/jpeg2000.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 0bec2e187d..b80e68bcba 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -51,6 +51,31 @@ static int32_t tag_tree_size(int w, int h) return (int32_t)(res + 1); } +#define T(x) (x*sizeof(Jpeg2000TgtNode)) + +static const size_t tt_sizes[16] = { + T(1),T(3),T(6),T(7),T(3),T(5),T(9),T(11),T(6),T(9),T(14),T(17),T(7),T(11),T(17),T(21), +}; + +static const Jpeg2000TgtNode tt_stereotypes[16][21] = { + {{-1},}, + {{2},{2},{-1},}, + {{3},{3},{4},{5},{5},{-1},}, + {{4},{4},{5},{5},{6},{6},{-1},}, + {{2},{2},{-1},}, + {{4},{4},{4},{4},{-1},}, + {{6},{6},{7},{6},{6},{7},{8},{8},{-1},}, + {{8},{8},{9},{9},{8},{8},{9},{9},{10},{10},{-1},}, + {{3},{3},{4},{5},{5},{-1},}, + {{6},{6},{6},{6},{7},{7},{8},{8},{-1},}, + {{9},{9},{10},{9},{9},{10},{11},{11},{12},{13},{13},{13},{13},{-1},}, + {{12},{12},{13},{13},{12},{12},{13},{13},{14},{14},{15},{15},{16},{16},{16},{16},{-1},}, + {{4},{4},{5},{5},{6},{6},{-1},}, + {{8},{8},{8},{8},{9},{9},{9},{9},{10},{10},{-1},}, + {{12},{12},{13},{12},{12},{13},{14},{14},{15},{14},{14},{15},{16},{16},{16},{16},{-1},}, + {{16},{16},{17},{17},{16},{16},{17},{17},{18},{18},{19},{19},{18},{18},{19},{19},{20},{20},{20},{20},{-1},}, +}; + /* allocate the memory for tag tree */ static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, int w, int h) { @@ -59,6 +84,15 @@ static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, int32_t tt_size, ofs = 0; size_t prod; + if (w <= 4 && h <= 4) { + int idx = w-1 + (h-1)*4; + size_t sz = tt_sizes[idx]; + av_fast_malloc(old, size, sz); + if (*old) { + memcpy(*old, tt_stereotypes[idx], sz); + } + return 0; + } else { tt_size = tag_tree_size(w, h); if (av_size_mult(tt_size, sizeof(*t), &prod)) @@ -87,6 +121,7 @@ static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, } t[0].parent = -1; return 0; + } } void ff_tag_tree_zero(Jpeg2000TgtNode *t, int w, int h, int val) -- 2.30.2 From patchwork Tue Jun 14 14:43:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36229 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1115351pzb; Tue, 14 Jun 2022 07:44:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyF+Tk0t5OM1dI6k2vUUbALLaNljfC/xJJNEOnblO6Ltd3UZuXbSoqAQndSNeDIrqjt/Ksl X-Received: by 2002:a17:906:7949:b0:711:f02e:c078 with SMTP id l9-20020a170906794900b00711f02ec078mr4713766ejo.628.1655217845985; Tue, 14 Jun 2022 07:44:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217845; cv=none; d=google.com; s=arc-20160816; b=lcWwB6qNQqlcfh4rrpd9G4pflXXwyPU/bR3CZBSyH6kZn67lHJinEqv2qvMXpS0DKb BaiP/+yj1CK8ZcyszQJEeaPcY+dRZvc1KIApjMrBF7LavEmammOois3cdMCeML1X4DFI BBztwgIBr+wwQ3QKL+AdqpfMleIIi/urhdvGknbmO4/UWfDUjeu8g54MLyalNByzN6nZ snq+5t9yWRmbEmalKWHck3h7pmqAVVqrKzz8o1iYZdfe7qvbIhDquJge+rlpShx449Ji HuQBBxG1vYtjRenAqt+84bcLFFSiBi1TA0eIstjvTzAkR6vKb6imht/AhXr26Hjri56D /yQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=HXPpqRvkSlVcbiba2WD3UHcNeBS6du0J5WhgModP4cI=; b=OynZu5c//3KiFO3M9mWR+J5rECVkhMcW20ZEv0JbAtmyw2CYQ11tSdxEn5Rha/BFEz 1dRgECSiATsMEpYOdOIWEi3nSsi3ilObkpVzNqyg7KtsRRaUFklyLxaFhoTPO2eC9X4u 3pRlPfrzj46qVPSEhB2B2o1ZRKB876EcJTjxzFVqRazsLsaNm1Fn5XfTfpS0EA4jvWTp PQrxqxreueGTV9DFX3ywsfsUb1h1+MDuxdP9RktaxAWr5/W538mIDG7afhKMlK6Rd33W +9UhZz168zT/UEm9DMLcShidu6hz5wsxxRoCpn7aqU42KPlCuyd2GUAO9MwLUcTQ1GR7 PQlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=tmXwvBCC; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=tmXwvBCC; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e14-20020a170906648e00b00712002307afsi12342157ejm.88.2022.06.14.07.44.05; Tue, 14 Jun 2022 07:44:05 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=tmXwvBCC; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=tmXwvBCC; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 94F2268B6AB; Tue, 14 Jun 2022 17:44:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3BD37680CAB for ; Tue, 14 Jun 2022 17:44:01 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id B515D44DCB for ; Tue, 14 Jun 2022 16:44:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217840; bh=8/XHdBCoB5dOTeqZCAlbtZAFTyTZdwnKZG9jV0sZz1o=; h=Subject:From:To:Date:In-Reply-To:References:From; b=tmXwvBCCnG0+UISrUir/YWEN+LVJW34NgMVDOblNNnS7GfajqJug+qYx7VlZQ4Duf cvoB+EotekDOwcncTx0eBugkmPQu3NxRiPBU5HLVSYFRg/5v956idq5SwDPQNFNMSh O8SBWQ1RNqKez56AU2LITQDEX8/4A7htosgjUp0qm433t+LC2+lMvPd5ZMVrO9rAGH e0RhYGAtjvdEayBW5pFehYHwh2NUxMmJzmlYMUAHNJcuDa8CMCapYKUHY1WGPySQ8m M6urCvaD6dNe29Fh1+FqS7LP3c+oMU7OgxAk6o8XVjZ82abs4dcFfbRdGsmOxxaHSe A9WldWxEw7y0w== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 2B44944DC6 for ; Tue, 14 Jun 2022 16:44:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217840; bh=8/XHdBCoB5dOTeqZCAlbtZAFTyTZdwnKZG9jV0sZz1o=; h=Subject:From:To:Date:In-Reply-To:References:From; b=tmXwvBCCnG0+UISrUir/YWEN+LVJW34NgMVDOblNNnS7GfajqJug+qYx7VlZQ4Duf cvoB+EotekDOwcncTx0eBugkmPQu3NxRiPBU5HLVSYFRg/5v956idq5SwDPQNFNMSh O8SBWQ1RNqKez56AU2LITQDEX8/4A7htosgjUp0qm433t+LC2+lMvPd5ZMVrO9rAGH e0RhYGAtjvdEayBW5pFehYHwh2NUxMmJzmlYMUAHNJcuDa8CMCapYKUHY1WGPySQ8m M6urCvaD6dNe29Fh1+FqS7LP3c+oMU7OgxAk6o8XVjZ82abs4dcFfbRdGsmOxxaHSe A9WldWxEw7y0w== Message-ID: <716c3b1e162a5da4cfa5eed1de6b6d2954fe560a.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:43:59 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/13] lavc/jpeg2000: Reindent 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lT3UOy//H0fF From d3aaf24ca4778e6ba280f99f9ce90cb15738699b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 14 Jun 2022 11:23:08 +0200 Subject: [PATCH 10/13] lavc/jpeg2000: Reindent --- libavcodec/jpeg2000.c | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index b80e68bcba..8ee50b77c5 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -93,34 +93,34 @@ static int ff_jpeg2000_tag_tree_init(Jpeg2000TgtNode **old, unsigned int *size, } return 0; } else { - tt_size = tag_tree_size(w, h); + tt_size = tag_tree_size(w, h); - if (av_size_mult(tt_size, sizeof(*t), &prod)) - return AVERROR(ENOMEM); + if (av_size_mult(tt_size, sizeof(*t), &prod)) + return AVERROR(ENOMEM); - av_fast_malloc(old, size, prod); - if (!*old) - return AVERROR(ENOMEM); - t = *old; - memset(*old, 0, prod); + av_fast_malloc(old, size, prod); + if (!*old) + return AVERROR(ENOMEM); + t = *old; + memset(*old, 0, prod); - while (w > 1 || h > 1) { - int i, j; - pw = w; - ph = h; + while (w > 1 || h > 1) { + int i, j; + pw = w; + ph = h; - w = (w + 1) >> 1; - h = (h + 1) >> 1; - ofs += pw * ph; + w = (w + 1) >> 1; + h = (h + 1) >> 1; + ofs += pw * ph; - for (i = 0; i < ph; i++) - for (j = 0; j < pw; j++) - t[i * pw + j].parent = (i >> 1) * w + (j >> 1) + ofs; + for (i = 0; i < ph; i++) + for (j = 0; j < pw; j++) + t[i * pw + j].parent = (i >> 1) * w + (j >> 1) + ofs; - t += pw * ph; - } - t[0].parent = -1; - return 0; + t += pw * ph; + } + t[0].parent = -1; + return 0; } } -- 2.30.2 From patchwork Tue Jun 14 14:44:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36230 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1115530pzb; Tue, 14 Jun 2022 07:44:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzaib3K/P+Bv+JgIm0bbR6XFIMGw167tr3cktF3KVvRUORfhPjYEwECiIfRsDTVHn6a3jUC X-Received: by 2002:a17:907:6ea4:b0:711:d106:b93a with SMTP id sh36-20020a1709076ea400b00711d106b93amr4739798ejc.189.1655217871079; Tue, 14 Jun 2022 07:44:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217871; cv=none; d=google.com; s=arc-20160816; b=zOd9KM14G1fGP7ZzCxbvlAKgIQTw8ycNoCus5BKl1ZN5nJ+jX/lgMO7BcENvryIsJP Q6w/152Lcs76irTj42frZtCi7bd3oxp1k7xUn+nCkzvNochXOCMWpa1vCbIs3pU1+pJJ r+gtrqX07hdMS233vdYJ9xAgF5VVk1TEzvFEgBBGU9eZCX2I27ATruFUD9Q+5lulCHBw WqxqGO3khSwazi8iZHtf48lxa5zyruCAT0ChUU9AHNQWWcyI0V/uS32wCJKWNTJOW7bA Kb6yiu5+IHM1b0xwcD1/XGy59bjq1FdQWr+RAwpgWIxgnrwyV/ieDbbjbWtlbxu5uzex p5QQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=IeFftfxglfO7Xmc/fDV5hQeyUZ1J4ojHFdpPf4hr4HM=; b=zz0xD5I+yEYdG1C+XIejr8sMYofskUgKB8i9hOf6T85bi0dDvSvD6wX+S/Th1CPeau P6kIlpW023FfqkmFxHQLrzUQDmT3Hi3tZRW38Ta9lDPPMuS2BfKmDZjW/pj7dpwpAzkM PrBMtXoAKDe5JhHwbpRd34U0jEGa2ehaEIKcpWofvRWPjsCXYyvOHgpg85gNS9nmN4a5 4kfvzHSDZPwEeHCDeBHENfywQ50NT7e3inTe0PCCll9484qKDC07nU2tSLp6Vwl+mlUc Nf77RqdQX+C34DJLDxTd4ib+NbMAI+w6p43GdioUKXiNeX4a7KH9DNxQVtDg/P5i839S e5uQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=lkcVHfTE; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=iS9kquA1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id nb16-20020a1709071c9000b00708053502c7si13192352ejc.440.2022.06.14.07.44.30; Tue, 14 Jun 2022 07:44:31 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=lkcVHfTE; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=iS9kquA1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9A55668B69A; Tue, 14 Jun 2022 17:44:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 10A7768B69B for ; Tue, 14 Jun 2022 17:44:25 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 6240944DCD for ; Tue, 14 Jun 2022 16:44:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217865; bh=/cw0brIhVQSxN/piqD0+dE5VeXVh2M6UQvaDGn9+OJc=; h=Subject:From:To:Date:In-Reply-To:References:From; b=lkcVHfTEAMVhsaoyvC6164m6EjdRb912zs3D57bJqCAsijuFCyCxR5oT7nQqth9xu WOryFoKzcqOaoSrLhqi6KjGj/sas7KGRvXCtNYZID9xejqWE9Fvf1sc4+0vuCDuxmZ 4vw8REuAoA5bjOiY+nAMPTdQXR2qf55p/j/joosVGVcEUBuyLkwIevf+LbMYt2l0zq DrR7Sp3gBgbIK5bOOtHK/oOf0N7xS9HD2KU9hfUd0eyzajs75UNDxYVsFm69wOUZKp WWDGRDYQ1C6FxCRNHb7SiB2NihP5ma4tiYOvHa8TNKTV67KIkwc3d5iIzxjTAGWm5v OcUvrW7YlOXtg== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id D512244DC6 for ; Tue, 14 Jun 2022 16:44:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217864; bh=/cw0brIhVQSxN/piqD0+dE5VeXVh2M6UQvaDGn9+OJc=; h=Subject:From:To:Date:In-Reply-To:References:From; b=iS9kquA1IHzf3/zo7ybtQM10ZT1Ggb2UJ9rJIP3/t2UJj62HxTiRDVFqGoU48067+ PElTotKvbYDEnGTHvPxcM/PUck72TVoRHc6x+TwQZuX6nrt5MmDf8rxLASMdb01uz/ JK3C+HFtECd+ghQENy0xdgl7YXT0553LalCpUUgAtqfaYu78yqQVFn4Ea4IGBlG89Z FKGMvqaecNVljWcIsk0IC4CCAcCb81rHDVYOFH2MgCQU9C42ibnL++fuG5wHNiHPld zvtNC3jyAepqhbTwAY3BdKLbggH7qYX5l68zXOL4+0bJmHmz+3lGajAP29JeYB5kfl cknqytsVQWnYA== Message-ID: <3aeedc34b26bed5f82cadfc39fe7cce968bdc698.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:44:24 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/13] lavc/jpeg2000: Minimize calls to av_codec_is_encoder() 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A5nQSu3YBT/P From 5b492d4e92a11946fd7425497205b1842fa1912c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 14 Jun 2022 10:57:45 +0200 Subject: [PATCH 11/13] lavc/jpeg2000: Minimize calls to av_codec_is_encoder() --- libavcodec/jpeg2000.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index 8ee50b77c5..2e3c33303b 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -247,7 +247,7 @@ static void init_band_stepsize(AVCodecContext *avctx, Jpeg2000CodingStyle *codsty, Jpeg2000QuantStyle *qntsty, int bandno, int gbandno, int reslevelno, - int cbps) + int cbps, int is_enc) { /* TODO: Implementation of quantization step not finished, * see ISO/IEC 15444-1:2002 E.1 and A.6.4. */ @@ -305,7 +305,7 @@ static void init_band_stepsize(AVCodecContext *avctx, /* FIXME: In OpenJPEG code stepsize = stepsize * 0.5. Why? * If not set output of entropic decoder is not correct. */ - if (!av_codec_is_encoder(avctx->codec)) + if (!is_enc) band->f_stepsize *= 0.5; } @@ -316,7 +316,8 @@ static int init_prec(AVCodecContext *avctx, Jpeg2000CodingStyle *codsty, int precno, int bandno, int reslevelno, int log2_band_prec_width, - int log2_band_prec_height) + int log2_band_prec_height, + int is_enc) { Jpeg2000Prec *prec = band->prec + precno; int nb_codeblocks, cblkno; @@ -413,7 +414,7 @@ static int init_prec(AVCodecContext *avctx, cblk->lblock = 3; cblk->length = 0; cblk->npasses = 0; - if (av_codec_is_encoder(avctx->codec)) { + if (is_enc) { av_freep(&cblk->layers); cblk->layers = av_calloc(codsty->nlayers, sizeof(*cblk->layers)); if (!cblk->layers) @@ -430,7 +431,7 @@ static int init_band(AVCodecContext *avctx, Jpeg2000CodingStyle *codsty, Jpeg2000QuantStyle *qntsty, int bandno, int gbandno, int reslevelno, - int cbps, int dx, int dy) + int cbps, int dx, int dy, int is_enc) { Jpeg2000Band *band = reslevel->band + bandno; uint8_t log2_band_prec_width, log2_band_prec_height; @@ -439,7 +440,7 @@ static int init_band(AVCodecContext *avctx, int nb_precincts; int i, j, ret; - init_band_stepsize(avctx, band, codsty, qntsty, bandno, gbandno, reslevelno, cbps); + init_band_stepsize(avctx, band, codsty, qntsty, bandno, gbandno, reslevelno, cbps, is_enc); /* computation of tbx_0, tbx_1, tby_0, tby_1 * see ISO/IEC 15444-1:2002 B.5 eq. B-15 and tbl B.1 @@ -493,7 +494,8 @@ static int init_band(AVCodecContext *avctx, for (precno = 0; precno < nb_precincts; precno++) { ret = init_prec(avctx, band, reslevel, comp, codsty, precno, bandno, reslevelno, - log2_band_prec_width, log2_band_prec_height); + log2_band_prec_width, log2_band_prec_height, + is_enc); if (ret < 0) return ret; } @@ -510,6 +512,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, int reslevelno, bandno, gbandno = 0, ret, i, j; uint32_t csize; size_t prod; + int is_enc = av_codec_is_encoder(avctx->codec); if (codsty->nreslevels2decode <= 0) { av_log(avctx, AV_LOG_ERROR, "nreslevels2decode %d invalid or uninitialized\n", codsty->nreslevels2decode); @@ -607,7 +610,7 @@ int ff_jpeg2000_init_component(Jpeg2000Component *comp, ret = init_band(avctx, reslevel, comp, codsty, qntsty, bandno, gbandno, reslevelno, - cbps, dx, dy); + cbps, dx, dy, is_enc); if (ret < 0) return ret; } -- 2.30.2 From patchwork Tue Jun 14 14:44:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36231 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1115782pzb; Tue, 14 Jun 2022 07:45:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyhNxRHXJbpcjUrCA5ARm1t/YyZReegIct+ERnnENsd3H6DwaxqcOyNI8MQUeDKZMRj5hjU X-Received: by 2002:a17:906:6946:b0:70e:e904:8e87 with SMTP id c6-20020a170906694600b0070ee9048e87mr4567551ejs.629.1655217900831; Tue, 14 Jun 2022 07:45:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655217900; cv=none; d=google.com; s=arc-20160816; b=N2j8G3oy3n9NOGN+KJGSBY2t1UMyeFxaZs65Inz6aSOT2Ke2an29y78xfRZ/xRHjwW LuQL8uFzY9bliaXYg0L1lnGtSA1w/qCaYj6AblwJymWrNpc7f78Mou+rzML8lY1PmXnu i4fsFUkMAixKKr+Y4D4OfN2rr7LJ2vkhyp+VBil8T+5ODGJZoWGksPYJbxKwHomE/0bn DkLveBK/B1NrSfuRqXbBASxIWflGK1w5cqQcl5rHKULmA/TRXV91JSP6BlduAdhta6uz nttadP5aamV2C8Fa2QmMmyUkX2bFwVcYzUXKhZouRQnO6MIf6eQVHzNQmllzywCa+5Hd NMEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=SeNpFLNjNkNP+oxiT8yyAkD2M1xNd5M2ccoEuBr3gZ8=; b=XZ9WjamIBuF9KF9sc2vg1KOrblCnQYNNRfYYQqKL3lwljXg35hdziF32GnLahqvMwY bKpc13mTryOAd2uPbwMiMvnjdbOIGVM9GnKURJIigycLbcKhuNh1onu0J3lEoRx0VIrI vkNObBaRZRpgrvvbqhLhW/77nzGeDQrH56ERblnCH/1Btkf7Wz5c7GQ8Ca/8wbasE2UH T+v+2g74ZYMgWUtHJ+abpKBV0ohb0rrXxbgHfpezta5gw7dOfGw6FYe2EXZBp32njLgw rUE7e/bwLV2qYWc0FQZTIwlWAKG1EMVl7UQp7FRe5fVYei7DY/ptICf8ZQXFGL/5LnJW Gn2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=nEeDTcDn; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=fr6ROuIE; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hb36-20020a170907162400b0071209f03c59si12801242ejc.630.2022.06.14.07.45.00; Tue, 14 Jun 2022 07:45:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=nEeDTcDn; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=fr6ROuIE; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B48CB68B6AE; Tue, 14 Jun 2022 17:44:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 87B2B68B687 for ; Tue, 14 Jun 2022 17:44:56 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 0C75244DCB for ; Tue, 14 Jun 2022 16:44:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217896; bh=AT+8gOIKoOXEp62pLohNRsgnlLZWgPe2Tqt5XRodzR8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=nEeDTcDniyObmWZHmklZqll0zd24p1c2G69APupL3aVlizSCGxD6z//EQRB8kCD31 q9+Zmi0Y6hGtdb3RaNsNZ2d2QGy+B5U5BJZrT2gzD6AZ1iSqhFMILUk+Om740wpdCS 9ty30N9yhFwachdUubP/1bExOwMgrkrQkOP4qX4PBx9RMS3mEQIEmmP/Fm2GUn+mWP 55JgD1K05f8NfkHAT09RTTk5aUgfZjgYVGHFUAzk97BMaX+3WGs6Uk7ctiAjj2j/xW 2bPyy6gA9DSbFQNzP1gXWA82qSoOcqTzh2SUlUOAejiIAw8BfUcIvmgmjQWYp5fSg+ KuHSzCKwY5nBw== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id 8F43144DC6 for ; Tue, 14 Jun 2022 16:44:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655217895; bh=AT+8gOIKoOXEp62pLohNRsgnlLZWgPe2Tqt5XRodzR8=; h=Subject:From:To:Date:In-Reply-To:References:From; b=fr6ROuIEiHjFqnacQ+YfWykVZVVLXIb5mpUjBb3Wv2zkPC/1dVgo0t0qQW8m4xTlh xolHfFuU//qHXWB7I7rmGLiGlJL93x+gwDHnxxFmEDVqtA37yX4yhb81I1kkvMBlJW tCw0HtZZzeH245G9yiOhU1GsGKz9fNSuLcl5hO/LDNOWrA9A7zDhEkiXBGvf8mK1wb qd3ShyFQ7Vbh5QG2BsKtYsZIQZCTQ34WU8ZJkRKmgfZYbq4CH7l1zs80U8vnVwGBxZ R1vzfk7k2Of9GuxJa6IS4Rc2XsPxWQ/FcVWX69uZx/br0etS0V9/YFyKqCv1IeW7pj rbY7+KW2Kfa/Q== Message-ID: From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:44:55 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/13] lavc/jpeg2000dec: Use coarser slicing for initial reslevels 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bxC3rvLI2OnH From 15761070d1cdc622ffbc5d6aeb0a50e063361012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 14 Jun 2022 11:19:06 +0200 Subject: [PATCH 12/13] lavc/jpeg2000dec: Use coarser slicing for initial reslevels This brings -lowres 2 lossless 4K J2K on an AMD EPYC 7R32 to 52 fps (2080% CPU). --- libavcodec/jpeg2000dec.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index a2b9f0166b..18ebe5219d 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -2679,7 +2679,16 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, for (s->reslevel = 0; s->reslevel < maxreslevels; s->reslevel++) { for (s->dir = 0; s->dir < 2; s->dir++) { + int before = s->slices; + int div = s->slices >= 96 ? 7 : 5; + + if (s->reslevel < div) { + int halve = 1<<(div - s->reslevel + (s->slices >= 96 ? 0 : 1 - s->dir)); + s->slices = (s->slices + halve-1)/halve; + } + avctx->execute2(avctx, jpeg2000_idwt, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents * s->slices); + s->slices = before; } } -- 2.30.2 From patchwork Tue Jun 14 14:47:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 36226 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1117148pzb; Tue, 14 Jun 2022 07:47:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKZ9lfhdFrh6r6DNgbIJoSlaSE4q+pAqPN/w6BxdlZCy/yoWv5609zFhPr9OgJsIBicd9v X-Received: by 2002:a05:6402:11d1:b0:433:4a09:3f49 with SMTP id j17-20020a05640211d100b004334a093f49mr6422586edw.357.1655218055036; Tue, 14 Jun 2022 07:47:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655218055; cv=none; d=google.com; s=arc-20160816; b=K34FRVf8r1bS6PASQPiwFnfZ7VA/UZtO/1Ga7AFVzAYz5lHxkfR57hEIBdDFh367dS U19+O791GNYwPTkFgwziY6aT2iDDM15IdasZRRhdBe1TjVd0vAevDVVc7rNB/maYaWVT /oC4JW1iGeIhyJjEmB1plfRNobUL3vyanYyNj7Uyol0NQU9CBLXZpxkU/BpvsuUvUSpT z3DpfkJ7zmOHT5J5pmxKw99oUOPK3zw6CgU9zgUMcvayAEE5+NP28irxpeKKGaby3dkS vK2PYrxLgKMRODzB+HQoPLF+A6GRz0iB47rd/M4pLPOXUSkk7CsL56AqmdZZ3tmrFbmV PjTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:user-agent:references:in-reply-to:date:to:from :message-id:dkim-signature:dkim-signature:delivered-to; bh=8vwC933o+gm3hn4cFTxgKWqMNxM/DANV7E82whJTaoI=; b=qvIPN7nlPqkzFRf4Uz8Sbdu0G0akH5VlkEE3eRV/d66J9kziDE48Qoe7T1i98IRurX 3Ecxv3h6isbKghxaHB7hiGZWTYvDsXYkKvQB7VL7DTW+mzsNo9p7h4nxa85IbAQrK+H4 Z+cm0IF0o4a5o3W+GdTrIXBXgJaK/Fd/mYZeZqa4O6KGU66A49YbibwI7ZpuI3YlMANT nZS49O/1iFmqBQHY0JXGQfzWCxtqA5QvUkXTGliegskuyEOJrrjRd2fUAKjN+DrU5rws CqzJSXK/kwPttjX+cbmb9pgQk26pBnlMQaRdFMvdezZ2DCfY97LRAWL0BpBa1eAxyFSO Ldxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=EpP4m9wT; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=EpP4m9wT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qw41-20020a1709066a2900b00711d8b6840esi12654673ejc.725.2022.06.14.07.47.34; Tue, 14 Jun 2022 07:47:35 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=EpP4m9wT; dkim=neutral (body hash did not verify) header.i=@acc.umu.se header.s=mail1 header.b=EpP4m9wT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=acc.umu.se Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E1C6568B62A; Tue, 14 Jun 2022 17:47:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1A2E680C0D for ; Tue, 14 Jun 2022 17:47:24 +0300 (EEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id 83A3344DCB for ; Tue, 14 Jun 2022 16:47:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655218044; bh=lfGxjlxR7swnUhrkcLAuCOe7XXtyT93bBBhy1TrtZSg=; h=Subject:From:To:Date:In-Reply-To:References:From; b=EpP4m9wTSxUjIfHQF+CNIA8BpCDQhq7HaW+rWlI478DgP5ufOObGXjkqkizxlcAOk 0W/9/SMTk4s/z0nkkK9TxvNIgvWDwzbhMfhPKZXBQLqnm24bWq9eAIpJewVFo/lkrf PuwZm49RKUzOB7D0Nne7CiJNNcSTwwhm46yUsXIm8FJ5D5WDfYlhesRKipvHwnMNv6 oiQXqN2R6OUWeloa0j7Wdm+btfvs16zLnI8RZiRppTom2nS/hJrVB5Q6mG/UVXBY// sM/OaiwMsM+5Rl6WgEqQ1BrPNQi6V10ZytvtvJtPKu6HK+SedQqaCrHWqN5Ivf+huz jJR8mi7WoJ18w== Received: from debian.lan (unknown [IPv6:2a00:66c0:a::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id E899F44DC6 for ; Tue, 14 Jun 2022 16:47:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1655218044; bh=lfGxjlxR7swnUhrkcLAuCOe7XXtyT93bBBhy1TrtZSg=; h=Subject:From:To:Date:In-Reply-To:References:From; b=EpP4m9wTSxUjIfHQF+CNIA8BpCDQhq7HaW+rWlI478DgP5ufOObGXjkqkizxlcAOk 0W/9/SMTk4s/z0nkkK9TxvNIgvWDwzbhMfhPKZXBQLqnm24bWq9eAIpJewVFo/lkrf PuwZm49RKUzOB7D0Nne7CiJNNcSTwwhm46yUsXIm8FJ5D5WDfYlhesRKipvHwnMNv6 oiQXqN2R6OUWeloa0j7Wdm+btfvs16zLnI8RZiRppTom2nS/hJrVB5Q6mG/UVXBY// sM/OaiwMsM+5Rl6WgEqQ1BrPNQi6V10ZytvtvJtPKu6HK+SedQqaCrHWqN5Ivf+huz jJR8mi7WoJ18w== Message-ID: <7b9cfcb8fe330310e5d7558d67d424d626fe6719.camel@acc.umu.se> From: Tomas =?iso-8859-1?q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Tue, 14 Jun 2022 16:47:23 +0200 In-Reply-To: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> References: <10ec51ef44325c2de6d5de7b994a9b6c8eb5e3a2.camel@acc.umu.se> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/13] lavc/jpeg2000dec: Component-level threading of write_frame() 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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NU/AHANDRkre Don't have access to the full machine to test this with 96 threads. On 2/3rds of an AMD EPYC 7R32 (-threads 64) it runs at 50 fps. Specifically the decoder uses 59.2 seconds to decode a 60.0 second clip. /Tomas From 19fc2413dc2bafff577c68830cde48e08138771e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Tue, 14 Jun 2022 15:45:32 +0200 Subject: [PATCH 13/13] lavc/jpeg2000dec: Component-level threading of write_frame() Split off MCT and don't bother with it unless the picture actually uses MCT. --- libavcodec/jpeg2000dec.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 18ebe5219d..8eaeda1c66 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -156,6 +156,7 @@ typedef struct Jpeg2000DecoderContext { // used for idwt slicing int reslevel, dir, slices; int have_dwt97_int; // 1 if any coding style is FF_DWT97_INT + int have_mct; } Jpeg2000DecoderContext; /* get_bits functions for JPEG2000 packet bitstream @@ -600,6 +601,9 @@ static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c, return AVERROR_INVALIDDATA; } + if (tmp.mct) + s->have_mct = 1; + if ((ret = get_cox(s, &tmp)) < 0) return ret; tmp.init = 1; @@ -2073,16 +2077,14 @@ static int jpeg2000_dwt97_int_postshift(AVCodecContext *avctx, void *td, #define WRITE_FRAME(D, PIXEL) \ static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \ - AVFrame * picture, int precision) \ + AVFrame * picture, int precision, int compno) \ { \ const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \ int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \ int pixelsize = planar ? 1 : pixdesc->nb_components; \ \ - int compno; \ int x, y; \ \ - for (compno = 0; compno < s->ncomponents; compno++) { \ Jpeg2000Component *comp = tile->comp + compno; \ Jpeg2000CodingStyle *codsty = tile->codsty + compno; \ PIXEL *line; \ @@ -2129,8 +2131,6 @@ static int jpeg2000_dwt97_int_postshift(AVCodecContext *avctx, void *td, } \ line += picture->linesize[plane] / sizeof(PIXEL); \ } \ - } \ - \ } WRITE_FRAME(8, uint8_t) @@ -2138,26 +2138,36 @@ WRITE_FRAME(16, uint16_t) #undef WRITE_FRAME -static int jpeg2000_mct_write_frame(AVCodecContext *avctx, void *td, - int jobnr, int threadnr) +static int jpeg2000_mct(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) { Jpeg2000DecoderContext *s = avctx->priv_data; - AVFrame *picture = td; Jpeg2000Tile *tile = s->tile + jobnr; /* inverse MCT transformation */ if (tile->codsty[0].mct) mct_decode(s, tile); + return 0; +} + +static int jpeg2000_write_frame(AVCodecContext *avctx, void *td, + int jobnr, int threadnr) +{ + Jpeg2000DecoderContext *s = avctx->priv_data; + AVFrame *picture = td; + Jpeg2000Tile *tile = s->tile + jobnr / s->ncomponents; + int compno = jobnr % s->ncomponents; + if (s->precision <= 8) { - write_frame_8(s, tile, picture, 8); + write_frame_8(s, tile, picture, 8, compno); } else { int precision = picture->format == AV_PIX_FMT_XYZ12 || picture->format == AV_PIX_FMT_RGB48 || picture->format == AV_PIX_FMT_RGBA64 || picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision; - write_frame_16(s, tile, picture, precision); + write_frame_16(s, tile, picture, precision, compno); } return 0; @@ -2695,7 +2705,10 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture, if (s->have_dwt97_int) avctx->execute2(avctx, jpeg2000_dwt97_int_postshift, NULL, NULL, s->numXtiles * s->numYtiles * s->ncomponents * s->slices); - avctx->execute2(avctx, jpeg2000_mct_write_frame, picture, NULL, s->numXtiles * s->numYtiles); + if (s->have_mct) + avctx->execute2(avctx, jpeg2000_mct, NULL, NULL, s->numXtiles * s->numYtiles); + + avctx->execute2(avctx, jpeg2000_write_frame, picture, NULL, s->numXtiles * s->numYtiles * s->ncomponents); jpeg2000_dec_cleanup(s, 0); -- 2.30.2