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/ffv1: simplify version checks with combined_version
@ 2025-01-18  4:59 Michael Niedermayer
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version Michael Niedermayer
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-18  4:59 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

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

diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index 927763e24d4..f303ed769f0 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -130,7 +130,7 @@ int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, in
     int mpw = 1<<chroma_shift;
     int awidth = FFALIGN(width, mpw);
 
-    if (f->version < 4 || f->version == 4 && f->micro_version < 3)
+    if (f->combined_version <= 0x40002)
         return width * sx / num_h_slices;
 
     sx = (2LL * awidth * sx + num_h_slices * mpw) / (2 * num_h_slices * mpw) * mpw;
diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
index ca03fd2b109..576769ae1e0 100644
--- a/libavcodec/ffv1.h
+++ b/libavcodec/ffv1.h
@@ -113,6 +113,7 @@ typedef struct FFV1Context {
     uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
     int version;
     int micro_version;
+    int combined_version;
     int width, height;
     int chroma_planes;
     int chroma_h_shift, chroma_v_shift;
diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index 78458158735..5aec6cdce26 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -306,7 +306,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
     y      = sc->slice_y;
 
     if (ac == AC_GOLOMB_RICE) {
-        if (f->version == 3 && f->micro_version > 1 || f->version > 3)
+        if (f->combined_version >= 0x30002)
             get_rac(&sc->c, (uint8_t[]) { 129 });
         sc->ac_byte_count = f->version > 2 || (!x && !y) ? sc->c.bytestream - sc->c.bytestream_start - 1 : 0;
         init_get_bits(&gb,
@@ -432,11 +432,13 @@ static int read_extra_header(FFV1Context *f)
             f->version);
         return AVERROR_PATCHWELCOME;
     }
+    f->combined_version = f->version << 16;
     if (f->version > 2) {
         c.bytestream_end -= 4;
         f->micro_version = get_symbol(&c, state, 0);
-        if (f->micro_version < 0)
+        if (f->micro_version < 0 || f->micro_version > 65535)
             return AVERROR_INVALIDDATA;
+        f->combined_version += f->micro_version;
     }
     f->ac = get_symbol(&c, state, 0);
 
@@ -504,7 +506,7 @@ static int read_extra_header(FFV1Context *f)
         f->ec = get_symbol(&c, state, 0);
         if (f->ec >= 2)
             f->crcref = 0x7a8c4079;
-        if (f->micro_version > 2)
+        if (f->combined_version >= 0x30003)
             f->intra = get_symbol(&c, state, 0);
     }
 
@@ -1032,6 +1034,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 
     fdst->version             = fsrc->version;
     fdst->micro_version       = fsrc->micro_version;
+    fdst->combined_version    = fsrc->combined_version;
     fdst->chroma_planes       = fsrc->chroma_planes;
     fdst->chroma_h_shift      = fsrc->chroma_h_shift;
     fdst->chroma_v_shift      = fsrc->chroma_v_shift;
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index e2db1b41640..c6f450ae6c0 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -414,11 +414,13 @@ av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
     ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
 
     put_symbol(&c, state, f->version, 0);
+    f->combined_version = f->version << 16;
     if (f->version > 2) {
         if (f->version == 3) {
             f->micro_version = 4;
         } else if (f->version == 4)
             f->micro_version = 3;
+        f->combined_version += f->micro_version;
         put_symbol(&c, state, f->micro_version, 0);
     }
 
-- 
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] 7+ messages in thread

* [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version
  2025-01-18  4:59 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1: simplify version checks with combined_version Michael Niedermayer
@ 2025-01-18  4:59 ` Michael Niedermayer
  2025-01-21  1:52   ` Michael Niedermayer
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Basic float16 support Michael Niedermayer
  2025-01-18  5:00 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation Michael Niedermayer
  2 siblings, 1 reply; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-18  4:59 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

resetting the version causes any previously set values to be disregarded

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1enc.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index c6f450ae6c0..c952065e443 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -914,7 +914,6 @@ static int encode_init_internal(AVCodecContext *avctx)
         }
     }
 
-    s->version = 0;
 
     ret = ff_ffv1_encode_init(avctx);
     if (ret < 0)
-- 
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] 7+ messages in thread

* [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Basic float16 support
  2025-01-18  4:59 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1: simplify version checks with combined_version Michael Niedermayer
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version Michael Niedermayer
@ 2025-01-18  4:59 ` Michael Niedermayer
  2025-01-18  5:00 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation Michael Niedermayer
  2 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-18  4:59 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

This can be used as a reference for bitstream and compression improvements

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1.h    |  2 ++
 libavcodec/ffv1dec.c | 12 ++++++++++--
 libavcodec/ffv1enc.c |  9 ++++++++-
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
index 576769ae1e0..2c2df154037 100644
--- a/libavcodec/ffv1.h
+++ b/libavcodec/ffv1.h
@@ -132,6 +132,8 @@ typedef struct FFV1Context {
     uint8_t state_transition[256];
     uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
     int colorspace;
+    int flt;
+
 
     int use32bit;
 
diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index 5aec6cdce26..def95ff411f 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -508,6 +508,8 @@ static int read_extra_header(FFV1Context *f)
             f->crcref = 0x7a8c4079;
         if (f->combined_version >= 0x30003)
             f->intra = get_symbol(&c, state, 0);
+        if (f->combined_version >= 0x40004)
+            f->flt = get_symbol(&c, state, 0);
     }
 
     if (f->version > 2) {
@@ -738,11 +740,17 @@ static int read_header(FFV1Context *f)
         else if (f->avctx->bits_per_raw_sample == 14 && f->transparency)
             f->avctx->pix_fmt = AV_PIX_FMT_GBRAP14;
         else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency) {
-            f->avctx->pix_fmt = AV_PIX_FMT_GBRP16;
+            if (f->flt) {
+                f->avctx->pix_fmt = AV_PIX_FMT_GBRPF16;
+            } else
+                f->avctx->pix_fmt = AV_PIX_FMT_GBRP16;
             f->use32bit = 1;
         }
         else if (f->avctx->bits_per_raw_sample == 16 && f->transparency) {
-            f->avctx->pix_fmt = AV_PIX_FMT_GBRAP16;
+            if (f->flt) {
+                f->avctx->pix_fmt = AV_PIX_FMT_GBRAPF16;
+            } else
+                f->avctx->pix_fmt = AV_PIX_FMT_GBRAP16;
             f->use32bit = 1;
         }
     } else {
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index c952065e443..8e9f41fea8f 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -419,7 +419,7 @@ av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
         if (f->version == 3) {
             f->micro_version = 4;
         } else if (f->version == 4)
-            f->micro_version = 3;
+            f->micro_version = 4;
         f->combined_version += f->micro_version;
         put_symbol(&c, state, f->micro_version, 0);
     }
@@ -867,6 +867,8 @@ av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
             s->bits_per_raw_sample = 14;
     case AV_PIX_FMT_GBRP16:
     case AV_PIX_FMT_GBRAP16:
+    case AV_PIX_FMT_GBRPF16:
+    case AV_PIX_FMT_GBRAPF16:
         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
             s->bits_per_raw_sample = 16;
         else if (!s->bits_per_raw_sample)
@@ -877,7 +879,11 @@ av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
         if (s->bits_per_raw_sample >= 16) {
             s->use32bit = 1;
         }
+        s->flt     = !!(desc->flags & AV_PIX_FMT_FLAG_FLOAT);
         s->version = FFMAX(s->version, 1);
+
+        if (s->flt)
+            s->version = FFMAX(s->version, 4);
         break;
     default:
         av_log(avctx, AV_LOG_ERROR, "format %s not supported\n",
@@ -1398,6 +1404,7 @@ const FFCodec ff_ffv1_encoder = {
         AV_PIX_FMT_GRAY9,
         AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
         AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_GBRPF16,
         AV_PIX_FMT_NONE
 
     },
-- 
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] 7+ messages in thread

* [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation
  2025-01-18  4:59 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1: simplify version checks with combined_version Michael Niedermayer
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version Michael Niedermayer
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Basic float16 support Michael Niedermayer
@ 2025-01-18  5:00 ` Michael Niedermayer
  2025-01-18  8:33   ` Lynne
  2 siblings, 1 reply; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-18  5:00 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

This performs a tiny bit better than not using it but it is incompatible
with the RCT which gives a bigger gain

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/ffv1.h             | 20 ++++++++++++++++++++
 libavcodec/ffv1enc_template.c | 33 ++++++++++++++++++++++++---------
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
index 2c2df154037..84a443613df 100644
--- a/libavcodec/ffv1.h
+++ b/libavcodec/ffv1.h
@@ -196,6 +196,26 @@ static av_always_inline int fold(int diff, int bits)
     return diff;
 }
 
+// We treat infinite as a big number, 0 as a small non 0 number, this is close enough, we ignore denormal numbers
+static av_always_inline int64_t f2i(uint16_t f)
+{
+    int s = -(f>>15);
+    int64_t v = (1024L + (f & 1023)) << ((f & 0x7C00) >> 10);
+    return (v + s) ^ s;
+}
+
+//undo above
+static av_always_inline uint16_t i2f(int64_t v)
+{
+    int s = v>>63;
+    int e;
+    v = (v + s) ^ s;
+
+    e = av_log2(v>>10);
+
+    return (s&32768) + (e<<10) + ((v + (1U<<e)/2) >> e) - 1024;
+}
+
 static inline void update_vlc_state(VlcState *const state, const int v)
 {
     int drift = state->drift;
diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
index bc14926ab95..12d519320c0 100644
--- a/libavcodec/ffv1enc_template.c
+++ b/libavcodec/ffv1enc_template.c
@@ -64,7 +64,13 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
 
         context = RENAME(get_context)(f->quant_tables[p->quant_table_index],
                                       sample[0] + x, sample[1] + x, sample[2] + x);
-        diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
+
+        int64_t  L = f2i(sample[0][x-1]);
+        int64_t  T = f2i(sample[1][x]);
+        int64_t LT = f2i(sample[1][x-1]);
+
+        diff    = sample[0][x] - mid_pred(i2f(L), i2f(L + T - LT), i2f(T));
+//         diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
 
         if (context < 0) {
             context = -context;
@@ -147,7 +153,16 @@ 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(0){
+        int v;
+        for (v = 0; v<65536; v++) {
+            int64_t i = f2i(v);
+            int v2 = i2f(i);
+            if (v != v2)
+                av_log(0,0, "D %X %X %LX\n", v, v2, i);
+            av_assert0(v2 == v);
+        }
+    }
     for (y = 0; y < h; y++) {
         for (i = 0; i < ring_size; i++)
             for (p = 0; p < MAX_PLANES; p++)
@@ -180,13 +195,13 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
                 r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
             }
 
-            if (sc->slice_coding_mode != 1) {
-                b -= g;
-                r -= g;
-                g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
-                b += offset;
-                r += offset;
-            }
+//             if (sc->slice_coding_mode != 1) {
+//                 b -= g;
+//                 r -= g;
+//                 g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
+//                 b += offset;
+//                 r += offset;
+//             }
 
             sample[0][0][x] = g;
             sample[1][0][x] = b;
-- 
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] 7+ messages in thread

* Re: [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation
  2025-01-18  5:00 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation Michael Niedermayer
@ 2025-01-18  8:33   ` Lynne
  2025-01-18 23:02     ` Michael Niedermayer
  0 siblings, 1 reply; 7+ messages in thread
From: Lynne @ 2025-01-18  8:33 UTC (permalink / raw)
  To: ffmpeg-devel


[-- Attachment #1.1.1.1: Type: text/plain, Size: 4044 bytes --]

On 18/01/2025 14:00, Michael Niedermayer wrote:
> This performs a tiny bit better than not using it but it is incompatible
> with the RCT which gives a bigger gain
> 
> Sponsored-by: Sovereign Tech Fund
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>   libavcodec/ffv1.h             | 20 ++++++++++++++++++++
>   libavcodec/ffv1enc_template.c | 33 ++++++++++++++++++++++++---------
>   2 files changed, 44 insertions(+), 9 deletions(-)
> 
> diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
> index 2c2df154037..84a443613df 100644
> --- a/libavcodec/ffv1.h
> +++ b/libavcodec/ffv1.h
> @@ -196,6 +196,26 @@ static av_always_inline int fold(int diff, int bits)
>       return diff;
>   }
>   
> +// We treat infinite as a big number, 0 as a small non 0 number, this is close enough, we ignore denormal numbers
> +static av_always_inline int64_t f2i(uint16_t f)
> +{
> +    int s = -(f>>15);
> +    int64_t v = (1024L + (f & 1023)) << ((f & 0x7C00) >> 10);
> +    return (v + s) ^ s;
> +}
> +
> +//undo above
> +static av_always_inline uint16_t i2f(int64_t v)
> +{
> +    int s = v>>63;
> +    int e;
> +    v = (v + s) ^ s;
> +
> +    e = av_log2(v>>10);
> +
> +    return (s&32768) + (e<<10) + ((v + (1U<<e)/2) >> e) - 1024;
> +}
> +
>   static inline void update_vlc_state(VlcState *const state, const int v)
>   {
>       int drift = state->drift;
> diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
> index bc14926ab95..12d519320c0 100644
> --- a/libavcodec/ffv1enc_template.c
> +++ b/libavcodec/ffv1enc_template.c
> @@ -64,7 +64,13 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
>   
>           context = RENAME(get_context)(f->quant_tables[p->quant_table_index],
>                                         sample[0] + x, sample[1] + x, sample[2] + x);
> -        diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
> +
> +        int64_t  L = f2i(sample[0][x-1]);
> +        int64_t  T = f2i(sample[1][x]);
> +        int64_t LT = f2i(sample[1][x-1]);
> +
> +        diff    = sample[0][x] - mid_pred(i2f(L), i2f(L + T - LT), i2f(T));
> +//         diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
>   
>           if (context < 0) {
>               context = -context;
> @@ -147,7 +153,16 @@ 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(0){
> +        int v;
> +        for (v = 0; v<65536; v++) {
> +            int64_t i = f2i(v);
> +            int v2 = i2f(i);
> +            if (v != v2)
> +                av_log(0,0, "D %X %X %LX\n", v, v2, i);
> +            av_assert0(v2 == v);
> +        }
> +    }
>       for (y = 0; y < h; y++) {
>           for (i = 0; i < ring_size; i++)
>               for (p = 0; p < MAX_PLANES; p++)
> @@ -180,13 +195,13 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
>                   r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
>               }
>   
> -            if (sc->slice_coding_mode != 1) {
> -                b -= g;
> -                r -= g;
> -                g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
> -                b += offset;
> -                r += offset;
> -            }
> +//             if (sc->slice_coding_mode != 1) {
> +//                 b -= g;
> +//                 r -= g;
> +//                 g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
> +//                 b += offset;
> +//                 r += offset;
> +//             }
>   
>               sample[0][0][x] = g;
>               sample[1][0][x] = b;

I think using prediction independently on both exponent and mantissa, 
and coding the two via different contexts would be better, not to 
mention it would avoid the f2i hacks.

[-- Attachment #1.1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 637 bytes --]

[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 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] 7+ messages in thread

* Re: [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation
  2025-01-18  8:33   ` Lynne
@ 2025-01-18 23:02     ` Michael Niedermayer
  0 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-18 23:02 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


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

On Sat, Jan 18, 2025 at 05:33:19PM +0900, Lynne wrote:
> On 18/01/2025 14:00, Michael Niedermayer wrote:
> > This performs a tiny bit better than not using it but it is incompatible
> > with the RCT which gives a bigger gain
> > 
> > Sponsored-by: Sovereign Tech Fund
> > Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> > ---
> >   libavcodec/ffv1.h             | 20 ++++++++++++++++++++
> >   libavcodec/ffv1enc_template.c | 33 ++++++++++++++++++++++++---------
> >   2 files changed, 44 insertions(+), 9 deletions(-)
> > 
> > diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
> > index 2c2df154037..84a443613df 100644
> > --- a/libavcodec/ffv1.h
> > +++ b/libavcodec/ffv1.h
> > @@ -196,6 +196,26 @@ static av_always_inline int fold(int diff, int bits)
> >       return diff;
> >   }
> > +// We treat infinite as a big number, 0 as a small non 0 number, this is close enough, we ignore denormal numbers
> > +static av_always_inline int64_t f2i(uint16_t f)
> > +{
> > +    int s = -(f>>15);
> > +    int64_t v = (1024L + (f & 1023)) << ((f & 0x7C00) >> 10);
> > +    return (v + s) ^ s;
> > +}
> > +
> > +//undo above
> > +static av_always_inline uint16_t i2f(int64_t v)
> > +{
> > +    int s = v>>63;
> > +    int e;
> > +    v = (v + s) ^ s;
> > +
> > +    e = av_log2(v>>10);
> > +
> > +    return (s&32768) + (e<<10) + ((v + (1U<<e)/2) >> e) - 1024;
> > +}
> > +
> >   static inline void update_vlc_state(VlcState *const state, const int v)
> >   {
> >       int drift = state->drift;
> > diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c
> > index bc14926ab95..12d519320c0 100644
> > --- a/libavcodec/ffv1enc_template.c
> > +++ b/libavcodec/ffv1enc_template.c
> > @@ -64,7 +64,13 @@ RENAME(encode_line)(FFV1Context *f, FFV1SliceContext *sc,
> >           context = RENAME(get_context)(f->quant_tables[p->quant_table_index],
> >                                         sample[0] + x, sample[1] + x, sample[2] + x);
> > -        diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
> > +
> > +        int64_t  L = f2i(sample[0][x-1]);
> > +        int64_t  T = f2i(sample[1][x]);
> > +        int64_t LT = f2i(sample[1][x-1]);
> > +
> > +        diff    = sample[0][x] - mid_pred(i2f(L), i2f(L + T - LT), i2f(T));
> > +//         diff    = sample[0][x] - RENAME(predict)(sample[0] + x, sample[1] + x);
> >           if (context < 0) {
> >               context = -context;
> > @@ -147,7 +153,16 @@ 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(0){
> > +        int v;
> > +        for (v = 0; v<65536; v++) {
> > +            int64_t i = f2i(v);
> > +            int v2 = i2f(i);
> > +            if (v != v2)
> > +                av_log(0,0, "D %X %X %LX\n", v, v2, i);
> > +            av_assert0(v2 == v);
> > +        }
> > +    }
> >       for (y = 0; y < h; y++) {
> >           for (i = 0; i < ring_size; i++)
> >               for (p = 0; p < MAX_PLANES; p++)
> > @@ -180,13 +195,13 @@ static int RENAME(encode_rgb_frame)(FFV1Context *f, FFV1SliceContext *sc,
> >                   r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
> >               }
> > -            if (sc->slice_coding_mode != 1) {
> > -                b -= g;
> > -                r -= g;
> > -                g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
> > -                b += offset;
> > -                r += offset;
> > -            }
> > +//             if (sc->slice_coding_mode != 1) {
> > +//                 b -= g;
> > +//                 r -= g;
> > +//                 g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
> > +//                 b += offset;
> > +//                 r += offset;
> > +//             }
> >               sample[0][0][x] = g;
> >               sample[1][0][x] = b;
> 
> I think using prediction independently on both exponent and mantissa, and
> coding the two via different contexts would be better, not to mention it
> would avoid the f2i hacks.

i thought so too but so far i dont have a piece of code that stores
them seperately and does perform better

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

There will always be a question for which you do not know the correct answer.

[-- 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] 7+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version
  2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version Michael Niedermayer
@ 2025-01-21  1:52   ` Michael Niedermayer
  0 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2025-01-21  1:52 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


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

Hi

On Sat, Jan 18, 2025 at 05:59:58AM +0100, Michael Niedermayer wrote:
> resetting the version causes any previously set values to be disregarded
> 
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/ffv1enc.c | 1 -
>  1 file changed, 1 deletion(-)

will apply this (bugfix?)

and the combined_version patch (which is just a simplification)

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

It is what and why we do it that matters, not just one of them.

[-- 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] 7+ messages in thread

end of thread, other threads:[~2025-01-21  1:52 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-18  4:59 [FFmpeg-devel] [PATCH 1/4] avcodec/ffv1: simplify version checks with combined_version Michael Niedermayer
2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 2/4] avcodec/ffv1enc: dont reset version Michael Niedermayer
2025-01-21  1:52   ` Michael Niedermayer
2025-01-18  4:59 ` [FFmpeg-devel] [PATCH 3/4] avcodec/ffv1: Basic float16 support Michael Niedermayer
2025-01-18  5:00 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1: NOT FOR GIT, experiment about float decorrelation Michael Niedermayer
2025-01-18  8:33   ` Lynne
2025-01-18 23:02     ` 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