On Tue, Jan 26, 2016 at 6:04 PM, Michael Niedermayer <mich...@niedermayer.cc > wrote:
> On Tue, Jan 26, 2016 at 05:15:37PM +0100, Matthieu Bouron wrote: > > 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. > > breaks https://trac.ffmpeg.org/raw-attachment/ticket/1527/24bpp.mov > Thanks for finding this. Fixed in the attached patch. [...]
From d0a2808be8393dc7c2d813d08fc0e4518d0f2bd9 Mon Sep 17 00:00:00 2001 From: Matthieu Bouron <matthieu.bou...@stupeflix.com> Date: Tue, 26 Jan 2016 17:15:37 +0100 Subject: [PATCH] lavc/mjpegdec: speed up scan data copy --- libavcodec/mjpegdec.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 863738d..ada607d 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -1917,24 +1917,54 @@ 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(skip) do { \ + ssize_t length = (ptr - src) - (skip); \ + 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 skip = 0; + while (ptr < buf_end && x == 0xff) { + x = *(ptr++); + skip++; + } - if (x >= 0xd0 && x <= 0xd7) - *(dst++) = x; - else if (x) - break; + /* 0xFF, 0xFF, ... */ + if (skip > 1) { + copy_data_segment(skip); + + /* decrement src as it is equal to ptr after the + * copy_data_segment macro and we might want to + * copy the current value of x later on */ + src--; + } + + 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