diff options
author | Anton Khirnov <anton@khirnov.net> | 2015-06-30 15:19:52 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2015-07-08 23:38:32 +0200 |
commit | 69ab9f53f901eac6a649e22d28cf093357870627 (patch) | |
tree | e60f34f4bf7444be31ac32f10b5b97ad209e810c /libavcodec/hevc.c | |
parent | fd124d8357b1becfde3ac8d5e3320127cf97a5b7 (diff) | |
download | ffmpeg-69ab9f53f901eac6a649e22d28cf093357870627.tar.gz |
hevc: split bitstream unescaping to a separate file
It will be useful in the QSV HEVC encoder.
Diffstat (limited to 'libavcodec/hevc.c')
-rw-r--r-- | libavcodec/hevc.c | 103 |
1 files changed, 1 insertions, 102 deletions
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index 97014391f2..ce4533e639 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -2643,107 +2643,6 @@ fail: return 0; } -/* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication - * between these functions would be nice. */ -static int extract_rbsp(const uint8_t *src, int length, - HEVCNAL *nal) -{ - int i, si, di; - uint8_t *dst; - -#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 - 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 - for (i = 0; i + 1 < length; i += 5) { - if (!((~AV_RN32A(src + i) & - (AV_RN32A(src + i) - 0x01000101U)) & - 0x80008080U)) - continue; - FIND_FIRST_ZERO; - STARTCODE_TEST; - i -= 3; - } -#endif /* HAVE_FAST_64BIT */ -#else - for (i = 0; i + 1 < length; i += 2) { - if (src[i]) - continue; - if (i > 0 && src[i - 1] == 0) - i--; - STARTCODE_TEST; - } -#endif /* HAVE_FAST_UNALIGNED */ - - if (i >= length - 1) { // no escaped 0 - nal->data = - nal->raw_data = src; - nal->size = - nal->raw_size = length; - return length; - } - - av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size, - length + FF_INPUT_BUFFER_PADDING_SIZE); - if (!nal->rbsp_buffer) - return AVERROR(ENOMEM); - - dst = nal->rbsp_buffer; - - memcpy(dst, src, i); - si = di = i; - while (si + 2 < length) { - // remove escapes (very rare 1:2^22) - if (src[si + 2] > 3) { - dst[di++] = src[si++]; - dst[di++] = src[si++]; - } else if (src[si] == 0 && src[si + 1] == 0) { - if (src[si + 2] == 3) { // escape - dst[di++] = 0; - dst[di++] = 0; - si += 3; - - continue; - } else // next start code - goto nsc; - } - - dst[di++] = src[si++]; - } - while (si < length) - dst[di++] = src[si++]; - -nsc: - memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE); - - nal->data = dst; - nal->size = di; - nal->raw_data = src; - nal->raw_size = si; - return si; -} - static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) { int i, consumed, ret = 0; @@ -2800,7 +2699,7 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) } nal = &s->nals[s->nb_nals++]; - consumed = extract_rbsp(buf, extract_length, nal); + consumed = ff_hevc_extract_rbsp(buf, extract_length, nal); if (consumed < 0) { ret = consumed; goto fail; |