* [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; 4+ 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] 4+ 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-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, 0 replies; 4+ 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] 4+ 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-09 22:58 ` [FFmpeg-devel] [PATCH 4/4] avcodec/ffv1enc_template: Be a bit more verbose on error Michael Niedermayer
2 siblings, 0 replies; 4+ 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] 4+ 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
2 siblings, 0 replies; 4+ 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] 4+ messages in thread
end of thread, other threads:[~2025-03-09 22:58 UTC | newest]
Thread overview: 4+ 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-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
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