diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-23 21:04:06 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-23 21:25:09 +0200 |
commit | 2cb4d516549526b5e17e941f6d2375a2c501ade6 (patch) | |
tree | f472c62e0b34c2faaa955d51874cddb6be759910 /libavcodec/h264.c | |
parent | 7e15df7551cf45ad1d3e39d20fdc8d6c651d4705 (diff) | |
parent | d04c5293ce88927ad359ca276e287bfa63c2329d (diff) | |
download | ffmpeg-2cb4d516549526b5e17e941f6d2375a2c501ade6.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
v410dec: Implement explode mode support
zerocodec: fix direct rendering.
wav: init st to NULL to avoid a false-positive warning.
wavpack: set bits_per_raw_sample for S32 samples to properly identify 24-bit
h264: refactor NAL decode loop
RTMPTE protocol support
RTMPE protocol support
rtmp: Add ff_rtmp_calc_digest_pos()
rtmp: Rename rtmp_calc_digest to ff_rtmp_calc_digest and make it global
swscale: add missing HAVE_INLINE_ASM check.
lavfi: place x86 inline assembly under HAVE_INLINE_ASM.
vc1: Add a test for interlaced field pictures
swscale: Mark all init functions as av_cold
swscale: x86: Drop pointless _mmx suffix from filenames
lavf: use conditional notation for default codec in muxer declarations.
swscale: place inline assembly bilinear scaler under HAVE_INLINE_ASM.
dsputil: ppc: cosmetics: pretty-print
dsputil: x86: add SHUFFLE_MASK_W macro
configure: respect CC_O setting in check_cc
Conflicts:
Changelog
configure
libavcodec/v410dec.c
libavcodec/zerocodec.c
libavformat/asfenc.c
libavformat/version.h
libswscale/utils.c
libswscale/x86/swscale.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
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 0d3289458a..fdfc221ccd 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -188,42 +188,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 // use second escape buffer for inter data bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; |