* [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