[FFmpeg-cvslog] avcodec/ffv1enc: Prevent generation of files with broken slices

Michael Niedermayer git at videolan.org
Thu Feb 27 19:07:47 EET 2025


ffmpeg | branch: release/4.3 | Michael Niedermayer <michael at niedermayer.cc> | Tue Oct  1 22:06:40 2024 +0200| [a24784d504ae623f11a2e0a3c6542068fd12ccbe] | committer: Michael Niedermayer

avcodec/ffv1enc: Prevent generation of files with broken slices

Fixes: Ticket5548

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
(cherry picked from commit b7ff66a35804275b25c1176cad560540785e8750)
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a24784d504ae623f11a2e0a3c6542068fd12ccbe
---

 libavcodec/ffv1.c    | 7 +++++++
 libavcodec/ffv1.h    | 1 +
 libavcodec/ffv1enc.c | 4 ++++
 3 files changed, 12 insertions(+)

diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index 5b52849400..af2fccb9b2 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -113,6 +113,13 @@ av_cold int ff_ffv1_init_slices_state(FFV1Context *f)
     return 0;
 }
 
+int ff_need_new_slices(int width, int num_h_slices, int chroma_shift) {
+    int mpw = 1<<chroma_shift;
+    int i = width * (int64_t)(num_h_slices - 1) / num_h_slices;
+
+    return width % mpw && (width - i) % mpw == 0;
+}
+
 av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
 {
     int i, max_slice_count = f->num_h_slices * f->num_v_slices;
diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
index 147fe7ae16..cddf170a6b 100644
--- a/libavcodec/ffv1.h
+++ b/libavcodec/ffv1.h
@@ -146,6 +146,7 @@ int ff_ffv1_init_slice_contexts(FFV1Context *f);
 int ff_ffv1_allocate_initial_states(FFV1Context *f);
 void ff_ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs);
 int ff_ffv1_close(AVCodecContext *avctx);
+int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
 
 static av_always_inline int fold(int diff, int bits)
 {
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 77240352f4..a489ce0dc0 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -892,6 +892,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
                     continue;
                 if (maxw * maxh * (int64_t)(s->bits_per_raw_sample+1) * plane_count > 8<<24)
                     continue;
+                if (s->version < 4)
+                    if (  ff_need_new_slices(avctx->width , s->num_h_slices, s->chroma_h_shift)
+                        ||ff_need_new_slices(avctx->height, s->num_v_slices, s->chroma_v_shift))
+                        continue;
                 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= MAX_SLICES || !avctx->slices)
                     goto slices_ok;
             }



More information about the ffmpeg-cvslog mailing list