[FFmpeg-devel] [PATCH 09/18] avcodec/vp8: Disable slice-thread synchronization code for VP7

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sat Sep 10 04:07:20 EEST 2022


The VP7 decoder is not slice-threaded; by its design, VP7
only allows at most two slice threads per frame and if it
were ever implemented, it would likely need custom synchronization
code anyway, so disable the current code for it.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/vp8.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index f5c05cd84f..dd3d38d342 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -2440,7 +2440,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
         if (vpx_rac_is_end(c))
             return AVERROR_INVALIDDATA;
         // Wait for previous thread to read mb_x+2, and reach mb_y-1.
-        if (prev_td != td) {
+        if (!is_vp7 && prev_td != td) {
             if (threadnr != 0) {
                 check_thread_pos(td, prev_td,
                                  mb_x + (is_vp7 ? 2 : 1),
@@ -2508,11 +2508,9 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
         td->mv_bounds.mv_min.x -= 64;
         td->mv_bounds.mv_max.x -= 64;
 
-        if (mb_x == s->mb_width + 1) {
-            update_pos(td, mb_y, s->mb_width + 3);
-        } else {
-            update_pos(td, mb_y, mb_x);
-        }
+        if (!is_vp7)
+            update_pos(td, mb_y, mb_x == s->mb_width + 1 ?
+                                    s->mb_width + 3 : mb_x);
     }
     return 0;
 }
@@ -2561,10 +2559,10 @@ static av_always_inline void filter_mb_row(AVCodecContext *avctx, void *tdata,
 
     for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb++) {
         VP8FilterStrength *f = &td->filter_strength[mb_x];
-        if (prev_td != td)
+        if (!is_vp7 && prev_td != td)
             check_thread_pos(td, prev_td,
                              (mb_x + 1) + (s->mb_width + 3), mb_y - 1);
-        if (next_td != td)
+        if (!is_vp7 && next_td != td)
             if (next_td != &s->thread_data[0])
                 check_thread_pos(td, next_td, mb_x + 1, mb_y + 1);
 
@@ -2585,7 +2583,8 @@ static av_always_inline void filter_mb_row(AVCodecContext *avctx, void *tdata,
         dst[1] += 8;
         dst[2] += 8;
 
-        update_pos(td, mb_y, (s->mb_width + 3) + mb_x);
+        if (!is_vp7)
+            update_pos(td, mb_y, (s->mb_width + 3) + mb_x);
     }
 }
 
@@ -2618,12 +2617,14 @@ int vp78_decode_mb_row_sliced(AVCodecContext *avctx, void *tdata, int jobnr,
     for (mb_y = jobnr; mb_y < s->mb_height; mb_y += num_jobs) {
         ret = s->decode_mb_row_no_filter(avctx, tdata, jobnr, threadnr, mb_y);
         if (ret < 0) {
-            update_pos(td, s->mb_height, INT_MAX & 0xFFFF);
+            if (!is_vp7)
+                update_pos(td, s->mb_height, INT_MAX & 0xFFFF);
             return ret;
         }
         if (s->deblock_filter)
             s->filter_mb_row(avctx, tdata, jobnr, threadnr, mb_y);
-        update_pos(td, mb_y, INT_MAX & 0xFFFF);
+        if (!is_vp7)
+            update_pos(td, mb_y, INT_MAX & 0xFFFF);
 
         td->mv_bounds.mv_min.y -= 64 * num_jobs;
         td->mv_bounds.mv_max.y -= 64 * num_jobs;
@@ -2802,17 +2803,18 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame,
         s->prev_frame = prev_frame;
         s->mv_bounds.mv_min.y   = -MARGIN;
         s->mv_bounds.mv_max.y   = ((s->mb_height - 1) << 6) + MARGIN;
-        for (i = 0; i < MAX_THREADS; i++) {
-            VP8ThreadData *td = &s->thread_data[i];
-            atomic_init(&td->thread_mb_pos, 0);
-            atomic_init(&td->wait_mb_pos, INT_MAX);
-        }
-        if (is_vp7)
+        if (is_vp7) {
             avctx->execute2(avctx, vp7_decode_mb_row_sliced, s->thread_data, NULL,
                             num_jobs);
-        else
+        } else {
+            for (unsigned i = 0; i < MAX_THREADS; i++) {
+                VP8ThreadData *td = &s->thread_data[i];
+                atomic_init(&td->thread_mb_pos, 0);
+                atomic_init(&td->wait_mb_pos, INT_MAX);
+            }
             avctx->execute2(avctx, vp8_decode_mb_row_sliced, s->thread_data, NULL,
                             num_jobs);
+        }
     }
 
     ff_thread_report_progress(&curframe->tf, INT_MAX, 0);
-- 
2.34.1



More information about the ffmpeg-devel mailing list