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