}
static void
+gen9_mfc_avc_insert_aud_packed_data(VADriverContextP ctx,
+ struct encode_state *encode_state,
+ struct intel_encoder_context *encoder_context,
+ struct intel_batchbuffer *batch)
+{
+ VAEncPackedHeaderParameterBuffer *param = NULL;
+ unsigned int length_in_bits;
+ unsigned int *header_data = NULL;
+ unsigned char *nal_type = NULL;
+ int count, i, start_index;
+
+ count = encode_state->slice_rawdata_count[0];
+ start_index = (encode_state->slice_rawdata_index[0] & SLICE_PACKED_DATA_INDEX_MASK);
+
+ for (i = 0; i < count; i++) {
+ unsigned int skip_emul_byte_cnt;
+
+ header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index + i]->buffer;
+ nal_type = (unsigned char *)header_data;
+
+ param = (VAEncPackedHeaderParameterBuffer *)(encode_state->packed_header_params_ext[start_index + i]->buffer);
+
+ length_in_bits = param->bit_length;
+
+ skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
+
+ if ((*(nal_type+skip_emul_byte_cnt-1)&0x1f) == AVC_NAL_DELIMITER ) {
+ gen9_mfc_avc_insert_object(ctx,
+ encoder_context,
+ header_data,
+ ALIGN(length_in_bits, 32) >> 5,
+ length_in_bits & 0x1f,
+ skip_emul_byte_cnt,
+ 0,
+ 0,
+ !param->has_emulation_bytes,
+ 0,
+ batch);
+ break;
+ }
+ }
+}
+
+static void
gen9_mfc_avc_insert_slice_packed_data(VADriverContextP ctx,
struct encode_state *encode_state,
struct intel_encoder_context *encoder_context,
unsigned int *header_data = NULL;
int count, i, start_index;
int slice_header_index;
+ unsigned char *nal_type = NULL;
if (encode_state->slice_header_index[slice_index] == 0)
slice_header_index = -1;
unsigned int skip_emul_byte_cnt;
header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index + i]->buffer;
+ nal_type = (unsigned char *)header_data;
param = (VAEncPackedHeaderParameterBuffer *)(encode_state->packed_header_params_ext[start_index + i]->buffer);
- /* skip the slice header packed data type as it is lastly inserted */
- if (param->type == VAEncPackedHeaderSlice)
- continue;
-
length_in_bits = param->bit_length;
skip_emul_byte_cnt = intel_avc_find_skipemulcnt((unsigned char *)header_data, length_in_bits);
+ /* skip the slice header packed data type as it is lastly inserted */
+ if (param->type == VAEncPackedHeaderSlice || (*(nal_type+skip_emul_byte_cnt-1)&0x1f) == AVC_NAL_DELIMITER)
+ continue;
+
/* as the slice header is still required, the last header flag is set to
* zero.
*/
unsigned int skip_emul_byte_cnt;
if (slice_index == 0) {
+
+ /* if AUD exist and insert it firstly */
+ gen9_mfc_avc_insert_aud_packed_data(ctx,encode_state,encoder_context,batch);
+
if (encode_state->packed_header_data[idx]) {
VAEncPackedHeaderParameterBuffer *param = NULL;
unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;