1diff -Npur ffmpeg-5.1.2/libavcodec/smcenc.c ffmpeg-5.1.2-change/libavcodec/smcenc.c 2--- ffmpeg-5.1.2/libavcodec/smcenc.c 2022-07-23 01:58:39.000000000 +0800 3+++ ffmpeg-5.1.2-change/libavcodec/smcenc.c 2024-06-25 17:07:00.100640653 +0800 4@@ -61,6 +61,7 @@ typedef struct SMCContext { 5 { \ 6 row_ptr += stride * 4; \ 7 pixel_ptr = row_ptr; \ 8+ cur_y += 4; \ 9 } \ 10 } \ 11 } 12@@ -117,6 +118,7 @@ static void smc_encode_stream(SMCContext 13 const uint8_t *prev_pixels = (const uint8_t *)s->prev_frame->data[0]; 14 uint8_t *distinct_values = s->distinct_values; 15 const uint8_t *pixel_ptr, *row_ptr; 16+ const int height = frame->height; 17 const int width = frame->width; 18 uint8_t block_values[16]; 19 int block_counter = 0; 20@@ -125,13 +127,14 @@ static void smc_encode_stream(SMCContext 21 int color_octet_index = 0; 22 int color_table_index; /* indexes to color pair, quad, or octet tables */ 23 int total_blocks; 24+ int cur_y = 0; 25 26 memset(s->color_pairs, 0, sizeof(s->color_pairs)); 27 memset(s->color_quads, 0, sizeof(s->color_quads)); 28 memset(s->color_octets, 0, sizeof(s->color_octets)); 29 30 /* Number of 4x4 blocks in frame. */ 31- total_blocks = ((frame->width + 3) / 4) * ((frame->height + 3) / 4); 32+ total_blocks = ((width + 3) / 4) * ((height + 3) / 4); 33 34 pixel_ptr = row_ptr = src_pixels; 35 36@@ -145,11 +148,13 @@ static void smc_encode_stream(SMCContext 37 int cache_index; 38 int distinct = 0; 39 int blocks = 0; 40+ int frame_y = cur_y; 41 42 while (prev_pixels && s->key_frame == 0 && block_counter + inter_skip_blocks < total_blocks) { 43+ const int y_size = FFMIN(4, height - cur_y); 44 int compare = 0; 45 46- for (int y = 0; y < 4; y++) { 47+ for (int y = 0; y < y_size; y++) { 48 const ptrdiff_t offset = pixel_ptr - src_pixels; 49 const uint8_t *prev_pixel_ptr = prev_pixels + offset; 50 51@@ -170,8 +175,10 @@ static void smc_encode_stream(SMCContext 52 53 pixel_ptr = xpixel_ptr; 54 row_ptr = xrow_ptr; 55+ cur_y = frame_y; 56 57 while (block_counter > 0 && block_counter + intra_skip_blocks < total_blocks) { 58+ const int y_size = FFMIN(4, height - cur_y); 59 const ptrdiff_t offset = pixel_ptr - src_pixels; 60 const int sy = offset / stride; 61 const int sx = offset % stride; 62@@ -180,7 +187,7 @@ static void smc_encode_stream(SMCContext 63 const uint8_t *old_pixel_ptr = src_pixels + nx + ny * stride; 64 int compare = 0; 65 66- for (int y = 0; y < 4; y++) { 67+ for (int y = 0; y < y_size; y++) { 68 compare |= memcmp(old_pixel_ptr + y * stride, pixel_ptr + y * stride, 4); 69 if (compare) 70 break; 71@@ -197,9 +204,11 @@ static void smc_encode_stream(SMCContext 72 73 pixel_ptr = xpixel_ptr; 74 row_ptr = xrow_ptr; 75+ cur_y = frame_y; 76 77 while (block_counter + coded_blocks < total_blocks && coded_blocks < 256) { 78- for (int y = 0; y < 4; y++) 79+ const int y_size = FFMIN(4, height - cur_y); 80+ for (int y = 0; y < y_size; y++) 81 memcpy(block_values + y * 4, pixel_ptr + y * stride, 4); 82 83 qsort(block_values, 16, sizeof(block_values[0]), smc_cmp_values); 84@@ -224,6 +233,7 @@ static void smc_encode_stream(SMCContext 85 86 pixel_ptr = xpixel_ptr; 87 row_ptr = xrow_ptr; 88+ cur_y = frame_y; 89 90 blocks = coded_blocks; 91 distinct = coded_distinct; 92