VAStatus vaStatus = VA_STATUS_SUCCESS;
int i, j, enable_avc_ildb = 0;
VAEncSliceParameterBufferH264 *slice_param;
- VACodedBufferSegment *coded_buffer_segment;
- unsigned char *flag = NULL;
+ struct i965_coded_buffer_segment *coded_buffer_segment;
VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
int width_in_mbs = pSequenceParameter->picture_width_in_mbs;
int height_in_mbs = pSequenceParameter->picture_height_in_mbs;
dri_bo_reference(mfc_context->mfc_indirect_pak_bse_object.bo);
dri_bo_map(bo, 1);
- coded_buffer_segment = (VACodedBufferSegment *)bo->virtual;
- flag = (unsigned char *)(coded_buffer_segment + 1);
- *flag = 0;
+ coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
+ coded_buffer_segment->mapped = 0;
+ coded_buffer_segment->codec = CODED_H264;
dri_bo_unmap(bo);
return vaStatus;
struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
VAEncSequenceParameterBufferMPEG2 *seq_param = (VAEncSequenceParameterBufferMPEG2 *)encode_state->seq_param_ext->buffer;
VAEncSliceParameterBufferMPEG2 *slice_param = NULL;
- unsigned int tail_data[] = {0x0, 0x0, 0x0, 0x0};
+ unsigned char tail_delimiter[] = {MPEG2_DELIMITER0, MPEG2_DELIMITER1, MPEG2_DELIMITER2, MPEG2_DELIMITER3, MPEG2_DELIMITER4, 0, 0, 0};
+ unsigned char section_delimiter[] = {0x0, 0x0, 0x0, 0x0};
int width_in_mbs = ALIGN(seq_param->picture_width, 16) / 16;
int height_in_mbs = ALIGN(seq_param->picture_height, 16) / 16;
int i, j;
if (slice_index == 0)
intel_mfc_mpeg2_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
- /* FIXME: remove this insertion, instead insert slice header */
+ /* Insert '00' to make sure the header is valid */
mfc_context->insert_object(ctx,
encoder_context,
- tail_data,
- 1,
- 8,
+ (unsigned int*)section_delimiter,
1,
+ 8, /* 8bits in the last DWORD */
+ 1, /* 1 byte */
1,
0,
0,
if (next_slice_group_param == NULL) { /* end of a picture */
mfc_context->insert_object(ctx,
encoder_context,
- tail_data,
- 2,
- 8,
+ (unsigned int *)tail_delimiter,
2,
+ 8, /* 8bits in the last DWORD */
+ 5, /* 5 bytes */
1,
1,
0,
} else { /* end of a lsice group */
mfc_context->insert_object(ctx,
encoder_context,
- tail_data,
- 1,
- 8,
+ (unsigned int *)section_delimiter,
1,
+ 8, /* 8bits in the last DWORD */
+ 1, /* 1 byte */
1,
1,
0,
struct object_surface *obj_surface;
struct object_buffer *obj_buffer;
VAEncPictureParameterBufferMPEG2 *pic_param = (VAEncPictureParameterBufferMPEG2 *)encode_state->pic_param_ext->buffer;
- VACodedBufferSegment *coded_buffer_segment;
- unsigned char *flag = NULL;
+ struct i965_coded_buffer_segment *coded_buffer_segment;
VAStatus vaStatus = VA_STATUS_SUCCESS;
dri_bo *bo;
int i;
/* set the internal flag to 0 to indicate the coded size is unknown */
dri_bo_map(bo, 1);
- coded_buffer_segment = (VACodedBufferSegment *)bo->virtual;
- flag = (unsigned char *)(coded_buffer_segment + 1);
- *flag = 0;
+ coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
+ coded_buffer_segment->mapped = 0;
+ coded_buffer_segment->codec = CODED_MPEG2;
dri_bo_unmap(bo);
return vaStatus;
assert(buffer_store->bo);
if (type == VAEncCodedBufferType) {
- VACodedBufferSegment *coded_buffer_segment;
- unsigned char *flag = NULL;
+ struct i965_coded_buffer_segment *coded_buffer_segment;
+
dri_bo_map(buffer_store->bo, 1);
- coded_buffer_segment = (VACodedBufferSegment *)buffer_store->bo->virtual;
- coded_buffer_segment->size = size - I965_CODEDBUFFER_HEADER_SIZE;
- coded_buffer_segment->bit_offset = 0;
- coded_buffer_segment->status = 0;
- coded_buffer_segment->buf = NULL;
- coded_buffer_segment->next = NULL;
- flag = (unsigned char *)(coded_buffer_segment + 1);
- *flag = 0;
+ coded_buffer_segment = (struct i965_coded_buffer_segment *)buffer_store->bo->virtual;
+ coded_buffer_segment->base.size = size - I965_CODEDBUFFER_HEADER_SIZE;
+ coded_buffer_segment->base.bit_offset = 0;
+ coded_buffer_segment->base.status = 0;
+ coded_buffer_segment->base.buf = NULL;
+ coded_buffer_segment->base.next = NULL;
+ coded_buffer_segment->mapped = 0;
+ coded_buffer_segment->codec = 0;
dri_bo_unmap(buffer_store->bo);
} else if (data) {
dri_bo_subdata(buffer_store->bo, 0, size * num_elements, data);
if (obj_buffer->type == VAEncCodedBufferType) {
int i;
unsigned char *buffer = NULL;
- VACodedBufferSegment *coded_buffer_segment = (VACodedBufferSegment *)(obj_buffer->buffer_store->bo->virtual);
- unsigned char *flag = (unsigned char *)(coded_buffer_segment + 1);
+ struct i965_coded_buffer_segment *coded_buffer_segment = (struct i965_coded_buffer_segment *)(obj_buffer->buffer_store->bo->virtual);
+
+ if (!coded_buffer_segment->mapped) {
+ unsigned char delimiter0, delimiter1, delimiter2, delimiter3, delimiter4;
+
+ coded_buffer_segment->base.buf = buffer = (unsigned char *)(obj_buffer->buffer_store->bo->virtual) + I965_CODEDBUFFER_HEADER_SIZE;
+
+ if (coded_buffer_segment->codec == CODED_H264) {
+ delimiter0 = H264_DELIMITER0;
+ delimiter1 = H264_DELIMITER1;
+ delimiter2 = H264_DELIMITER2;
+ delimiter3 = H264_DELIMITER3;
+ delimiter4 = H264_DELIMITER4;
+ } else if (coded_buffer_segment->codec == CODED_MPEG2) {
+ delimiter0 = MPEG2_DELIMITER0;
+ delimiter1 = MPEG2_DELIMITER1;
+ delimiter2 = MPEG2_DELIMITER2;
+ delimiter3 = MPEG2_DELIMITER3;
+ delimiter4 = MPEG2_DELIMITER4;
+ } else {
+ assert(0);
+ }
- if (*flag != 1) {
- coded_buffer_segment->buf = buffer = (unsigned char *)(obj_buffer->buffer_store->bo->virtual) + I965_CODEDBUFFER_HEADER_SIZE;
-
for (i = 0; i < obj_buffer->size_element - I965_CODEDBUFFER_HEADER_SIZE - 3 - 0x1000; i++) {
- if (!buffer[i] &&
- !buffer[i + 1] &&
- !buffer[i + 2] &&
- !buffer[i + 3] &&
- !buffer[i + 4])
+ if ((buffer[i] == delimiter0) &&
+ (buffer[i + 1] == delimiter1) &&
+ (buffer[i + 2] == delimiter2) &&
+ (buffer[i + 3] == delimiter3) &&
+ (buffer[i + 4] == delimiter4))
break;
}
if (i == obj_buffer->size_element - I965_CODEDBUFFER_HEADER_SIZE - 3 - 0x1000) {
- coded_buffer_segment->status |= VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK;
+ coded_buffer_segment->base.status |= VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK;
}
- coded_buffer_segment->size = i;
- *flag = 1;
+ coded_buffer_segment->base.size = i;
+ coded_buffer_segment->mapped = 1;
} else {
- assert(coded_buffer_segment->buf);
+ assert(coded_buffer_segment->base.buf);
}
}
int
va_enc_packed_type_to_idx(int packed_type);
-/* reserve 1 byte for internal using */
-#define I965_CODEDBUFFER_HEADER_SIZE ALIGN(sizeof(VACodedBufferSegment) + 1, 64)
+/* reserve 2 byte for internal using */
+#define CODED_H264 0
+#define CODED_MPEG2 1
+
+#define H264_DELIMITER0 0x00
+#define H264_DELIMITER1 0x00
+#define H264_DELIMITER2 0x00
+#define H264_DELIMITER3 0x00
+#define H264_DELIMITER4 0x00
+
+#define MPEG2_DELIMITER0 0x00
+#define MPEG2_DELIMITER1 0x00
+#define MPEG2_DELIMITER2 0x00
+#define MPEG2_DELIMITER3 0x00
+#define MPEG2_DELIMITER4 0xb0
+
+struct i965_coded_buffer_segment
+{
+ VACodedBufferSegment base;
+ unsigned char mapped;
+ unsigned char codec;
+};
+
+#define I965_CODEDBUFFER_HEADER_SIZE ALIGN(sizeof(struct i965_coded_buffer_segment), 64)
extern VAStatus i965_MapBuffer(VADriverContextP ctx,