Merge commit '218d6844b37d339ffbf2044ad07d8be7767e2734'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 8 Aug 2013 10:38:10 +0000 (12:38 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 8 Aug 2013 10:47:05 +0000 (12:47 +0200)
* commit '218d6844b37d339ffbf2044ad07d8be7767e2734':
  h264dsp: Factorize code into a new function, h264_find_start_code_candidate

Conflicts:
libavcodec/h264_parser.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/h264_parser.c
libavcodec/h264dsp.c
libavcodec/h264dsp.h

@@@ -47,48 -45,11 +47,27 @@@ static int h264_find_frame_end(H264Cont
      if (state > 13)
          state = 7;
  
 +    if (h->is_avc && !h->nal_length_size)
 +        av_log(h->avctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n");
 +
      for (i = 0; i < buf_size; i++) {
 +        if (i >= next_avc) {
 +            int nalsize = 0;
 +            i = next_avc;
 +            for (j = 0; j < h->nal_length_size; j++)
 +                nalsize = (nalsize << 8) | buf[i++];
 +            if (nalsize <= 0 || nalsize > buf_size - i) {
 +                av_log(h->avctx, AV_LOG_ERROR, "AVC-parser: nal size %d remaining %d\n", nalsize, buf_size - i);
 +                return buf_size;
 +            }
 +            next_avc = i + nalsize;
 +            state    = 5;
 +        }
 +
          if (state == 7) {
- #if HAVE_FAST_UNALIGNED
-             /* we check i < buf_size instead of i + 3 / 7 because it is
-              * simpler and there must be FF_INPUT_BUFFER_PADDING_SIZE
-              * bytes at the end.
-              */
- #    if HAVE_FAST_64BIT
-             while (i < next_avc &&
-                    !((~*(const uint64_t *)(buf + i) &
-                       (*(const uint64_t *)(buf + i) - 0x0101010101010101ULL)) &
-                       0x8080808080808080ULL))
-                 i += 8;
- #    else
-             while (i < next_avc &&
-                    !((~*(const uint32_t *)(buf + i) &
-                       (*(const uint32_t *)(buf + i) - 0x01010101U)) &
-                       0x80808080U))
-                 i += 4;
- #    endif
- #endif
-             for (; i < next_avc; i++)
-                 if (!buf[i]) {
-                     state = 2;
-                     break;
-                 }
 -            i += h->h264dsp.h264_find_start_code_candidate(buf + i, buf_size - i);
 -            if (i < buf_size)
++            i += h->h264dsp.h264_find_start_code_candidate(buf + i, next_avc - i);
++            if (i < next_avc)
+                 state = 2;
          } else if (state <= 2) {
              if (buf[i] == 1)
                  state ^= 5;            // 2->7, 1->4, 0->5
  #include "h264addpx_template.c"
  #undef BIT_DEPTH
  
 -#if HAVE_FAST_64BIT
+ static int h264_find_start_code_candidate_c(const uint8_t *buf, int size)
+ {
+     int i = 0;
+ #if HAVE_FAST_UNALIGNED
+     /* we check i < size instead of i + 3 / 7 because it is
+      * simpler and there must be FF_INPUT_BUFFER_PADDING_SIZE
+      * bytes at the end.
+      */
 -#else
++#       if HAVE_FAST_64BIT
+     while (i < size &&
+             !((~*(const uint64_t *)(buf + i) &
+                     (*(const uint64_t *)(buf + i) - 0x0101010101010101ULL)) &
+                     0x8080808080808080ULL))
+         i += 8;
 -#endif
++#       else
+     while (i < size &&
+             !((~*(const uint32_t *)(buf + i) &
+                     (*(const uint32_t *)(buf + i) - 0x01010101U)) &
+                     0x80808080U))
+         i += 4;
++#       endif
+ #endif
+     for (; i < size; i++)
+         if (!buf[i])
+             break;
+     return i;
+ }
  av_cold void ff_h264dsp_init(H264DSPContext *c, const int bit_depth,
                               const int chroma_format_idc)
  {
Simple merge