[FFmpeg-cvslog] avcodec/smcenc: fixes for width not multiple of 4

Paul B Mahol git at videolan.org
Thu Dec 1 20:03:25 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu Dec  1 19:01:26 2022 +0100| [f56454544f35a3495310aa5ed4fb15e0ba7b967f] | committer: Paul B Mahol

avcodec/smcenc: fixes for width not multiple of 4

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

 libavcodec/smcenc.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/libavcodec/smcenc.c b/libavcodec/smcenc.c
index 39abf2407b..df6ada3b7b 100644
--- a/libavcodec/smcenc.c
+++ b/libavcodec/smcenc.c
@@ -116,9 +116,9 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
                               PutByteContext *pb)
 {
     const uint8_t *src_pixels = (const uint8_t *)frame->data[0];
-    const int stride = frame->linesize[0];
+    const ptrdiff_t stride = frame->linesize[0];
     const uint8_t *prev_pixels = (const uint8_t *)s->prev_frame->data[0];
-    const int prev_stride = s->prev_frame->linesize[0];
+    const ptrdiff_t prev_stride = s->prev_frame->linesize[0];
     uint8_t *distinct_values = s->distinct_values;
     const uint8_t *pixel_ptr, *row_ptr;
     const int height = frame->height;
@@ -160,10 +160,9 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
             int compare = 0;
 
             for (int y = 0; y < y_size; y++) {
-                const ptrdiff_t offset = pixel_ptr - row_ptr;
-                const uint8_t *prev_pixel_ptr = prev_pixels + cur_y * prev_stride + offset;
+                const uint8_t *prev_pixel_ptr = prev_pixels + (y + cur_y) * prev_stride + cur_x;
 
-                compare |= memcmp(prev_pixel_ptr + y * prev_stride, pixel_ptr + y * stride, x_size);
+                compare |= !!memcmp(prev_pixel_ptr, pixel_ptr + y * stride, x_size);
                 if (compare)
                     break;
             }
@@ -171,9 +170,9 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
             if (compare)
                 break;
 
+            inter_skip_blocks++;
             if (inter_skip_blocks >= 256)
                 break;
-            inter_skip_blocks++;
 
             ADVANCE_BLOCK(pixel_ptr, row_ptr, 1)
         }
@@ -190,7 +189,7 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
             const int sy = offset / stride;
             const int sx = offset % stride;
             const int ny = sx < 4 ? sy - 4 : sy;
-            const int nx = sx < 4 ? width - 4 : sx - 4;
+            const int nx = sx < 4 ? width - 4 + (width & 3) : sx - 4;
             const uint8_t *old_pixel_ptr = src_pixels + nx + ny * stride;
             int compare = 0;
 
@@ -203,9 +202,10 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
             if (compare)
                 break;
 
+            intra_skip_blocks++;
             if (intra_skip_blocks >= 256)
                 break;
-            intra_skip_blocks++;
+
             ADVANCE_BLOCK(pixel_ptr, row_ptr, 1)
         }
 
@@ -236,10 +236,11 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
             s->mono_value = block_values[0];
 
             coded_distinct = s->nb_distinct;
-            ADVANCE_BLOCK(pixel_ptr, row_ptr, 1)
             coded_blocks++;
             if (coded_distinct > 1 && coded_blocks >= 16)
                 break;
+
+            ADVANCE_BLOCK(pixel_ptr, row_ptr, 1)
         }
 
         pixel_ptr = xpixel_ptr;



More information about the ffmpeg-cvslog mailing list