diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-07-23 07:46:10 +0400 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2012-07-23 18:27:53 +0400 |
commit | 58db34aa1e6c4cb1d876d0abc497c5e902da857e (patch) | |
tree | e767c1f38d5b3615eb0088b30caa035b7cd2d81c /libavcodec/h264.c | |
parent | 08cd95e8a37674401ed24e5e6f4f7402edb7fdeb (diff) |
h264: refactor NAL decode loop
Write out the NAL decoding loops in full so that they are easier
to parse for a preprocessor without it having to be aware of macros
or other such things in C code.
This also makes the code more readable.
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r-- | libavcodec/h264.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index a4afcc870e..dcb9e00c43 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -175,42 +175,50 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, src++; length--; +#define STARTCODE_TEST \ + if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \ + if (src[i + 2] != 3) { \ + /* startcode, so we must be past the end */ \ + length = i; \ + } \ + break; \ + } #if HAVE_FAST_UNALIGNED +#define FIND_FIRST_ZERO \ + if (i > 0 && !src[i]) \ + i--; \ + while (src[i]) \ + i++ #if HAVE_FAST_64BIT -#define RS 7 for (i = 0; i + 1 < length; i += 9) { if (!((~AV_RN64A(src + i) & (AV_RN64A(src + i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL)) + continue; + FIND_FIRST_ZERO; + STARTCODE_TEST; + i -= 7; + } #else -#define RS 3 for (i = 0; i + 1 < length; i += 5) { if (!((~AV_RN32A(src + i) & (AV_RN32A(src + i) - 0x01000101U)) & 0x80008080U)) -#endif continue; - if (i > 0 && !src[i]) - i--; - while (src[i]) - i++; + FIND_FIRST_ZERO; + STARTCODE_TEST; + i -= 3; + } +#endif #else -#define RS 0 for (i = 0; i + 1 < length; i += 2) { if (src[i]) continue; if (i > 0 && src[i - 1] == 0) i--; -#endif - if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { - if (src[i + 2] != 3) { - /* startcode, so we must be past the end */ - length = i; - } - break; - } - i -= RS; + STARTCODE_TEST; } +#endif if (i >= length - 1) { // no escaped 0 *dst_length = length; |