diff mbox series

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

Message ID AS8P250MB0744DF96403C83D549B91C098F429@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM
State New
Headers show
Series [FFmpeg-devel,01/18] avcodec/vp8: Disable segmentation for VP7 | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 10, 2022, 1:07 a.m. UTC
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@outlook.com>
---
 libavcodec/vp8.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)
diff mbox series

Patch

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);