diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2010-04-06 15:06:45 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2010-04-06 15:07:52 +0800 |
commit | 85ea7684cc3e4e6caee7c20f8e2a21ddd089ff9d (patch) | |
tree | 7636c7e001e5acbb6072e08d929c92a4f19f5606 /i965_drv_video/i965_media_mpeg2.c | |
parent | f578063d4a1db156ef10f6bab3565f37cb7a5bd5 (diff) | |
download | libva-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.c | 47 |
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++; + } } } |