From: Martin Vignali Date: Tue, 26 Feb 2019 09:38:10 +0000 (+0100) Subject: avcodec/qtrle : 32bpp dec copy two raw argb value at the same time X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=3278ea67c8f2a7c1aea8fd3114b35983791e6732;p=ffmpeg avcodec/qtrle : 32bpp dec copy two raw argb value at the same time benchmark on x86_64 : 38 fps -> 40 fps --- diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index bb55ba8a86a..febfea30292 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -346,7 +346,7 @@ static void qtrle_decode_24bpp(QtrleContext *s, int row_ptr, int lines_to_change static void qtrle_decode_32bpp(QtrleContext *s, int row_ptr, int lines_to_change) { - int rle_code; + int rle_code, rle_code_half; int pixel_ptr; int row_inc = s->frame->linesize[0]; unsigned int argb; @@ -379,10 +379,15 @@ static void qtrle_decode_32bpp(QtrleContext *s, int row_ptr, int lines_to_change CHECK_PIXEL_PTR(rle_code * 4); /* copy pixels directly to output */ - while (rle_code--) { - argb = bytestream2_get_ne32(&s->g); - AV_WN32A(rgb + pixel_ptr, argb); - pixel_ptr += 4; + rle_code_half = rle_code / 2; + while (rle_code_half--) { /* copy 2 argb raw value at the same time */ + AV_WN64A(rgb + pixel_ptr, bytestream2_get_ne64(&s->g)); + pixel_ptr += 8; + } + + if (rle_code % 2 != 0){ /* not even raw value */ + AV_WN32A(rgb + pixel_ptr, bytestream2_get_ne32(&s->g)); + pixel_ptr += 4; } } }