- buffer = av_memdup(s->last_picture.f->data[0], s->image_linesize * s->height);
- if (!buffer)
- return AVERROR(ENOMEM);
+ // copy unchanged rectangles from the last frame
+ for (y = 0; y < s->y_offset; y++)
+ memcpy(dst + y * dst_stride, src + y * src_stride, p->width * s->bpp);
+ for (y = s->y_offset; y < s->y_offset + s->cur_h; y++) {
+ memcpy(dst + y * dst_stride, src + y * src_stride, s->x_offset * s->bpp);
+ memcpy(dst + y * dst_stride + (s->x_offset + s->cur_w) * s->bpp,
+ src + y * src_stride + (s->x_offset + s->cur_w) * s->bpp,
+ (p->width - s->cur_w - s->x_offset) * s->bpp);
+ }
+ for (y = s->y_offset + s->cur_h; y < p->height; y++)
+ memcpy(dst + y * dst_stride, src + y * src_stride, p->width * s->bpp);