[FFmpeg-devel] [PATCH] avcodec/utils/avpriv_find_start_code: optimization. If HAVE_FAST_UNALIGNED is true, handle "1 + sizeof(long)" bytes per step.

Michael Niedermayer michaelni at gmx.at
Thu Jan 1 04:49:22 CET 2015


On Thu, Jan 01, 2015 at 10:13:58AM +0800, zhaoxiu.zeng wrote:
>  libavcodec/utils.c | 68 ++++++++++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 56 insertions(+), 12 deletions(-)
> 
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 1ec5cae..14a43e2 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -3772,30 +3772,74 @@ const uint8_t *avpriv_find_start_code(const uint8_t *av_restrict p,
>                                        uint32_t *av_restrict state)
>  {
>      int i;
> +    uint32_t stat;
>  
>      av_assert0(p <= end);
>      if (p >= end)
>          return end;
>  
> +    stat = *state;
>      for (i = 0; i < 3; i++) {
> -        uint32_t tmp = *state << 8;
> -        *state = tmp + *(p++);
> -        if (tmp == 0x100 || p == end)
> +        uint32_t tmp = stat << 8;
> +        stat = tmp + *(p++);
> +        if (tmp == 0x100 || p == end) {
> +            *state = stat;
>              return p;
> +        }
>      }
>  
> -    while (p < end) {
> -        if      (p[-1] > 1      ) p += 3;
> -        else if (p[-2]          ) p += 2;
> -        else if (p[-3]|(p[-1]-1)) p++;
> -        else {
> +#if HAVE_FAST_UNALIGNED
> +#if HAVE_FAST_64BIT
> +    for (; p + 6 <= end; p += 9) {
> +        uint64_t t = AV_RN64A(p - 2);
> +        if (!((t - 0x0100010001000101ULL) & ~(t | 0x7fff7fff7fff7f7fULL)))
> +            continue;
> +#else
> +    for (; p + 2 <= end; p += 5) {
> +        uint32_t t = AV_RN32A(p - 2);
> +        if (!((t - 0x01000101U) & ~(t | 0x7fff7f7fU)))
> +            continue;
> +#endif
> +        /* find the first zero byte in t */
> +#if HAVE_BIGENDIAN
> +        while (t >> (sizeof(t) * 8 - 8)) {
> +            t <<= 8;
> +            p++;
> +        }
> +#else
> +        while (t & 0xff) {
> +            t >>= 8;
> +            p++;
> +        }
> +#endif

this maybe can be simplified by using ff_startcode_find_candidate_c()


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Frequently ignored answer#1 FFmpeg bugs should be sent to our bugtracker. User
questions about the command line tools should be sent to the ffmpeg-user ML.
And questions about how to use libav* should be sent to the libav-user ML.
-------------- 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/20150101/3edc6135/attachment.asc>


More information about the ffmpeg-devel mailing list