diff options
author | carpalis <jerome.borsboom@carpalis.nl> | 2017-10-23 12:05:35 +0200 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2018-01-05 14:57:31 +0800 |
commit | 78659bf0eb78509a8c139842265df87f029c0487 (patch) | |
tree | 4134e66908b89b6298d02e10c1369f2384248c49 /src/gen8_mfd.c | |
parent | 0c2ce9e79bcc917b4469faf85b4f18f6936d5940 (diff) | |
download | libva-intel-driver-78659bf0eb78509a8c139842265df87f029c0487.tar.gz |
genX_mfd: align dmv buffer use with VC-1 spec and PRM
As stated in VC-1 spec, the direct MV buffer will be written when
decoding a P frame. Subsequently, the direct MV buffer is read when
decoding a B frame that backward references this P frame.
Signed-off-by: Jerome Borsboom <jerome.borsboom@carpalis.nl>
Diffstat (limited to 'src/gen8_mfd.c')
-rw-r--r-- | src/gen8_mfd.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c index d5c76a18..51f3bcf0 100644 --- a/src/gen8_mfd.c +++ b/src/gen8_mfd.c @@ -1595,11 +1595,8 @@ gen8_mfd_vc1_pic_state(VADriverContextP ctx, if (obj_surface) gen7_vc1_surface = obj_surface->private_data; - if (!gen7_vc1_surface || - (gen7_vc1_surface->picture_type == GEN7_VC1_I_PICTURE || - gen7_vc1_surface->picture_type == GEN7_VC1_BI_PICTURE)) - dmv_surface_valid = 0; - else + if (gen7_vc1_surface && + gen7_vc1_surface->picture_type == GEN7_VC1_P_PICTURE) dmv_surface_valid = 1; } @@ -1772,20 +1769,27 @@ gen8_mfd_vc1_directmode_state(VADriverContextP ctx, struct gen7_mfd_context *gen7_mfd_context) { struct i965_driver_data *i965 = i965_driver_data(ctx); + VAPictureParameterBufferVC1 *pic_param; struct intel_batchbuffer *batch = gen7_mfd_context->base.batch; struct object_surface *obj_surface; dri_bo *dmv_read_buffer = NULL, *dmv_write_buffer = NULL; + int picture_type; - obj_surface = decode_state->render_object; + pic_param = (VAPictureParameterBufferVC1 *)decode_state->pic_param->buffer; + picture_type = pic_param->picture_fields.bits.picture_type; - if (obj_surface && obj_surface->private_data) { + if (picture_type == GEN7_VC1_P_PICTURE || + picture_type == GEN7_VC1_SKIPPED_PICTURE) { + obj_surface = decode_state->render_object; dmv_write_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv; } - obj_surface = decode_state->reference_objects[1]; - - if (obj_surface && obj_surface->private_data) { - dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv; + if (picture_type == GEN7_VC1_B_PICTURE) { + obj_surface = decode_state->reference_objects[1]; + if (pic_param->backward_reference_picture != VA_INVALID_ID && + obj_surface) { + dmv_read_buffer = ((struct gen7_vc1_surface *)(obj_surface->private_data))->dmv; + } } BEGIN_BCS_BATCH(batch, 7); |