Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1enc: add space for the remap table to max_size
@ 2025-03-09 22:58 Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames Michael Niedermayer
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-09 22:58 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1enc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index b4080f29002..7c73ff12c2f 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -1211,7 +1211,8 @@ size_t ff_ffv1_encode_buffer_size(AVCodecContext *avctx)
     size_t maxsize = avctx->width*avctx->height * (1 + f->transparency);
     if (f->chroma_planes)
         maxsize += AV_CEIL_RSHIFT(avctx->width, f->chroma_h_shift) * AV_CEIL_RSHIFT(f->height, f->chroma_v_shift) * 2;
-    maxsize += f->slice_count * 800; //for slice header
+    maxsize += f->slice_count * 800; //for slice header and
+    maxsize += f->slice_count * 9000 * !!f->flt; //remap table
     if (f->version > 3) {
         maxsize *= f->bits_per_raw_sample + 1;
     } else {
-- 
2.48.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames
  2025-03-09 22:58 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1enc: add space for the remap table to max_size Michael Niedermayer
@ 2025-03-09 22:58 ` Michael Niedermayer
  2025-03-11  0:53   ` Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error Michael Niedermayer
  2 siblings, 1 reply; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-09 22:58 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1enc.c          |  4 ++--
 libavcodec/ffv1enc_template.c | 37 +++++++++++++++++++++++++++++++++--
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 7c73ff12c2f..11753386724 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -1176,9 +1176,9 @@ retry:
         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);
     } else if (f->use32bit) {
-        ret = encode_rgb_frame32(f, sc, planes, width, height, p->linesize);
+        ret = encode_rgb_frame32(f, sc, planes, width, height, p->linesize, ac);
     } else {
-        ret = encode_rgb_frame(f, sc, planes, width, height, p->linesize);
+        ret = encode_rgb_frame(f, sc, planes, width, height, p->linesize, ac);
     }
 
     if (ac != AC_GOLOMB_RICE) {
diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
index 9e1252010dd..8cc8876411b 100644
--- a/libavcodec/ffv1enc_template.c
+++ b/libavcodec/ffv1enc_template.c
@@ -143,14 +143,47 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
     return 0;
 }
 
+static void RENAME(load_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
+                                  const uint8_t *src[4],
+                                  int w, int h, const int stride[4])
+{
+    int x, y;
+    int transparency = f->transparency;
+
+    memset(sc->fltmap, 0, sizeof(sc->fltmap));
+
+    for (y = 0; y < h; y++) {
+        for (x = 0; x < w; x++) {
+            int b, g, r, av_uninit(a);
+
+            if (sizeof(TYPE) == 4 || transparency) {
+                g = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
+                b = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
+                r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
+                if (transparency)
+                    a = *((const uint16_t *)(src[3] + x*2 + stride[3]*y));
+            } else {
+                b = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
+                g = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
+                r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
+            }
+
+            sc->fltmap[0][r] = 1;
+            sc->fltmap[1][g] = 1;
+            sc->fltmap[2][b] = 1;
+            if (transparency)
+                sc->fltmap[3][a] = 1;
+        }
+    }
+}
+
 static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
                                     const uint8_t *src[4],
-                                    int w, int h, const int stride[4])
+                                    int w, int h, const int stride[4], int ac)
 {
     int x, y, p, i;
     const int ring_size = f->context_model ? 3 : 2;
     TYPE *sample[4][3];
-    const int ac = f->ac;
     const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
     int lbd    = f->bits_per_raw_sample <= 8;
     int packed = !src[1];
-- 
2.48.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice
  2025-03-09 22:58 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1enc: add space for the remap table to max_size Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames Michael Niedermayer
@ 2025-03-09 22:58 ` Michael Niedermayer
  2025-03-10 18:41   ` Lynne
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error Michael Niedermayer
  2 siblings, 1 reply; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-09 22:58 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1dec.c          | 37 +++++++++++++++++++++++++
 libavcodec/ffv1dec_template.c | 27 ------------------
 libavcodec/ffv1enc.c          | 42 ++++++++++++++++++++++++++++
 libavcodec/ffv1enc_template.c | 52 -----------------------------------
 4 files changed, 79 insertions(+), 79 deletions(-)

diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index 49a363208db..9738e4e9c9f 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -244,6 +244,37 @@ static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
         f->frame_damaged = 1;
 }
 
+static int decode_remap(FFV1Context *f, FFV1SliceContext *sc)
+{
+    int transparency = f->transparency;
+
+    for (int p= 0; p<3 + transparency; p++) {
+        int j = 0;
+        int lu = 0;
+        uint8_t state[2][32];
+        memset(state, 128, sizeof(state));
+
+        for (int i= 0; i<65536; i++) {
+            int run = get_symbol_inline(&sc->c, state[lu], 0);
+            if (run > 65536U - i)
+                return AVERROR_INVALIDDATA;
+            if (lu) {
+                lu ^= !run;
+                while (run--) {
+                    sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
+                    i++;
+                }
+            } else {
+                i += run;
+                if (i != 65536)
+                    sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
+                lu ^= !run;
+            }
+        }
+    }
+    return 0;
+}
+
 static int decode_slice(AVCodecContext *c, void *arg)
 {
     FFV1Context *f    = c->priv_data;
@@ -289,6 +320,12 @@ static int decode_slice(AVCodecContext *c, void *arg)
     chroma_width  = AV_CEIL_RSHIFT(width,  f->chroma_h_shift);
     chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
 
+    if (sc->remap) {
+        ret = decode_remap(f, sc);
+        if (ret < 0)
+            return ret;
+    }
+
     if (ac == AC_GOLOMB_RICE) {
         if (f->combined_version >= 0x30002)
             get_rac(&sc->c, (uint8_t[]) { 129 });
diff --git a/libavcodec/ffv1dec_template.c b/libavcodec/ffv1dec_template.c
index 818f12f865d..f9499931b1d 100644
--- a/libavcodec/ffv1dec_template.c
+++ b/libavcodec/ffv1dec_template.c
@@ -167,33 +167,6 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
 
     memset(RENAME(sc->sample_buffer), 0, 8 * (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
 
-    if (sc->remap) {
-        for (int p= 0; p<3 + transparency; p++) {
-            int j = 0;
-            int lu = 0;
-            uint8_t state[2][32];
-            memset(state, 128, sizeof(state));
-
-            for (int i= 0; i<65536; i++) {
-                int run = get_symbol_inline(&sc->c, state[lu], 0);
-                if (run > 65536U - i)
-                    return AVERROR_INVALIDDATA;
-                if (lu) {
-                    lu ^= !run;
-                    while (run--) {
-                        sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
-                        i++;
-                    }
-                } else {
-                    i += run;
-                    if (i != 65536)
-                        sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
-                    lu ^= !run;
-                }
-            }
-        }
-    }
-
     for (y = 0; y < h; y++) {
         for (p = 0; p < 3 + transparency; p++) {
             int ret;
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 11753386724..f3041219b71 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -1110,6 +1110,36 @@ static void choose_rct_params(const FFV1Context *f, FFV1SliceContext *sc,
     sc->slice_rct_ry_coef = rct_y_coeff[best][0];
 }
 
+static void encode_remap(FFV1Context *f, FFV1SliceContext *sc)
+{
+    int transparency = f->transparency;
+
+    for (int p= 0; p<3 + transparency; p++) {
+        int j = 0;
+        int lu = 0;
+        uint8_t state[2][32];
+        int run = 0;
+        memset(state, 128, sizeof(state));
+        for (int i= 0; i<65536; i++) {
+            int ri = i ^ ((i&0x8000) ? 0 : 0x7FFF);
+            int u = sc->fltmap[p][ri];
+            sc->fltmap[p][ri] = j;
+            j+= u;
+
+            if (lu == u) {
+                run ++;
+            } else {
+                put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
+                if (run == 0)
+                    lu = u;
+                run = 0;
+            }
+        }
+        if (run)
+            put_symbol(&sc->c, state[lu], run, 0);
+    }
+}
+
 static int encode_slice(AVCodecContext *c, void *arg)
 {
     FFV1SliceContext *sc = arg;
@@ -1146,6 +1176,18 @@ retry:
     if (f->version > 2) {
         encode_slice_header(f, sc);
     }
+
+    if (sc->remap) {
+        if (f->colorspace == 0) {
+            av_assert0(0);
+        } else if (f->use32bit) {
+            load_rgb_frame32(f, sc, planes, width, height, p->linesize);
+        } else
+            load_rgb_frame  (f, sc, planes, width, height, p->linesize);
+
+        encode_remap(f, sc);
+    }
+
     if (ac == AC_GOLOMB_RICE) {
         sc->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&sc->c, f->version > 2) : 0;
         init_put_bits(&sc->pb,
diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
index 8cc8876411b..d8160282b2e 100644
--- a/libavcodec/ffv1enc_template.c
+++ b/libavcodec/ffv1enc_template.c
@@ -197,58 +197,6 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
     memset(RENAME(sc->sample_buffer), 0, ring_size * MAX_PLANES *
            (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
 
-    if (sc->remap) {
-        memset(sc->fltmap, 0, sizeof(sc->fltmap));
-
-        for (y = 0; y < h; y++) {
-            for (x = 0; x < w; x++) {
-                int b, g, r, av_uninit(a);
-
-                if (sizeof(TYPE) == 4 || transparency) {
-                    g = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
-                    b = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
-                    r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
-                    if (transparency)
-                        a = *((const uint16_t *)(src[3] + x*2 + stride[3]*y));
-                } else {
-                    b = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
-                    g = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
-                    r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
-                }
-
-                sc->fltmap[0][r] = 1;
-                sc->fltmap[1][g] = 1;
-                sc->fltmap[2][b] = 1;
-                if (transparency)
-                    sc->fltmap[3][a] = 1;
-            }
-        }
-        for (int p= 0; p<3 + transparency; p++) {
-            int j = 0;
-            int lu = 0;
-            uint8_t state[2][32];
-            int run = 0;
-            memset(state, 128, sizeof(state));
-            for (int i= 0; i<65536; i++) {
-                int ri = i ^ ((i&0x8000) ? 0 : 0x7FFF);
-                int u = sc->fltmap[p][ri];
-                sc->fltmap[p][ri] = j;
-                j+= u;
-
-                if (lu == u) {
-                    run ++;
-                } else {
-                    put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
-                    if (run == 0)
-                        lu = u;
-                    run = 0;
-                }
-            }
-            if (run)
-                put_symbol(&sc->c, state[lu], run, 0);
-        }
-    }
-
     for (y = 0; y < h; y++) {
         for (i = 0; i < ring_size; i++)
             for (p = 0; p < MAX_PLANES; p++)
-- 
2.48.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error
  2025-03-09 22:58 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1enc: add space for the remap table to max_size Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames Michael Niedermayer
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice Michael Niedermayer
@ 2025-03-09 22:58 ` Michael Niedermayer
  2025-03-11  0:54   ` Michael Niedermayer
  2 siblings, 1 reply; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-09 22:58 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1enc_template.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
index d8160282b2e..8b2d938770f 100644
--- a/libavcodec/ffv1enc_template.c
+++ b/libavcodec/ffv1enc_template.c
@@ -39,12 +39,12 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
 
     if (ac != AC_GOLOMB_RICE) {
         if (c->bytestream_end - c->bytestream < w * 35) {
-            av_log(logctx, AV_LOG_ERROR, "encoded frame too large\n");
+            av_log(logctx, AV_LOG_ERROR, "encoded Range Coder frame too large\n");
             return AVERROR_INVALIDDATA;
         }
     } else {
         if (put_bytes_left(&sc->pb, 0) < w * 4) {
-            av_log(logctx, AV_LOG_ERROR, "encoded frame too large\n");
+            av_log(logctx, AV_LOG_ERROR, "encoded Golomb Rice frame too large\n");
             return AVERROR_INVALIDDATA;
         }
     }
-- 
2.48.1

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice Michael Niedermayer
@ 2025-03-10 18:41   ` Lynne
  2025-03-11  0:52     ` Michael Niedermayer
  0 siblings, 1 reply; 8+ messages in thread
From: Lynne @ 2025-03-10 18:41 UTC (permalink / raw)
  To: ffmpeg-devel

On 09/03/2025 23:58, Michael Niedermayer wrote:
> Sponsored-by: Sovereign Tech Fund
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>   libavcodec/ffv1dec.c          | 37 +++++++++++++++++++++++++
>   libavcodec/ffv1dec_template.c | 27 ------------------
>   libavcodec/ffv1enc.c          | 42 ++++++++++++++++++++++++++++
>   libavcodec/ffv1enc_template.c | 52 -----------------------------------
>   4 files changed, 79 insertions(+), 79 deletions(-)
> 
> diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
> index 49a363208db..9738e4e9c9f 100644
> --- a/libavcodec/ffv1dec.c
> +++ b/libavcodec/ffv1dec.c
> @@ -244,6 +244,37 @@ static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
>           f->frame_damaged = 1;
>   }
>   
> +static int decode_remap(FFV1Context *f, FFV1SliceContext *sc)
> +{
> +    int transparency = f->transparency;
> +
> +    for (int p= 0; p<3 + transparency; p++) {
> +        int j = 0;
> +        int lu = 0;
> +        uint8_t state[2][32];
> +        memset(state, 128, sizeof(state));
> +
> +        for (int i= 0; i<65536; i++) {
> +            int run = get_symbol_inline(&sc->c, state[lu], 0);
> +            if (run > 65536U - i)
> +                return AVERROR_INVALIDDATA;
> +            if (lu) {
> +                lu ^= !run;
> +                while (run--) {
> +                    sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> +                    i++;
> +                }
> +            } else {
> +                i += run;
> +                if (i != 65536)
> +                    sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> +                lu ^= !run;
> +            }
> +        }
> +    }
> +    return 0;
> +}
> +
>   static int decode_slice(AVCodecContext *c, void *arg)
>   {
>       FFV1Context *f    = c->priv_data;
> @@ -289,6 +320,12 @@ static int decode_slice(AVCodecContext *c, void *arg)
>       chroma_width  = AV_CEIL_RSHIFT(width,  f->chroma_h_shift);
>       chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
>   
> +    if (sc->remap) {
> +        ret = decode_remap(f, sc);
> +        if (ret < 0)
> +            return ret;
> +    }
> +
>       if (ac == AC_GOLOMB_RICE) {
>           if (f->combined_version >= 0x30002)
>               get_rac(&sc->c, (uint8_t[]) { 129 });
> diff --git a/libavcodec/ffv1dec_template.c b/libavcodec/ffv1dec_template.c
> index 818f12f865d..f9499931b1d 100644
> --- a/libavcodec/ffv1dec_template.c
> +++ b/libavcodec/ffv1dec_template.c
> @@ -167,33 +167,6 @@ static int RENAME(decode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
>   
>       memset(RENAME(sc->sample_buffer), 0, 8 * (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
>   
> -    if (sc->remap) {
> -        for (int p= 0; p<3 + transparency; p++) {
> -            int j = 0;
> -            int lu = 0;
> -            uint8_t state[2][32];
> -            memset(state, 128, sizeof(state));
> -
> -            for (int i= 0; i<65536; i++) {
> -                int run = get_symbol_inline(&sc->c, state[lu], 0);
> -                if (run > 65536U - i)
> -                    return AVERROR_INVALIDDATA;
> -                if (lu) {
> -                    lu ^= !run;
> -                    while (run--) {
> -                        sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> -                        i++;
> -                    }
> -                } else {
> -                    i += run;
> -                    if (i != 65536)
> -                        sc->fltmap[p][j++] = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> -                    lu ^= !run;
> -                }
> -            }
> -        }
> -    }
> -
>       for (y = 0; y < h; y++) {
>           for (p = 0; p < 3 + transparency; p++) {
>               int ret;
> diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
> index 11753386724..f3041219b71 100644
> --- a/libavcodec/ffv1enc.c
> +++ b/libavcodec/ffv1enc.c
> @@ -1110,6 +1110,36 @@ static void choose_rct_params(const FFV1Context *f, FFV1SliceContext *sc,
>       sc->slice_rct_ry_coef = rct_y_coeff[best][0];
>   }
>   
> +static void encode_remap(FFV1Context *f, FFV1SliceContext *sc)
> +{
> +    int transparency = f->transparency;
> +
> +    for (int p= 0; p<3 + transparency; p++) {
> +        int j = 0;
> +        int lu = 0;
> +        uint8_t state[2][32];
> +        int run = 0;
> +        memset(state, 128, sizeof(state));
> +        for (int i= 0; i<65536; i++) {
> +            int ri = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> +            int u = sc->fltmap[p][ri];
> +            sc->fltmap[p][ri] = j;
> +            j+= u;
> +
> +            if (lu == u) {
> +                run ++;
> +            } else {
> +                put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
> +                if (run == 0)
> +                    lu = u;
> +                run = 0;
> +            }
> +        }
> +        if (run)
> +            put_symbol(&sc->c, state[lu], run, 0);
> +    }
> +}
> +
>   static int encode_slice(AVCodecContext *c, void *arg)
>   {
>       FFV1SliceContext *sc = arg;
> @@ -1146,6 +1176,18 @@ retry:
>       if (f->version > 2) {
>           encode_slice_header(f, sc);
>       }
> +
> +    if (sc->remap) {
> +        if (f->colorspace == 0) {
> +            av_assert0(0);
> +        } else if (f->use32bit) {
> +            load_rgb_frame32(f, sc, planes, width, height, p->linesize);
> +        } else
> +            load_rgb_frame  (f, sc, planes, width, height, p->linesize);
> +
> +        encode_remap(f, sc);
> +    }
> +
>       if (ac == AC_GOLOMB_RICE) {
>           sc->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&sc->c, f->version > 2) : 0;
>           init_put_bits(&sc->pb,
> diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
> index 8cc8876411b..d8160282b2e 100644
> --- a/libavcodec/ffv1enc_template.c
> +++ b/libavcodec/ffv1enc_template.c
> @@ -197,58 +197,6 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
>       memset(RENAME(sc->sample_buffer), 0, ring_size * MAX_PLANES *
>              (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
>   
> -    if (sc->remap) {
> -        memset(sc->fltmap, 0, sizeof(sc->fltmap));
> -
> -        for (y = 0; y < h; y++) {
> -            for (x = 0; x < w; x++) {
> -                int b, g, r, av_uninit(a);
> -
> -                if (sizeof(TYPE) == 4 || transparency) {
> -                    g = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
> -                    b = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
> -                    r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
> -                    if (transparency)
> -                        a = *((const uint16_t *)(src[3] + x*2 + stride[3]*y));
> -                } else {
> -                    b = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
> -                    g = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
> -                    r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
> -                }
> -
> -                sc->fltmap[0][r] = 1;
> -                sc->fltmap[1][g] = 1;
> -                sc->fltmap[2][b] = 1;
> -                if (transparency)
> -                    sc->fltmap[3][a] = 1;
> -            }
> -        }
> -        for (int p= 0; p<3 + transparency; p++) {
> -            int j = 0;
> -            int lu = 0;
> -            uint8_t state[2][32];
> -            int run = 0;
> -            memset(state, 128, sizeof(state));
> -            for (int i= 0; i<65536; i++) {
> -                int ri = i ^ ((i&0x8000) ? 0 : 0x7FFF);
> -                int u = sc->fltmap[p][ri];
> -                sc->fltmap[p][ri] = j;
> -                j+= u;
> -
> -                if (lu == u) {
> -                    run ++;
> -                } else {
> -                    put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
> -                    if (run == 0)
> -                        lu = u;
> -                    run = 0;
> -                }
> -            }
> -            if (run)
> -                put_symbol(&sc->c, state[lu], run, 0);
> -        }
> -    }
> -
>       for (y = 0; y < h; y++) {
>           for (i = 0; i < ring_size; i++)
>               for (p = 0; p < MAX_PLANES; p++)

That's a lot better and cleaner than the current code.
LGTM.
_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice
  2025-03-10 18:41   ` Lynne
@ 2025-03-11  0:52     ` Michael Niedermayer
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-11  0:52 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 1243 bytes --]

On Mon, Mar 10, 2025 at 07:41:26PM +0100, Lynne wrote:
> On 09/03/2025 23:58, Michael Niedermayer wrote:
> > Sponsored-by: Sovereign Tech Fund
> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> > ---
> >   libavcodec/ffv1dec.c          | 37 +++++++++++++++++++++++++
> >   libavcodec/ffv1dec_template.c | 27 ------------------
> >   libavcodec/ffv1enc.c          | 42 ++++++++++++++++++++++++++++
> >   libavcodec/ffv1enc_template.c | 52 -----------------------------------
> >   4 files changed, 79 insertions(+), 79 deletions(-)
> > 
> > diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
> > index 49a363208db..9738e4e9c9f 100644
> > --- a/libavcodec/ffv1dec.c
> > +++ b/libavcodec/ffv1dec.c
[...]
>
> That's a lot better and cleaner than the current code.
> LGTM.

will apply (with one hunk moved to the correct patch)

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If you drop bombs on a foreign country and kill a hundred thousand
innocent people, expect your government to call the consequence
"unprovoked inhuman terrorist attacks" and use it to justify dropping
more bombs and killing more people. The technology changed, the idea is old.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames Michael Niedermayer
@ 2025-03-11  0:53   ` Michael Niedermayer
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-11  0:53 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 537 bytes --]

On Sun, Mar 09, 2025 at 11:58:04PM +0100, Michael Niedermayer wrote:
> Sponsored-by: Sovereign Tech Fund
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/ffv1enc.c          |  4 ++--
>  libavcodec/ffv1enc_template.c | 37 +++++++++++++++++++++++++++++++++--
>  2 files changed, 37 insertions(+), 4 deletions(-)

will apply

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The worst form of inequality is to try to make unequal things equal.
-- Aristotle

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error
  2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error Michael Niedermayer
@ 2025-03-11  0:54   ` Michael Niedermayer
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Niedermayer @ 2025-03-11  0:54 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 1323 bytes --]

On Sun, Mar 09, 2025 at 11:58:06PM +0100, Michael Niedermayer wrote:
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/ffv1enc_template.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
> index d8160282b2e..8b2d938770f 100644
> --- a/libavcodec/ffv1enc_template.c
> +++ b/libavcodec/ffv1enc_template.c
> @@ -39,12 +39,12 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
>  
>      if (ac != AC_GOLOMB_RICE) {
>          if (c->bytestream_end - c->bytestream < w * 35) {
> -            av_log(logctx, AV_LOG_ERROR, "encoded frame too large\n");
> +            av_log(logctx, AV_LOG_ERROR, "encoded Range Coder frame too large\n");
>              return AVERROR_INVALIDDATA;
>          }
>      } else {
>          if (put_bytes_left(&sc->pb, 0) < w * 4) {
> -            av_log(logctx, AV_LOG_ERROR, "encoded frame too large\n");
> +            av_log(logctx, AV_LOG_ERROR, "encoded Golomb Rice frame too large\n");
>              return AVERROR_INVALIDDATA;

will apply, this just disambiguates 2 messages

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Avoid a single point of failure, be that a person or equipment.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-03-11  0:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-09 22:58 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1enc: add space for the remap table to max_size Michael Niedermayer
2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: Fix slice coding mode 1 with rgb frames Michael Niedermayer
2025-03-11  0:53   ` Michael Niedermayer
2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Fix remap and float with golomb rice Michael Niedermayer
2025-03-10 18:41   ` Lynne
2025-03-11  0:52     ` Michael Niedermayer
2025-03-09 22:58 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error Michael Niedermayer
2025-03-11  0:54   ` Michael Niedermayer

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git