i965_release_buffer_store(&obj_context->codec_state.encode.slice_params_ext[i]);
free(obj_context->codec_state.encode.slice_params_ext);
+ if (obj_context->codec_state.encode.slice_rawdata_index) {
+ free(obj_context->codec_state.encode.slice_rawdata_index);
+ obj_context->codec_state.encode.slice_rawdata_index = NULL;
+ }
+ if (obj_context->codec_state.encode.slice_rawdata_count) {
+ free(obj_context->codec_state.encode.slice_rawdata_count);
+ obj_context->codec_state.encode.slice_rawdata_count = NULL;
+ }
+ for (i = 0; i < obj_context->codec_state.encode.num_packed_header_params_ext; i++)
+ i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_params_ext[i]);
+ free(obj_context->codec_state.encode.packed_header_params_ext);
+
+ for (i = 0; i < obj_context->codec_state.encode.num_packed_header_data_ext; i++)
+ i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_data_ext[i]);
+ free(obj_context->codec_state.encode.packed_header_data_ext);
+
} else {
assert(obj_context->codec_state.decode.num_slice_params <= obj_context->codec_state.decode.max_slice_params);
assert(obj_context->codec_state.decode.num_slice_datas <= obj_context->codec_state.decode.max_slice_datas);
obj_context->codec_state.encode.max_slice_params = NUM_SLICES;
obj_context->codec_state.encode.slice_params = calloc(obj_context->codec_state.encode.max_slice_params,
sizeof(*obj_context->codec_state.encode.slice_params));
+ obj_context->codec_state.encode.max_packed_header_params_ext = NUM_SLICES;
+ obj_context->codec_state.encode.packed_header_params_ext =
+ calloc(obj_context->codec_state.encode.max_packed_header_params_ext,
+ sizeof(struct buffer_store *));
+
+ obj_context->codec_state.encode.max_packed_header_data_ext = NUM_SLICES;
+ obj_context->codec_state.encode.packed_header_data_ext =
+ calloc(obj_context->codec_state.encode.max_packed_header_data_ext,
+ sizeof(struct buffer_store *));
+
+ obj_context->codec_state.encode.slice_num = NUM_SLICES;
+ obj_context->codec_state.encode.slice_rawdata_index =
+ calloc(obj_context->codec_state.encode.slice_num, sizeof(int));
+ obj_context->codec_state.encode.slice_rawdata_count =
+ calloc(obj_context->codec_state.encode.slice_num, sizeof(int));
+
assert(i965->codec_info->enc_hw_context_init);
obj_context->hw_context = i965->codec_info->enc_hw_context_init(ctx, obj_config);
} else {
obj_context->codec_state.encode.num_slice_params_ext = 0;
obj_context->codec_state.encode.current_render_target = render_target; /*This is input new frame*/
obj_context->codec_state.encode.last_packed_header_type = 0;
+ memset(obj_context->codec_state.encode.slice_rawdata_index, 0,
+ sizeof(int) * obj_context->codec_state.encode.slice_num);
+ memset(obj_context->codec_state.encode.slice_rawdata_count, 0,
+ sizeof(int) * obj_context->codec_state.encode.slice_num);
+
+ for (i = 0; i < obj_context->codec_state.encode.num_packed_header_params_ext; i++)
+ i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_params_ext[i]);
+ for (i = 0; i < obj_context->codec_state.encode.num_packed_header_data_ext; i++)
+ i965_release_buffer_store(&obj_context->codec_state.encode.packed_header_data_ext[i]);
+ obj_context->codec_state.encode.num_packed_header_params_ext = 0;
+ obj_context->codec_state.encode.num_packed_header_data_ext = 0;
} else {
obj_context->codec_state.decode.current_render_target = render_target;
i965_release_buffer_store(&obj_context->codec_state.decode.pic_param);
struct object_surface *reference_objects[16]; /* Up to 2 reference surfaces are valid for MPEG-2,*/
};
+#define SLICE_PACKED_DATA_INDEX_TYPE 0x80000000
+#define SLICE_PACKED_DATA_INDEX_MASK 0x00FFFFFF
+
struct encode_state
{
struct codec_state_base base;
struct buffer_store **slice_params_ext;
int max_slice_params_ext;
int num_slice_params_ext;
+
+ /* For the packed data that needs to be inserted into video clip */
+ /* currently it is mainly for packed raw data */
+ struct buffer_store **packed_header_params_ext;
+ int max_packed_header_params_ext;
+ int num_packed_header_params_ext;
+ struct buffer_store **packed_header_data_ext;
+ int max_packed_header_data_ext;
+ int num_packed_header_data_ext;
+
+ /* the array is determined by max_slice_params_ext */
+ int slice_num;
+ /* This is to store the first index of packed data for one slice */
+ int *slice_rawdata_index;
+ /* This is to store the number of packed data for one slice */
+ int *slice_rawdata_count;
+
int last_packed_header_type;
struct buffer_store *misc_param[16];