summaryrefslogtreecommitdiff
path: root/src/gen8_mfd.c
diff options
context:
space:
mode:
authorcarpalis <jerome.borsboom@carpalis.nl>2017-10-23 12:05:35 +0200
committerXiang, Haihao <haihao.xiang@intel.com>2018-01-05 14:57:31 +0800
commit78659bf0eb78509a8c139842265df87f029c0487 (patch)
tree4134e66908b89b6298d02e10c1369f2384248c49 /src/gen8_mfd.c
parent0c2ce9e79bcc917b4469faf85b4f18f6936d5940 (diff)
downloadlibva-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.c26
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);