diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2016-01-21 15:52:24 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2016-05-09 16:52:22 +0800 |
commit | 6dc412c17c16fa3735631cf0a9629bad526499dd (patch) | |
tree | 9c313476474b48e4d20c242a2fe9319ca410266f /src/i965_encoder_utils.c | |
parent | d0edf06d89a52dc6b098a60646ffe2c1d3cdcbe7 (diff) | |
download | libva-intel-driver-6dc412c17c16fa3735631cf0a9629bad526499dd.tar.gz |
Make intel_avc_find_skipemulcnt() a public function
In addition, move intel_avc_find_skipemulcnt() to i965_encoder_utils.c
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Reviewed-By: Sean V Kelley <sean.v.kelley@intel.com>
Diffstat (limited to 'src/i965_encoder_utils.c')
-rw-r--r-- | src/i965_encoder_utils.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/i965_encoder_utils.c b/src/i965_encoder_utils.c index bb8dbe4d..ac58cd1a 100644 --- a/src/i965_encoder_utils.c +++ b/src/i965_encoder_utils.c @@ -1134,3 +1134,56 @@ int build_hevc_slice_header(VAEncSequenceParameterBufferHEVC *seq_param, *header_buffer = (unsigned char *)bs.buffer; return bs.bit_offset; } + +int +intel_avc_find_skipemulcnt(unsigned char *buf, int bits_length) +{ + int i, found; + int leading_zero_cnt, byte_length, zero_byte; + int nal_unit_type; + int skip_cnt = 0; + +#define NAL_UNIT_TYPE_MASK 0x1f +#define HW_MAX_SKIP_LENGTH 15 + + byte_length = ALIGN(bits_length, 32) >> 3; + + + leading_zero_cnt = 0; + found = 0; + for(i = 0; i < byte_length - 4; i++) { + if (((buf[i] == 0) && (buf[i + 1] == 0) && (buf[i + 2] == 1)) || + ((buf[i] == 0) && (buf[i + 1] == 0) && (buf[i + 2] == 0) && (buf[i + 3] == 1))) { + found = 1; + break; + } + leading_zero_cnt++; + } + if (!found) { + /* warning message is complained. But anyway it will be inserted. */ + WARN_ONCE("Invalid packed header data. " + "Can't find the 000001 start_prefix code\n"); + return 0; + } + i = leading_zero_cnt; + + zero_byte = 0; + if (!((buf[i] == 0) && (buf[i + 1] == 0) && (buf[i + 2] == 1))) + zero_byte = 1; + + skip_cnt = leading_zero_cnt + zero_byte + 3; + + /* the unit header byte is accounted */ + nal_unit_type = (buf[skip_cnt]) & NAL_UNIT_TYPE_MASK; + skip_cnt += 1; + + if (nal_unit_type == 14 || nal_unit_type == 20 || nal_unit_type == 21) { + /* more unit header bytes are accounted for MVC/SVC */ + skip_cnt += 3; + } + if (skip_cnt > HW_MAX_SKIP_LENGTH) { + WARN_ONCE("Too many leading zeros are padded for packed data. " + "It is beyond the HW range.!!!\n"); + } + return skip_cnt; +} |