From: Matthieu Bouron <matthieu.bou...@stupeflix.com> ---
From random 3264x2448 jpegs, scan data copy on a Nexus5 goes from [15, 28]ms to [3, 12]ms. --- libavcodec/mjpegdec.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 863738d..9a501d2 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -1917,24 +1917,47 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s, /* unescape buffer of SOS, use special treatment for JPEG-LS */ if (start_code == SOS && !s->ls) { const uint8_t *src = *buf_ptr; + const uint8_t *ptr = src; uint8_t *dst = s->buffer; - while (src < buf_end) { - uint8_t x = *(src++); + #define copy_data_segment(skipped) do { \ + ssize_t length = (ptr - src) - (skipped); \ + if (length > 0) { \ + memcpy(dst, src, length); \ + dst += length; \ + src = ptr; \ + } \ + } while (0) + + if (s->avctx->codec_id == AV_CODEC_ID_THP) { + ptr = buf_end; + copy_data_segment(0); + } else { + while (ptr < buf_end) { + uint8_t x = *(ptr++); - *(dst++) = x; - if (s->avctx->codec_id != AV_CODEC_ID_THP) { if (x == 0xff) { - while (src < buf_end && x == 0xff) - x = *(src++); + ssize_t skipped = -1; + while (ptr < buf_end && x == 0xff) { + x = *(ptr++); + skipped++; + } - if (x >= 0xd0 && x <= 0xd7) - *(dst++) = x; - else if (x) - break; + if (skipped > 0) + copy_data_segment(skipped); + + if (x < 0xd0 || x > 0xd7) { + copy_data_segment(1); + if (x) + break; + } } } + if (src < ptr) + copy_data_segment(0); } + #undef copy_data_segment + *unescaped_buf_ptr = s->buffer; *unescaped_buf_size = dst - s->buffer; memset(s->buffer + *unescaped_buf_size, 0, -- 2.7.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel