From: Michael Niedermayer Date: Thu, 8 Aug 2013 10:38:10 +0000 (+0200) Subject: Merge commit '218d6844b37d339ffbf2044ad07d8be7767e2734' X-Git-Tag: n2.1~1584 X-Git-Url: http://git.ffmpeg.org/gitweb/ffmpeg.git/commitdiff_plain/c0f2ad3dbdeada7ba43b0510580467718f1334ca Merge commit '218d6844b37d339ffbf2044ad07d8be7767e2734' * commit '218d6844b37d339ffbf2044ad07d8be7767e2734': h264dsp: Factorize code into a new function, h264_find_start_code_candidate Conflicts: libavcodec/h264_parser.c Merged-by: Michael Niedermayer --- c0f2ad3dbdeada7ba43b0510580467718f1334ca diff --cc libavcodec/h264_parser.c index 1d27fe2,ef5da98..a16366a --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@@ -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 diff --cc libavcodec/h264dsp.c index d7238b1,a901dbb..72f699f --- a/libavcodec/h264dsp.c +++ b/libavcodec/h264dsp.c @@@ -62,6 -53,34 +62,34 @@@ #include "h264addpx_template.c" #undef BIT_DEPTH + 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. + */ -#if HAVE_FAST_64BIT ++# if HAVE_FAST_64BIT + while (i < size && + !((~*(const uint64_t *)(buf + i) & + (*(const uint64_t *)(buf + i) - 0x0101010101010101ULL)) & + 0x8080808080808080ULL)) + i += 8; -#else ++# else + while (i < size && + !((~*(const uint32_t *)(buf + i) & + (*(const uint32_t *)(buf + i) - 0x01010101U)) & + 0x80808080U)) + i += 4; -#endif ++# 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) {