intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
- dri_bo_map(vme_context->vme_output.bo , 1);
+ dri_bo_map(vme_context->vme_output.bo, 1);
msg = (unsigned int *)vme_context->vme_output.bo->virtual;
if (is_intra) {
qp_slice,
slice_batch);
- if (slice_index == 0)
+ if (slice_index == 0) {
+ intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+ }
intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
vaStatus = gen6_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
break;
- /* FIXME: add for other profile */
default:
vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
break;
Bool gen8_mfc_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context);
extern void
+intel_avc_insert_aud_packed_data(VADriverContextP ctx,
+ struct encode_state *encode_state,
+ struct intel_encoder_context *encoder_context,
+ struct intel_batchbuffer *batch);
+
+extern void
intel_avc_slice_insert_packed_data(VADriverContextP ctx,
struct encode_state *encode_state,
struct intel_encoder_context *encoder_context,
}
}
+#define AVC_NAL_DELIMITER 9
+void
+intel_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;
+ struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
+
+ 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) {
+ mfc_context->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,
+ batch);
+ break;
+ }
+ }
+}
+
+
void intel_avc_slice_insert_packed_data(VADriverContextP ctx,
struct encode_state *encode_state,
struct intel_encoder_context *encoder_context,
unsigned int *header_data = NULL;
struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
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/AUD 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.
*/
encode_state, encoder_context,
(rate_control_mode != VA_RC_CQP), qp_slice, slice_batch);
- if (slice_index == 0)
+ if (slice_index == 0) {
+ intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+ }
intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
- dri_bo_map(vme_context->vme_output.bo , 1);
+ dri_bo_map(vme_context->vme_output.bo, 1);
msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
if (is_intra) {
int mb_x, mb_y;
int last_mb, slice_end_x, slice_end_y;
int remaining_mb = total_mbs;
- uint32_t fwd_ref , bwd_ref, mb_flag;
+ uint32_t fwd_ref, bwd_ref, mb_flag;
last_mb = slice_param->macroblock_address + total_mbs - 1;
slice_end_x = last_mb % width_in_mbs;
qp_slice,
slice_batch);
- if (slice_index == 0)
+ if (slice_index == 0) {
+ intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+ }
intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
v_start_pos = slice_param->macroblock_address / width_in_mbs;
assert(h_start_pos + slice_param->num_macroblocks <= width_in_mbs);
- dri_bo_map(vme_context->vme_output.bo , 0);
+ dri_bo_map(vme_context->vme_output.bo, 0);
msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
if (next_slice_group_param) {
vaStatus = gen75_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
break;
- /* FIXME: add for other profile */
case VAProfileMPEG2Simple:
case VAProfileMPEG2Main:
vaStatus = gen75_mfc_mpeg2_encode_picture(ctx, encode_state, encoder_context);
encode_state, encoder_context,
(rate_control_mode != VA_RC_CQP), qp_slice, slice_batch);
- if (slice_index == 0)
+ if (slice_index == 0) {
+ intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+ }
intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
- dri_bo_map(vme_context->vme_output.bo , 1);
+ dri_bo_map(vme_context->vme_output.bo, 1);
msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
if (is_intra) {
int mb_x, mb_y;
int last_mb, slice_end_x, slice_end_y;
int remaining_mb = total_mbs;
- uint32_t fwd_ref , bwd_ref, mb_flag;
+ uint32_t fwd_ref, bwd_ref, mb_flag;
char tmp_qp;
int number_roi_mbs, max_mb_cmds, i;
qp_slice,
slice_batch);
- if (slice_index == 0)
+ if (slice_index == 0) {
+ intel_avc_insert_aud_packed_data(ctx, encode_state, encoder_context, slice_batch);
intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+ }
intel_avc_slice_insert_packed_data(ctx, encode_state, encoder_context, slice_index, slice_batch);
v_start_pos = slice_param->macroblock_address / width_in_mbs;
assert(h_start_pos + slice_param->num_macroblocks <= width_in_mbs);
- dri_bo_map(vme_context->vme_output.bo , 0);
+ dri_bo_map(vme_context->vme_output.bo, 0);
msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
if (next_slice_group_param) {
is_intra_frame = !pic_param->pic_flags.bits.frame_type;
- dri_bo_map(vme_context->vme_output.bo , 1);
+ dri_bo_map(vme_context->vme_output.bo, 1);
msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
for (i = 0; i < width_in_mbs * height_in_mbs; i++) {
vaStatus = gen8_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
break;
- /* FIXME: add for other profile */
case VAProfileMPEG2Simple:
case VAProfileMPEG2Main:
vaStatus = gen8_mfc_mpeg2_encode_picture(ctx, encode_state, encoder_context);