Rely on the way memcpy is optimized for one's system instead of looping on a byte buffer for buffer copies to handle P frames. --- libavcodec/pngdec.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index 7e7b285..8b004bd 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -844,15 +844,14 @@ static int decode_fctl_chunk(AVCodecContext *avctx, PNGDecContext *s, static void handle_p_frame_png(PNGDecContext *s, AVFrame *p) { - int i, j; + int j; uint8_t *pd = p->data[0]; uint8_t *pd_last = s->last_picture.f->data[0]; int ls = FFMIN(av_image_get_linesize(p->format, s->width, 0), s->width * s->bpp); ff_thread_await_progress(&s->last_picture, INT_MAX, 0); for (j = 0; j < s->height; j++) { - for (i = 0; i < ls; i++) - pd[i] += pd_last[i]; + memcpy(pd, pd_last, ls); pd += s->image_linesize; pd_last += s->image_linesize; } @@ -884,8 +883,7 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, ff_thread_await_progress(&s->previous_picture, INT_MAX, 0); for (j = 0; j < s->y_offset; j++) { - for (i = 0; i < ls; i++) - pd[i] = pd_last[i]; + memcpy(pd, pd_last, ls); pd += s->image_linesize; pd_last += s->image_linesize; } @@ -907,8 +905,9 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, } for (j = s->y_offset; j < s->y_offset + s->cur_h; j++) { - for (i = 0; i < s->x_offset * s->bpp; i++) - pd[i] = pd_last[i]; + i = s->x_offset * s->bpp; + if (i) + memcpy(pd, pd_last, i); for (; i < (s->x_offset + s->cur_w) * s->bpp; i += s->bpp) { uint8_t alpha = pd[i+ai]; @@ -930,26 +929,27 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, break; } } - for (; i < ls; i++) - pd[i] = pd_last[i]; + if (ls - i) + memcpy(pd+i, pd_last+i, ls - i); pd += s->image_linesize; pd_last += s->image_linesize; pd_last_region += s->image_linesize; } } else { for (j = s->y_offset; j < s->y_offset + s->cur_h; j++) { - for (i = 0; i < s->x_offset * s->bpp; i++) - pd[i] = pd_last[i]; - for (i = (s->x_offset + s->cur_w) * s->bpp; i < ls; i++) - pd[i] = pd_last[i]; + int end_offset = (s->x_offset + s->cur_w) * s->bpp; + int end_len = ls - end_offset; + if (s->x_offset) + memcpy(pd, pd_last, s->x_offset * s->bpp); + if (end_len) + memcpy(pd+end_offset, pd_last+end_offset, end_len); pd += s->image_linesize; pd_last += s->image_linesize; } } for (j = s->y_offset + s->cur_h; j < s->height; j++) { - for (i = 0; i < ls; i++) - pd[i] = pd_last[i]; + memcpy(pd, pd_last, ls); pd += s->image_linesize; pd_last += s->image_linesize; } -- 2.2.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel