ffmpeg | branch: master | Martin Storsjö <mar...@martin.st> | Thu Feb 16 
12:23:20 2017 +0200| [8f5de34c8fb18fa1416e77d2cb998773a49ddb3d] | committer: 
Martin Storsjö

vf_fade: Make sure to not miss the last lines of a frame

When slice_h is rounded up due to chroma subsampling, there's
a risk that jobnr * slice_h exceeds frame->height.

Prior to a638e9184d63, this wasn't an issue for the last slice
of a frame, since slice_end was set to frame->height for the last
slice.

a638e9184d63 tried to fix the case where other slices than the
last one would exceed frame->height (which can happen where the
number of slices/threads is very large compared to the frame
height).

However, the fix in a638e9184d63 instead broke other cases,
where slice_h * nb_threads < frame->height. Therefore, make
sure the last slice always ends at frame->height.

CC: libav-sta...@libav.org
Signed-off-by: Martin Storsjö <mar...@martin.st>

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

 libavfilter/vf_fade.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c
index eb6d82a894..fd8c6ef4c8 100644
--- a/libavfilter/vf_fade.c
+++ b/libavfilter/vf_fade.c
@@ -123,7 +123,8 @@ static int filter_slice_chroma(AVFilterContext *ctx, void 
*arg, int jobnr,
     AVFrame *frame = arg;
     int slice_h     = FFALIGN(frame->height / nb_jobs, 1 << s->vsub);
     int slice_start = jobnr * slice_h;
-    int slice_end   = FFMIN((jobnr + 1) * slice_h, frame->height);
+    int slice_end   = (jobnr == nb_jobs - 1) ? frame->height :
+                                               FFMIN((jobnr + 1) * slice_h, 
frame->height);
     int i, j, plane;
 
     for (plane = 1; plane < 3; plane++) {

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

Reply via email to