• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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