avfilter/vf_colormatrix: fix yuv420p threading, second try
authorClément Bœsch <u@pkh.me>
Wed, 18 Mar 2015 22:58:30 +0000 (23:58 +0100)
committerClément Bœsch <u@pkh.me>
Wed, 18 Mar 2015 23:03:29 +0000 (00:03 +0100)
Now seems to work fine with different combinations of odd/even heights
and odd/even number of threads.

libavfilter/vf_colormatrix.c

index 78d1bad..fde4b89 100644 (file)
@@ -281,10 +281,10 @@ static int process_slice_yuv420p(AVFilterContext *ctx, void *arg, int jobnr, int
     const ThreadData *td = arg;
     const AVFrame *src = td->src;
     AVFrame *dst = td->dst;
-    const int height = src->height;
+    const int height = FFALIGN(src->height, 2) >> 1;
     const int width = src->width;
-    const int slice_start = (height *  jobnr   ) / nb_jobs;
-    const int slice_end   = (height * (jobnr+1)) / nb_jobs;
+    const int slice_start = ((height *  jobnr   ) / nb_jobs) << 1;
+    const int slice_end   = ((height * (jobnr+1)) / nb_jobs) << 1;
     const int src_pitchY  = src->linesize[0];
     const int src_pitchUV = src->linesize[1];
     const int dst_pitchY  = dst->linesize[0];
@@ -416,7 +416,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
                                FFMIN(in->height, ctx->graph->nb_threads));
     else if (in->format == AV_PIX_FMT_YUV420P)
         ctx->internal->execute(ctx, process_slice_yuv420p, &td, NULL,
-                               FFMAX(1, FFMIN(in->height, ctx->graph->nb_threads) & ~1));
+                               FFMIN(in->height / 2, ctx->graph->nb_threads));
     else
         ctx->internal->execute(ctx, process_slice_uyvy422, &td, NULL,
                                FFMIN(in->height, ctx->graph->nb_threads));