[FFmpeg-devel] [PATCH 4/4] avcodec/pngdec: use memcpy instead of byte loops for P frames.
Benoit Fouet
benoit.fouet at free.fr
Wed Dec 3 14:16:58 CET 2014
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
More information about the ffmpeg-devel
mailing list