struct intel_batchbuffer *slice_batch)
{
struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
- static int count = 0;
- unsigned int rate_control_mode = encoder_context->rate_control_mode;
+ int idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SPS);
- if (encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) {
+ if (encode_state->packed_header_data[idx]) {
VAEncPackedHeaderParameterBuffer *param = NULL;
- unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]->buffer;
+ unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
unsigned int length_in_bits;
- assert(encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]);
- param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_SPS]->buffer;
+ assert(encode_state->packed_header_param[idx]);
+ param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
length_in_bits = param->bit_length;
mfc_context->insert_object(ctx,
slice_batch);
}
- if (encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]) {
+ idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_PPS);
+
+ if (encode_state->packed_header_data[idx]) {
VAEncPackedHeaderParameterBuffer *param = NULL;
- unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[VAEncPackedHeaderH264_PPS]->buffer;
+ unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
unsigned int length_in_bits;
- assert(encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]);
- param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[VAEncPackedHeaderH264_PPS]->buffer;
+ assert(encode_state->packed_header_param[idx]);
+ param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
length_in_bits = param->bit_length;
mfc_context->insert_object(ctx,
slice_batch);
}
- if ( (rate_control_mode == VA_RC_CBR) && encode_state->packed_header_data[VAEncPackedHeaderH264_SPS]) { // this is frist AU
- struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
+ idx = va_enc_packed_type_to_idx(VAEncPackedHeaderH264_SEI);
- unsigned char *sei_data = NULL;
- int length_in_bits = build_avc_sei_buffering_period(mfc_context->vui_hrd.i_initial_cpb_removal_delay_length,
- mfc_context->vui_hrd.i_initial_cpb_removal_delay, 0, &sei_data);
- mfc_context->insert_object(ctx,
- encoder_context,
- (unsigned int *)sei_data,
- ALIGN(length_in_bits, 32) >> 5,
- length_in_bits & 0x1f,
- 4,
- 0,
- 0,
- 1,
- slice_batch);
- free(sei_data);
- }
+ if (encode_state->packed_header_data[idx]) {
+ VAEncPackedHeaderParameterBuffer *param = NULL;
+ unsigned int *header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
+ unsigned int length_in_bits;
+
+ assert(encode_state->packed_header_param[idx]);
+ param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
+ length_in_bits = param->bit_length;
- // SEI pic_timing header
- if (rate_control_mode == VA_RC_CBR) {
- struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
- unsigned char *sei_data = NULL;
- int length_in_bits = build_avc_sei_pic_timing( mfc_context->vui_hrd.i_cpb_removal_delay_length,
- mfc_context->vui_hrd.i_cpb_removal_delay * mfc_context->vui_hrd.i_frame_number,
- mfc_context->vui_hrd.i_dpb_output_delay_length,
- 0, &sei_data);
mfc_context->insert_object(ctx,
encoder_context,
- (unsigned int *)sei_data,
+ header_data,
ALIGN(length_in_bits, 32) >> 5,
length_in_bits & 0x1f,
- 4,
- 0,
- 0,
- 1,
- slice_batch);
- free(sei_data);
- }
-
- count++;
+ 5, /* FIXME: check it */
+ 0,
+ 0,
+ !param->has_emulation_bytes,
+ slice_batch);
+ }
}
static void gen6_mfc_avc_pipeline_picture_programing( VADriverContextP ctx,
.max_height = 4096,
};
+#define I965_PACKED_HEADER_BASE 0
+#define I965_PACKED_MISC_HEADER_BASE 3
+
+int
+va_enc_packed_type_to_idx(int packed_type)
+{
+ int idx = 0;
+
+ if (packed_type & VAEncPackedHeaderMiscMask) {
+ idx = I965_PACKED_MISC_HEADER_BASE;
+ packed_type = (~VAEncPackedHeaderMiscMask & packed_type);
+ assert(packed_type > 0);
+ idx += (packed_type - 1);
+ } else {
+ idx = I965_PACKED_HEADER_BASE;
+
+ switch (packed_type) {
+ case VAEncPackedHeaderSequence:
+ idx = I965_PACKED_HEADER_BASE + 0;
+ break;
+
+ case VAEncPackedHeaderPicture:
+ idx = I965_PACKED_HEADER_BASE + 1;
+ break;
+
+ case VAEncPackedHeaderSlice:
+ idx = I965_PACKED_HEADER_BASE + 2;
+ break;
+
+ default:
+ /* Should not get here */
+ assert(0);
+ break;
+ }
+ }
+
+ assert(idx < 4);
+ return idx;
+}
+
+
VAStatus
i965_QueryConfigProfiles(VADriverContextP ctx,
VAProfile *profile_list, /* out */
case VAConfigAttribEncPackedHeaders:
if (entrypoint == VAEntrypointEncSlice) {
- attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE;
+ attrib_list[i].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE | VA_ENC_PACKED_HEADER_MISC;
break;
}
i965_encoder_render_packed_header_parameter_buffer(VADriverContextP ctx,
struct object_context *obj_context,
struct object_buffer *obj_buffer,
- VAEncPackedHeaderType type)
+ int type_index)
{
struct encode_state *encode = &obj_context->codec_state.encode;
assert(obj_buffer->buffer_store->bo == NULL);
assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&encode->packed_header_param[type]);
- i965_reference_buffer_store(&encode->packed_header_param[type], obj_buffer->buffer_store);
+ i965_release_buffer_store(&encode->packed_header_param[type_index]);
+ i965_reference_buffer_store(&encode->packed_header_param[type_index], obj_buffer->buffer_store);
return VA_STATUS_SUCCESS;
}
i965_encoder_render_packed_header_data_buffer(VADriverContextP ctx,
struct object_context *obj_context,
struct object_buffer *obj_buffer,
- VAEncPackedHeaderType type)
+ int type_index)
{
struct encode_state *encode = &obj_context->codec_state.encode;
assert(obj_buffer->buffer_store->bo == NULL);
assert(obj_buffer->buffer_store->buffer);
- i965_release_buffer_store(&encode->packed_header_data[type]);
- i965_reference_buffer_store(&encode->packed_header_data[type], obj_buffer->buffer_store);
+ i965_release_buffer_store(&encode->packed_header_data[type_index]);
+ i965_reference_buffer_store(&encode->packed_header_data[type_index], obj_buffer->buffer_store);
return VA_STATUS_SUCCESS;
}
vaStatus = i965_encoder_render_packed_header_parameter_buffer(ctx,
obj_context,
obj_buffer,
- encode->last_packed_header_type);
+ va_enc_packed_type_to_idx(encode->last_packed_header_type));
break;
}
assert(encode->last_packed_header_type == VAEncPackedHeaderSequence ||
encode->last_packed_header_type == VAEncPackedHeaderPicture ||
- encode->last_packed_header_type == VAEncPackedHeaderSlice);
+ encode->last_packed_header_type == VAEncPackedHeaderSlice ||
+ ((encode->last_packed_header_type & VAEncPackedHeaderMiscMask == VAEncPackedHeaderMiscMask) &&
+ (encode->last_packed_header_type & (~VAEncPackedHeaderMiscMask) != 0)));
vaStatus = i965_encoder_render_packed_header_data_buffer(ctx,
obj_context,
obj_buffer,
- encode->last_packed_header_type);
+ va_enc_packed_type_to_idx(encode->last_packed_header_type));
break;
}