summaryrefslogtreecommitdiff
path: root/i965_drv_video/i965_media_mpeg2.c
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2010-04-06 15:06:45 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2010-04-06 15:07:52 +0800
commit85ea7684cc3e4e6caee7c20f8e2a21ddd089ff9d (patch)
tree7636c7e001e5acbb6072e08d929c92a4f19f5606 /i965_drv_video/i965_media_mpeg2.c
parentf578063d4a1db156ef10f6bab3565f37cb7a5bd5 (diff)
downloadlibva-85ea7684cc3e4e6caee7c20f8e2a21ddd089ff9d.tar.gz
i965_drv_video: multiple slices in a picture for H.264
Diffstat (limited to 'i965_drv_video/i965_media_mpeg2.c')
-rw-r--r--i965_drv_video/i965_media_mpeg2.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/i965_drv_video/i965_media_mpeg2.c b/i965_drv_video/i965_media_mpeg2.c
index eaed1e9..c966904 100644
--- a/i965_drv_video/i965_media_mpeg2.c
+++ b/i965_drv_video/i965_media_mpeg2.c
@@ -851,30 +851,33 @@ i965_media_mpeg2_states_setup(VADriverContextP ctx, struct decode_state *decode_
static void
i965_media_mpeg2_objects(VADriverContextP ctx, struct decode_state *decode_state)
{
- int i;
+ int i, j;
VASliceParameterBufferMPEG2 *slice_param;
- assert(decode_state->slice_param && decode_state->slice_param->buffer);
- slice_param = (VASliceParameterBufferMPEG2 *)decode_state->slice_param->buffer;
-
- for (i = 0; i < decode_state->num_slices; i++) {
- assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
-
- BEGIN_BATCH(ctx, 6);
- OUT_BATCH(ctx, CMD_MEDIA_OBJECT | 4);
- OUT_BATCH(ctx, 0);
- OUT_BATCH(ctx, slice_param->slice_data_size - (slice_param->macroblock_offset >> 3));
- OUT_RELOC(ctx, decode_state->slice_data->bo,
- I915_GEM_DOMAIN_SAMPLER, 0,
- slice_param->slice_data_offset + (slice_param->macroblock_offset >> 3));
- OUT_BATCH(ctx,
- ((slice_param->slice_horizontal_position << 24) |
- (slice_param->slice_vertical_position << 16) |
- (127 << 8) |
- (slice_param->macroblock_offset & 0x7)));
- OUT_BATCH(ctx, slice_param->quantiser_scale_code << 24);
- ADVANCE_BATCH(ctx);
- slice_param++;
+ for (j = 0; j < decode_state->num_slice_params; j++) {
+ assert(decode_state->slice_params[j] && decode_state->slice_params[j]->buffer);
+ assert(decode_state->slice_datas[j] && decode_state->slice_datas[j]->bo);
+ slice_param = (VASliceParameterBufferMPEG2 *)decode_state->slice_params[j]->buffer;
+
+ for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
+ assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
+
+ BEGIN_BATCH(ctx, 6);
+ OUT_BATCH(ctx, CMD_MEDIA_OBJECT | 4);
+ OUT_BATCH(ctx, 0);
+ OUT_BATCH(ctx, slice_param->slice_data_size - (slice_param->macroblock_offset >> 3));
+ OUT_RELOC(ctx, decode_state->slice_datas[j]->bo,
+ I915_GEM_DOMAIN_SAMPLER, 0,
+ slice_param->slice_data_offset + (slice_param->macroblock_offset >> 3));
+ OUT_BATCH(ctx,
+ ((slice_param->slice_horizontal_position << 24) |
+ (slice_param->slice_vertical_position << 16) |
+ (127 << 8) |
+ (slice_param->macroblock_offset & 0x7)));
+ OUT_BATCH(ctx, slice_param->quantiser_scale_code << 24);
+ ADVANCE_BATCH(ctx);
+ slice_param++;
+ }
}
}