From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 994204E2D0 for ; Mon, 10 Mar 2025 17:48:41 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 70BC968E20B; Mon, 10 Mar 2025 19:48:37 +0200 (EET) Received: from vidala.pars.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B213968E136 for ; Mon, 10 Mar 2025 19:48:30 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; s=202405r; d=lynne.ee; c=relaxed/relaxed; h=From:To:Subject:Date:Message-ID; t=1741628910; bh=3t8ByeXWC/Di1lTp+vaDG+U wTKc+umTunRlFhp17CIg=; b=l3gtDkcVtZbA6+HvChD9NA5yzskhb8FP0f4KU0R97ptvxBIs2n OFTQRVHlhto8dp42FrqcRXyagV4yrWqt4bQ8S39qtOXtIsdjMOuBpqYHbI4VEbIBdSWl5sdgeA4 jd/bxtf3pId+G83zcB+3/2i2IZkuVwETm1HM+2Ws8exwD+bp+rCDpDiZrRTv3Blf8XiTAIcqO/V fjx/GSrkrTohtJd11kyW2L9p9senuNl0CpG/xeYIdn0PMPU2jPZW0A6HoL6c/FwNm5Bo6L17HF0 +T6a8lZWbODEYo8mf1Gl2+es3sGngWZoR3mSk6Yp/aYpwaVJocmlZisjHTazU36GuuA==; DKIM-Signature: v=1; a=ed25519-sha256; s=202405e; d=lynne.ee; c=relaxed/relaxed; h=From:To:Subject:Date:Message-ID; t=1741628910; bh=3t8ByeXWC/Di1lTp+vaDG+U wTKc+umTunRlFhp17CIg=; b=dFzk9QtgEMd+ecZ556IBLDeOVKbSy61hpjP5TV7VdlHo3761I5 3Yrt9w0peQtHgJ5ozy11NqcY92cOP5nikUCQ==; Message-ID: Date: Mon, 10 Mar 2025 18:48:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Beta To: ffmpeg-devel@ffmpeg.org References: <20250310004552.2980855-1-michael@niedermayer.cc> Content-Language: en-US From: Lynne Autocrypt: addr=dev@lynne.ee; keydata= xjMEXnFG3BYJKwYBBAHaRw8BAQdA3FyJpqEdfQj4GA7OUWVrNheT9dUsIs+yUx6Hljr9mYvN FEx5bm5lIDxkZXZAbHlubmUuZWU+wpAEExYIADgWIQT+UBOcaAVyyv1SH42i/qXwPwNEZAUC XnFG3AIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCi/qXwPwNEZOTWAQCSNEA+kZLI NZ2dsR5Qg988c0HXpOXThZEjg+h1TL7KGgEA3Gff0c28efI02S6iMxazrpdWGHqHk7JN7pCj nt397wzOOARecUbcEgorBgEEAZdVAQUBAQdAjDdFQ5H+AJ9vwXrOb7val460g45EsheIaL5S 7/zSaX8DAQgHwngEGBYIACAWIQT+UBOcaAVyyv1SH42i/qXwPwNEZAUCXnFG3AIbDAAKCRCi /qXwPwNEZKaxAQCHLV4gAk/B9JvRG27MYm22X3+5QRCLBtEILP29aDh+MQD/V8JFHATDXRY3 0LsmqR3sPQ0BJ1UFVZA5BUoIJPJZWwg= In-Reply-To: <20250310004552.2980855-1-michael@niedermayer.cc> Subject: Re: [FFmpeg-devel] [PATCH] ffv1: implement remap for encode/decode_plane() 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 10/03/2025 01:45, Michael Niedermayer wrote: > Sponsored-by: Sovereign Tech Fund > Signed-off-by: Michael Niedermayer > --- > libavcodec/ffv1dec.c | 20 ++++++++----- > libavcodec/ffv1enc.c | 67 ++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 71 insertions(+), 16 deletions(-) > > diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c > index 9738e4e9c9f..72c93fcf0cd 100644 > --- a/libavcodec/ffv1dec.c > +++ b/libavcodec/ffv1dec.c > @@ -92,7 +92,7 @@ static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac) > static int decode_plane(FFV1Context *f, FFV1SliceContext *sc, > GetBitContext *gb, > uint8_t *src, int w, int h, int stride, int plane_index, > - int pixel_stride, int ac) > + int remap_index, int pixel_stride, int ac) > { > int x, y; > int16_t *sample[2]; > @@ -116,12 +116,18 @@ static int decode_plane(FFV1Context *f, FFV1SliceContext *sc, > int ret = decode_line(f, sc, gb, w, sample, plane_index, 8, ac); > if (ret < 0) > return ret; > + if (sc->remap) > + for (x = 0; x < w; x++) > + sample[1][x] = sc->fltmap[remap_index][sample[1][x]]; > for (x = 0; x < w; x++) > src[x*pixel_stride + stride * y] = sample[1][x]; > } else { > int ret = decode_line(f, sc, gb, w, sample, plane_index, f->avctx->bits_per_raw_sample, ac); > if (ret < 0) > return ret; > + if (sc->remap) > + for (x = 0; x < w; x++) > + sample[1][x] = sc->fltmap[remap_index][sample[1][x]]; > if (f->packed_at_lsb) { > for (x = 0; x < w; x++) { > ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x]; > @@ -347,17 +353,17 @@ static int decode_slice(AVCodecContext *c, void *arg) > if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) { > const int cx = x >> f->chroma_h_shift; > const int cy = y >> f->chroma_v_shift; > - decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1, ac); > + decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac); > > if (f->chroma_planes) { > - decode_plane(f, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, ac); > - decode_plane(f, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1, ac); > + decode_plane(f, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, 1, ac); > + decode_plane(f, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 2, 1, ac); > } > if (f->transparency) > - decode_plane(f, sc, &gb, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2, 1, ac); > + decode_plane(f, sc, &gb, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2, 2, 1, ac); > } else if (f->colorspace == 0) { > - decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 2, ac); > - decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] + 1, width, height, p->linesize[0], 1, 2, ac); > + decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 0, 2, ac); > + decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] + 1, width, height, p->linesize[0], 1, 1, 2, ac); > } else if (f->use32bit) { > uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0], > p->data[1] + ps * x + y * p->linesize[1], > diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c > index f3041219b71..4c55c01263b 100644 > --- a/libavcodec/ffv1enc.c > +++ b/libavcodec/ffv1enc.c > @@ -272,7 +272,7 @@ static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state, > > static int encode_plane(FFV1Context *f, FFV1SliceContext *sc, > const uint8_t *src, int w, int h, > - int stride, int plane_index, int pixel_stride, int ac) > + int stride, int plane_index, int remap_index, int pixel_stride, int ac) > { > int x, y, i, ret; > const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1); > @@ -288,9 +288,14 @@ static int encode_plane(FFV1Context *f, FFV1SliceContext *sc, > > sample[0][-1]= sample[1][0 ]; > sample[1][ w]= sample[1][w-1]; > + > if (f->bits_per_raw_sample <= 8) { > for (x = 0; x < w; x++) > sample[0][x] = src[x * pixel_stride + stride * y]; > + if (sc->remap) > + for (x = 0; x < w; x++) > + sample[0][x] = sc->fltmap[remap_index][ sample[0][x] ]; > + > if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, 8, ac, pass1)) < 0) > return ret; > } else { > @@ -303,6 +308,10 @@ static int encode_plane(FFV1Context *f, FFV1SliceContext *sc, > sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - f->bits_per_raw_sample); > } > } > + if (sc->remap) > + for (x = 0; x < w; x++) > + sample[0][x] = sc->fltmap[remap_index][ sample[0][x] ]; > + > if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, f->bits_per_raw_sample, ac, pass1)) < 0) > return ret; > } > @@ -310,6 +319,30 @@ static int encode_plane(FFV1Context *f, FFV1SliceContext *sc, > return 0; > } > > +static void load_plane(FFV1Context *f, FFV1SliceContext *sc, > + const uint8_t *src, int w, int h, > + int stride, int remap_index, int pixel_stride) > +{ > + int x, y; > + > + memset(sc->fltmap[remap_index], 0, sizeof(sc->fltmap[remap_index])); > + > + for (y = 0; y < h; y++) { > + if (f->bits_per_raw_sample <= 8) { > + for (x = 0; x < w; x++) > + sc->fltmap[remap_index][ src[x * pixel_stride + stride * y] ] = 1; > + } else { > + if (f->packed_at_lsb) { > + for (x = 0; x < w; x++) > + sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x] ] = 1; > + } else { > + for (x = 0; x < w; x++) > + sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x] >> (16 - f->bits_per_raw_sample) ] = 1; > + } > + } > + } > +} > + > static void write_quant_table(RangeCoder *c, int16_t *quant_table) > { > int last = 0; > @@ -1178,8 +1211,24 @@ retry: > } > > if (sc->remap) { > - if (f->colorspace == 0) { > - av_assert0(0); > + if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8) { > + const int cx = x >> f->chroma_h_shift; > + const int cy = y >> f->chroma_v_shift; > + > + //TODO decide on the order for the encoded remaps and loads. with golomb rice it > + // easier to have all range coded ones together, otherwise it may be nicer to handle each plane as a whole? > + > + load_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1); > + > + if (f->chroma_planes) { > + load_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1); > + load_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 2, 1); > + } > + if (f->transparency) > + load_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 3, 1); > + } else if (c->pix_fmt == AV_PIX_FMT_YA8) { > + load_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2); > + load_plane(f, sc, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2); > } else if (f->use32bit) { > load_rgb_frame32(f, sc, planes, width, height, p->linesize); > } else > @@ -1206,17 +1255,17 @@ retry: > const int cx = x >> f->chroma_h_shift; > const int cy = y >> f->chroma_v_shift; > > - ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1, ac); > + ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac); > > if (f->chroma_planes) { > - ret |= encode_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, ac); > - ret |= encode_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1, ac); > + ret |= encode_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, 1, ac); > + ret |= encode_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 2, 1, ac); > } > if (f->transparency) > - ret |= encode_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1, ac); > + ret |= encode_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 3, 1, ac); > } else if (c->pix_fmt == AV_PIX_FMT_YA8) { > - ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2, ac); > - ret |= encode_plane(f, sc, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2, ac); > + ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 2, ac); > + ret |= encode_plane(f, sc, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 1, 2, ac); > } else if (f->use32bit) { > ret = encode_rgb_frame32(f, sc, planes, width, height, p->linesize, ac); > } else { Doesn't apply properly. What does it even do? Does the current git master not already do this? _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".