[FFmpeg-cvslog] avfilter/vf_uspp: Use FF_CEIL_RSHIFT() correct rounding of odd w/h

Michael Niedermayer git at videolan.org
Sun Jan 25 16:17:12 CET 2015


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Jan 25 15:50:42 2015 +0100| [49456ed6069a86846b8626f0cbeacf3c79d74949] | committer: Michael Niedermayer

avfilter/vf_uspp: Use FF_CEIL_RSHIFT() correct rounding of odd w/h

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

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

 libavfilter/vf_uspp.c |   21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/libavfilter/vf_uspp.c b/libavfilter/vf_uspp.c
index 7ff4642..16e85ea 100644
--- a/libavfilter/vf_uspp.c
+++ b/libavfilter/vf_uspp.c
@@ -189,8 +189,8 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
 
     for (i = 0; i < 3; i++) {
         int is_chroma = !!i;
-        int w = width  >> (is_chroma ? p->hsub : 0);
-        int h = height >> (is_chroma ? p->vsub : 0);
+        int w = FF_CEIL_RSHIFT(width,  is_chroma ? p->hsub : 0);
+        int h = FF_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0);
         int stride = p->temp_stride[i];
         int block = BLOCK >> (is_chroma ? p->hsub : 0);
 
@@ -263,8 +263,8 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
 
         offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1];
 
-        for (y = 0; y < height>>p->vsub; y++) {
-            for (x = 0; x < width>>p->hsub; x++) {
+        for (y = 0; y < FF_CEIL_RSHIFT(height, p->vsub); y++) {
+            for (x = 0; x < FF_CEIL_RSHIFT(width, p->hsub); x++) {
                 p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset];
                 p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset];
             }
@@ -276,8 +276,8 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
         if (!dst[j])
             continue;
         store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j],
-                      width  >> (is_chroma ? p->hsub : 0),
-                      height >> (is_chroma ? p->vsub : 0),
+                      FF_CEIL_RSHIFT(width,  is_chroma ? p->hsub : 0),
+                      FF_CEIL_RSHIFT(height, is_chroma ? p->vsub : 0),
                       8-p->log2_count);
     }
 }
@@ -318,8 +318,13 @@ static int config_input(AVFilterLink *inlink)
 
     for (i = 0; i < 3; i++) {
         int is_chroma = !!i;
-        int w = ((width  + 4 * BLOCK-1) & (~(2 * BLOCK-1))) >> (is_chroma ? uspp->hsub : 0);
-        int h = ((height + 4 * BLOCK-1) & (~(2 * BLOCK-1))) >> (is_chroma ? uspp->vsub : 0);
+        int w = (width  + 4 * BLOCK-1) & (~(2 * BLOCK-1));
+        int h = (height + 4 * BLOCK-1) & (~(2 * BLOCK-1));
+
+        if (is_chroma) {
+            w = FF_CEIL_RSHIFT(w, uspp->hsub);
+            h = FF_CEIL_RSHIFT(h, uspp->vsub);
+        }
 
         uspp->temp_stride[i] = w;
         if (!(uspp->temp[i] = av_malloc_array(uspp->temp_stride[i], h * sizeof(int16_t))))



More information about the ffmpeg-cvslog mailing list