summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-12-02 19:02:24 +0100
committerPaul B Mahol <onemda@gmail.com>2022-12-02 19:17:29 +0100
commitfb51eebc6cb3df8e6ee232a650fbb4c1a05c4125 (patch)
treebb93b724419caf4df580d8ef0f44f2ad286a6096 /libavcodec
parent1bebcd43e1a6d7e3a0743adcc10245e5d51f72b1 (diff)
avcodec/smcenc: fix errors with using intra after inter skip
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/smcenc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/libavcodec/smcenc.c b/libavcodec/smcenc.c
index 9ff9dc697d..33f9dfcc24 100644
--- a/libavcodec/smcenc.c
+++ b/libavcodec/smcenc.c
@@ -127,6 +127,7 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
int color_pair_index = 0;
int color_quad_index = 0;
int color_octet_index = 0;
+ int prev_block_inter = 0;
int color_table_index; /* indexes to color pair, quad, or octet tables */
int total_blocks;
int cur_y = 0;
@@ -182,10 +183,10 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
cur_y = frame_y;
cur_x = frame_x;
- while (block_counter > 0 && block_counter + intra_skip_blocks < total_blocks) {
+ while (block_counter > 0 && prev_block_inter == 0 && block_counter + intra_skip_blocks < total_blocks) {
const int y_size = FFMIN(4, height - cur_y);
const int x_size = FFMIN(4, width - cur_x);
- const ptrdiff_t offset = pixel_ptr - src_pixels;
+ const ptrdiff_t offset = xpixel_ptr - src_pixels;
const int sy = offset / stride;
const int sx = offset % stride;
const int ny = sx < 4 ? sy - 4 : sy;
@@ -194,7 +195,7 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
int compare = 0;
for (int y = 0; y < y_size; y++) {
- compare |= memcmp(old_pixel_ptr + y * stride, pixel_ptr + y * stride, x_size);
+ compare |= !!memcmp(old_pixel_ptr + y * stride, pixel_ptr + y * stride, x_size);
if (compare)
break;
}
@@ -271,6 +272,7 @@ static void smc_encode_stream(SMCContext *s, const AVFrame *frame,
blocks = inter_skip_blocks;
}
+ prev_block_inter = distinct == 19 || distinct == 20;
switch (distinct) {
case 1:
if (blocks <= 16) {