[FFmpeg-devel] [PATCH 4/4] avcodec/pngdec: use memcpy instead of byte loops for P frames.

Michael Niedermayer michaelni at gmx.at
Thu Dec 4 17:09:24 CET 2014


On Thu, Dec 04, 2014 at 03:28:32PM +0100, Benoit Fouet wrote:
> Hi,
> 
> Le 03/12/2014 14:31, Benoit Fouet a écrit :
> >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 | 25 +++++++++++++------------
> >  1 file changed, 13 insertions(+), 12 deletions(-)
> >
> >diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
> >index 7e7b285..e6b7593 100644
> >--- a/libavcodec/pngdec.c
> >+++ b/libavcodec/pngdec.c
> >@@ -884,8 +884,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 +906,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 +930,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;
> >      }
> 
> Unless there is some more remarks on this one, I think it can be
> applied too.

applied

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Many things microsoft did are stupid, but not doing something just because
microsoft did it is even more stupid. If everything ms did were stupid they
would be bankrupt already.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141204/195ed067/attachment.asc>


More information about the ffmpeg-devel mailing list