[Libva] [PATCH] VP9HWDEC:fix vp9 hw decoder issue

Xiang, Haihao haihao.xiang at intel.com
Tue Jan 5 20:50:25 PST 2016


Applied.

Thanks
Haihao

> v2:
> codes change according to haihao's comments
> 
> v1:
> 1. fix one segmentent fault issue
> 2. change and optimize the mv bufffer update the logic
> 3. fix one segment feature issue
> 4. fix one issue when loopfilter level is zero.
> 
> Signed-off-by: Pengfei Qu <Pengfei.Qu at intel.com>
> ---
>  src/gen9_mfd.c           | 184 +++++++++++++++++++++++++++++------
> ------------
>  src/gen9_mfd.h           |  10 ++-
>  src/intel_media_common.c |   3 -
>  3 files changed, 125 insertions(+), 72 deletions(-)
> 
> diff --git a/src/gen9_mfd.c b/src/gen9_mfd.c
> index 2d8ed7d..e4d8d6f 100644
> --- a/src/gen9_mfd.c
> +++ b/src/gen9_mfd.c
> @@ -982,23 +982,44 @@ out:
>  #define VP9_PROB_BUFFER_RESTORED_SECNE_2    2
>  #define
> VP9_PROB_BUFFER_RESTORED_SECNE_MAX    (VP9_PROB_BUFFER_RESTORED_SECNE
> _2 + 1)
>  
> -static void vp9_update_segmentId_buffer(VADriverContextP ctx,
> +#define ALLOC_MV_BUFFER(gen_buffer, string, size,width,height)  \
> +    do {                                                        \
> +        dri_bo_unreference(gen_buffer->bo);                     \
> +        gen_buffer->bo = dri_bo_alloc(i965->intel.bufmgr,       \
> +                                      string,                   \
> +                                      size,                     \
> +                                      0x1000);                  \
> +        assert(gen_buffer->bo);                                 \
> +        gen_buffer->frame_width  = width ;                      \
> +        gen_buffer->frame_height = height;                      \
> +    } while (0)
> +
> +static void 
> +vp9_update_segmentId_buffer(VADriverContextP ctx,
>                            struct decode_state *decode_state,
> -                          struct gen9_hcpd_context
> *gen9_hcpd_context, uint8_t isScaling)
> +                          struct gen9_hcpd_context
> *gen9_hcpd_context)
>  {
> +    struct i965_driver_data *i965 = i965_driver_data(ctx);
>      VADecPictureParameterBufferVP9 *pic_param;
>  
> +    int size = 0;
> +    uint8_t isScaling = 0;
>      assert(decode_state->pic_param && decode_state->pic_param-
> >buffer);
>      pic_param = (VADecPictureParameterBufferVP9 *)decode_state-
> >pic_param->buffer;
>  
> -    int size = 0;
> +    size = gen9_hcpd_context->picture_width_in_ctbs *
> gen9_hcpd_context->picture_height_in_ctbs * 1 ;
> +    size<<=6;
> +    if(gen9_hcpd_context->vp9_segment_id_buffer.bo == NULL ||
> pic_param->frame_width > gen9_hcpd_context->last_frame.frame_width ||
> pic_param->frame_height > gen9_hcpd_context->last_frame.frame_height)
> +    {
> +        ALLOC_GEN_BUFFER((&gen9_hcpd_context-
> >vp9_segment_id_buffer), "vp9 segment id buffer", size);
> +    }
>  
> +    isScaling =  (pic_param->frame_width != gen9_hcpd_context-
> >last_frame.frame_width)| (pic_param->frame_height !=
> gen9_hcpd_context->last_frame.frame_height);
> +    
>      if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME)
> ||
>          pic_param->pic_fields.bits.error_resilient_mode ||
>          pic_param->pic_fields.bits.intra_only || isScaling) {
>  
> -        size = (gen9_hcpd_context-
> >picture_width_in_min_cb_minus1+2)*(gen9_hcpd_context-
> >picture_height_in_min_cb_minus1 + 2) * 1;
> -        size<<=6;
>          //VP9 Segment ID buffer needs to be zero
>          dri_bo_map(gen9_hcpd_context->vp9_segment_id_buffer.bo,1);
>          memset((unsigned char *)gen9_hcpd_context-
> >vp9_segment_id_buffer.bo->virtual,0, size);
> @@ -1006,6 +1027,31 @@ static void
> vp9_update_segmentId_buffer(VADriverContextP ctx,
>      }
>  }
>  
> +static void 
> +vp9_update_mv_temporal_buffer(VADriverContextP ctx,
> +                          struct decode_state *decode_state,
> +                          struct gen9_hcpd_context
> *gen9_hcpd_context)
> +{
> +    struct i965_driver_data *i965 = i965_driver_data(ctx);
> +    VADecPictureParameterBufferVP9 *pic_param;
> +    int size = 0;
> +
> +    assert(decode_state->pic_param && decode_state->pic_param-
> >buffer);
> +    pic_param = (VADecPictureParameterBufferVP9 *)decode_state-
> >pic_param->buffer;
> +
> +    size = gen9_hcpd_context->picture_width_in_ctbs *
> gen9_hcpd_context->picture_height_in_ctbs * 9 ;
> +    size<<=6; //CL aligned
> +    if(gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo == NULL ||
> pic_param->frame_width > gen9_hcpd_context-
> >vp9_mv_temporal_buffer_curr.frame_width || pic_param->frame_height >
> gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height)
> +    {
> +        ALLOC_MV_BUFFER((&gen9_hcpd_context-
> >vp9_mv_temporal_buffer_curr), "vp9 curr mv temporal buffer",
> size,pic_param->frame_width,pic_param->frame_height);
> +    }
> +    if(gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo == NULL)
> +    {
> +        ALLOC_MV_BUFFER((&gen9_hcpd_context-
> >vp9_mv_temporal_buffer_last), "vp9 last mv temporal buffer",
> size,pic_param->frame_width,pic_param->frame_height);
> +    }
> +
> +}
> +
>  static void
>  vp9_gen_default_probabilities(VADriverContextP ctx, struct
> gen9_hcpd_context *gen9_hcpd_context)
>  {
> @@ -1103,7 +1149,7 @@ vp9_update_probabilities(VADriverContextP ctx,
>          }
>      }else if(gen9_hcpd_context->last_frame.prob_buffer_saved_flag ==
> VP9_PROB_BUFFER_SAVED_SECNE_2)
>      {
> -        if((pic_param->pic_fields.bits.frame_type ==
> HCP_VP9_KEY_FRAME) ||pic_param->pic_fields.bits.intra_only|pic_param-
> >pic_fields.bits.error_resilient_mode)
> +        if((pic_param->pic_fields.bits.frame_type ==
> HCP_VP9_KEY_FRAME) ||pic_param-
> >pic_fields.bits.intra_only||pic_param-
> >pic_fields.bits.error_resilient_mode)
>          {
>              temp_frame_ctx_id = 0;
>          }
> @@ -1130,7 +1176,7 @@ vp9_update_probabilities(VADriverContextP ctx,
>          }
>      }
>      //first part buffer update: Case 1)Reset all 4 probablity
> buffers
> -   if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME)
> ||pic_param->pic_fields.bits.intra_only|pic_param-
> >pic_fields.bits.error_resilient_mode)
> +   if((pic_param->pic_fields.bits.frame_type == HCP_VP9_KEY_FRAME)
> ||pic_param->pic_fields.bits.intra_only||pic_param-
> >pic_fields.bits.error_resilient_mode)
>      {
>          if((pic_param->pic_fields.bits.frame_type ==
> HCP_VP9_KEY_FRAME) ||
>              (pic_param->pic_fields.bits.reset_frame_context == 3)||
> @@ -1265,9 +1311,7 @@ gen9_hcpd_init_vp9_surface(VADriverContextP
> ctx,
>                              struct object_surface *obj_surface,
>                              struct gen9_hcpd_context
> *gen9_hcpd_context)
>  {
> -    struct i965_driver_data *i965 = i965_driver_data(ctx);
>      GenVP9Surface *gen9_vp9_surface;
> -    uint32_t size=0;
>  
>      if (!obj_surface)
>          return;
> @@ -1282,16 +1326,6 @@ gen9_hcpd_init_vp9_surface(VADriverContextP
> ctx,
>          obj_surface->private_data = gen9_vp9_surface;
>      }
>  
> -    //Super block size in VP9 is 64x64, size in SBs
> -    size = gen9_hcpd_context->picture_width_in_ctbs *
> gen9_hcpd_context->picture_height_in_ctbs * 9 ;
> -    size<<=6; //CL aligned
> -
> -    if (gen9_vp9_surface->motion_vector_temporal_bo == NULL) {
> -        gen9_vp9_surface->motion_vector_temporal_bo =
> dri_bo_alloc(i965->intel.bufmgr,
> -                                                                   "
> current motion vector temporal buffer",
> -                                                                    
> size,
> -                                                                    
> 0x1000);
> -    }
>      gen9_vp9_surface->frame_width  = pic_param->frame_width;
>      gen9_vp9_surface->frame_height = pic_param->frame_height;
>  
> @@ -1374,10 +1408,6 @@ gen9_hcpd_vp9_decode_init(VADriverContextP
> ctx,
>      size<<=6;
>      ALLOC_GEN_BUFFER((&gen9_hcpd_context->vp9_probability_buffer),
> "vp9 probability buffer", size);
>  
> -    size = (gen9_hcpd_context-
> >picture_width_in_min_cb_minus1+2)*(gen9_hcpd_context-
> >picture_height_in_min_cb_minus1 + 2) * 1;
> -    size<<=6;
> -    ALLOC_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer),
> "vp9 segment id buffer", size);
> -
>      gen9_hcpd_context->first_inter_slice_collocated_ref_idx = 0;
>      gen9_hcpd_context->first_inter_slice_collocated_from_l0_flag =
> 0;
>      gen9_hcpd_context->first_inter_slice_valid = 0;
> @@ -1451,7 +1481,6 @@
> gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
>  {
>      struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
>      struct object_surface *obj_surface;
> -    GenVP9Surface *gen9_vp9_surface;
>      int i=0;
>  
>      BEGIN_BCS_BATCH(batch, 95);
> @@ -1460,8 +1489,6 @@
> gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
>  
>      obj_surface = decode_state->render_object;
>      assert(obj_surface && obj_surface->bo);
> -    gen9_vp9_surface = obj_surface->private_data;
> -    assert(gen9_vp9_surface && gen9_vp9_surface-
> >motion_vector_temporal_bo);
>  
>      OUT_BUFFER_MA_TARGET(obj_surface->bo); /* DW 1..3 */
>      OUT_BUFFER_MA_TARGET(gen9_hcpd_context-
> >deblocking_filter_line_buffer.bo);/* DW 4..6 */
> @@ -1473,7 +1500,7 @@
> gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
>      OUT_BUFFER_MA_TARGET(NULL);    /* DW 22..24, ignore for VP9 */
>      OUT_BUFFER_MA_TARGET(NULL);    /* DW 25..27, ignore for VP9 */
>      OUT_BUFFER_MA_TARGET(NULL);    /* DW 28..30, ignore for VP9 */
> -    OUT_BUFFER_MA_TARGET(gen9_vp9_surface-
> >motion_vector_temporal_bo); /* DW 31..33 */
> +    OUT_BUFFER_MA_TARGET(gen9_hcpd_context-
> >vp9_mv_temporal_buffer_curr.bo); /* DW 31..33 */
>  
>      OUT_BUFFER_MA_TARGET(NULL); /* DW 34..36, reserved */
>  
> @@ -1503,7 +1530,7 @@
> gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
>      /* DW 66..81 - for 8 Collocated motion vectors */
>      for (i = 0; i < 1; i++)
>      {
> -        OUT_BUFFER_NMA_REFERENCE(gen9_hcpd_context-
> >last_frame.mv_temporal_buffer_bo);
> +        OUT_BUFFER_NMA_REFERENCE(gen9_hcpd_context-
> >vp9_mv_temporal_buffer_last.bo);
>      }
>      for (; i < ARRAY_ELEMS(gen9_hcpd_context->reference_surfaces);
> i++)
>      {
> @@ -1518,7 +1545,6 @@
> gen9_hcpd_vp9_pipe_buf_addr_state(VADriverContextP ctx,
>      OUT_BUFFER_MA_TARGET(gen9_hcpd_context-
> >hvd_tile_rowstore_buffer.bo);/* DW 92..94, VP9 HVD Tile Rowstore
> buffer */
>  
>      ADVANCE_BCS_BATCH(batch);
> -    gen9_hcpd_context->last_frame.mv_temporal_buffer_bo =
> gen9_vp9_surface->motion_vector_temporal_bo;
>  }
>  
>  static inline int
> @@ -1719,16 +1745,25 @@ gen9_hcpd_vp9_segment_state(VADriverContextP
> ctx,
>                    seg_param-
> >segment_flags.fields.segment_reference_enabled << 3 |
>                    seg_param->segment_flags.fields.segment_reference
> << 1 |
>                    seg_param-
> >segment_flags.fields.segment_reference_skipped <<0 ); /* DW 2 */
> -    OUT_BCS_BATCH(batch,
> -                  seg_param->filter_level[1][1] << 24    |
> //FilterLevelRef1Mode1
> -                  seg_param->filter_level[1][0] << 16    |
> //FilterLevelRef1Mode0
> -                  seg_param->filter_level[0][1] << 8     |
> //FilterLevelRef0Mode1
> -                  seg_param->filter_level[0][0] << 0
> );     //FilterLevelRef0Mode0 /* DW 3 */
> -    OUT_BCS_BATCH(batch,
> -                  seg_param->filter_level[3][1] << 24    |
> //FilterLevelRef3Mode1
> -                  seg_param->filter_level[3][0] << 16    |
> //FilterLevelRef3Mode0
> -                  seg_param->filter_level[2][1] << 8     |
> //FilterLevelRef2Mode1
> -                  seg_param->filter_level[2][0] << 0
> );    //FilterLevelRef2Mode0 /* DW 4 */
> +    if(pic_param->filter_level)
> +    {
> +        OUT_BCS_BATCH(batch,
> +            seg_param->filter_level[1][1] << 24    |
> //FilterLevelRef1Mode1
> +            seg_param->filter_level[1][0] << 16    |
> //FilterLevelRef1Mode0
> +            seg_param->filter_level[0][1] << 8     |
> //FilterLevelRef0Mode1
> +            seg_param->filter_level[0][0] << 0
> );     //FilterLevelRef0Mode0 /* DW 3 */
> +        OUT_BCS_BATCH(batch,
> +            seg_param->filter_level[3][1] << 24    |
> //FilterLevelRef3Mode1
> +            seg_param->filter_level[3][0] << 16    |
> //FilterLevelRef3Mode0
> +            seg_param->filter_level[2][1] << 8     |
> //FilterLevelRef2Mode1
> +            seg_param->filter_level[2][0] << 0
> );    //FilterLevelRef2Mode0 /* DW 4 */
> +    }else
> +    {
> +        OUT_BCS_BATCH(batch,
> +            0 );      /* DW 3 */
> +        OUT_BCS_BATCH(batch,
> +            0 );      /* DW 4 */
> +    }
>      OUT_BCS_BATCH(batch,
>                    seg_param->luma_ac_quant_scale << 16   |
>                    seg_param->luma_dc_quant_scale << 0 );    /* DW 5
> */
> @@ -1766,39 +1801,35 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP
> ctx,
>                                struct decode_state *decode_state,
>                                struct gen9_hcpd_context
> *gen9_hcpd_context)
>  {
> -    VAStatus vaStatus;
> +    VAStatus vaStatus = VA_STATUS_SUCCESS;
>      struct i965_driver_data *i965 = i965_driver_data(ctx);
>      struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
>      VADecPictureParameterBufferVP9 *pic_param;
>      VASliceParameterBufferVP9 *slice_param;
>      dri_bo *slice_data_bo;
> -    int i = 0, num_segments=0, isScaling=0;
> -    struct object_surface *obj_surface;
> -    GenVP9Surface *gen9_vp9_surface;
> -    vaStatus = gen9_hcpd_vp9_decode_init(ctx, decode_state,
> gen9_hcpd_context);
> -
> -    if (vaStatus != VA_STATUS_SUCCESS)
> -        goto out;
> +    dri_bo *tmp_bo;
> +    uint16_t tmp;
> +    int i = 0, num_segments=0;
>  
>      assert(decode_state->pic_param && decode_state->pic_param-
> >buffer);
> +    assert(decode_state->slice_params && decode_state-
> >slice_params[0]->buffer);
> +    slice_param = (VASliceParameterBufferVP9 *)decode_state-
> >slice_params[0]->buffer;
>      pic_param = (VADecPictureParameterBufferVP9 *)decode_state-
> >pic_param->buffer;
>  
> -    //****And set the isScaling value accordingly******
> -    isScaling = 0;
> -    for(i = 0; i < 3; i++)
> +    if(slice_param->slice_data_size == 1)
>      {
> -        obj_surface = gen9_hcpd_context-
> >reference_surfaces[i].obj_surface;
> -        gen9_vp9_surface = NULL;
> -        if (obj_surface && obj_surface->private_data)
> -        {
> -            gen9_vp9_surface = obj_surface->private_data;
> -            isScaling |= (gen9_vp9_surface->frame_width ==
> pic_param->frame_width &&
> -                gen9_vp9_surface->frame_height == pic_param-
> >frame_height)? 0:1;
> -        }
> +        goto out;
>      }
>  
> +    vaStatus = gen9_hcpd_vp9_decode_init(ctx, decode_state,
> gen9_hcpd_context);
> +
> +    if (vaStatus != VA_STATUS_SUCCESS)
> +        goto out;
> +
>      //Update segment id buffer if needed
> -    vp9_update_segmentId_buffer(ctx, decode_state,
> gen9_hcpd_context, isScaling);
> +    vp9_update_segmentId_buffer(ctx, decode_state,
> gen9_hcpd_context);
> +    //Update mv buffer if needed
> +    vp9_update_mv_temporal_buffer(ctx, decode_state,
> gen9_hcpd_context);
>      //Update probability buffer if needed
>      vp9_update_probabilities(ctx, decode_state, gen9_hcpd_context);
>  
> @@ -1813,8 +1844,6 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP
> ctx,
>      gen9_hcpd_vp9_surface_state(ctx, decode_state,
> gen9_hcpd_context);
>  
>      //Only one VASliceParameterBufferVP9 should be sent per frame
> -    assert(decode_state->slice_params && decode_state-
> >slice_params[0]->buffer);
> -    slice_param = (VASliceParameterBufferVP9 *)decode_state-
> >slice_params[0]->buffer;
>      slice_data_bo = decode_state->slice_datas[0]->bo;
>  
>      gen9_hcpd_ind_obj_base_addr_state(ctx, slice_data_bo,
> gen9_hcpd_context);
> @@ -1836,6 +1865,9 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP
> ctx,
>  
>      gen9_hcpd_vp9_bsd_object(ctx, pic_param, slice_param,
> gen9_hcpd_context);
>  
> +    intel_batchbuffer_end_atomic(batch);
> +    intel_batchbuffer_flush(batch);
> +
>      // keep track of the last frame status
>      gen9_hcpd_context->last_frame.frame_width = pic_param-
> >frame_width;
>      gen9_hcpd_context->last_frame.frame_height = pic_param-
> >frame_height;
> @@ -1845,11 +1877,23 @@ gen9_hcpd_vp9_decode_picture(VADriverContextP
> ctx,
>      gen9_hcpd_context->last_frame.frame_context_idx = pic_param-
> >pic_fields.bits.frame_context_idx;
>      gen9_hcpd_context->last_frame.intra_only = pic_param-
> >pic_fields.bits.intra_only;
>  
> -    // update prob buffer to vp9_fc;
> +    // switch mv buffer
> +    if(pic_param->pic_fields.bits.frame_type != HCP_VP9_KEY_FRAME)
> +    {
> +        tmp_bo = gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_last.bo =
> gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_curr.bo = tmp_bo;
>  
> -    intel_batchbuffer_end_atomic(batch);
> -    intel_batchbuffer_flush(batch);
> +        tmp = gen9_hcpd_context-
> >vp9_mv_temporal_buffer_last.frame_width;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_width =
> gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_width;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_width =
> tmp;
> +
> +        tmp = gen9_hcpd_context-
> >vp9_mv_temporal_buffer_last.frame_height;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_last.frame_height
> = gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height;
> +        gen9_hcpd_context->vp9_mv_temporal_buffer_curr.frame_height
> = tmp;
>  
> +
> +    }
>      //update vp9_frame_ctx according to frame_context_id
>      if (pic_param->pic_fields.bits.refresh_frame_context)
>      {
> @@ -1920,6 +1964,8 @@ gen9_hcpd_context_destroy(void *hw_context)
>      FREE_GEN_BUFFER((&gen9_hcpd_context->hvd_tile_rowstore_buffer));
>      FREE_GEN_BUFFER((&gen9_hcpd_context->vp9_probability_buffer));
>      FREE_GEN_BUFFER((&gen9_hcpd_context->vp9_segment_id_buffer));
> +    dri_bo_unreference(gen9_hcpd_context-
> >vp9_mv_temporal_buffer_curr.bo);
> +    dri_bo_unreference(gen9_hcpd_context-
> >vp9_mv_temporal_buffer_last.bo);
>  
>      intel_batchbuffer_free(gen9_hcpd_context->base.batch);
>      free(gen9_hcpd_context);
> @@ -1936,17 +1982,19 @@ static void
>  gen9_hcpd_vp9_context_init(VADriverContextP ctx,
>                              struct gen9_hcpd_context
> *gen9_hcpd_context)
>  {
> -    int default_value = 255;
>  
>      gen9_hcpd_context->last_frame.frame_height  = 0;
>      gen9_hcpd_context->last_frame.show_frame    = 0;
>      gen9_hcpd_context->last_frame.frame_type    = 0;
> -    gen9_hcpd_context->last_frame.refresh_frame_context =
> default_value;
> -    gen9_hcpd_context->last_frame.frame_context_idx = default_value;
> +    gen9_hcpd_context->last_frame.refresh_frame_context = 0;
> +    gen9_hcpd_context->last_frame.frame_context_idx = 0;
>      gen9_hcpd_context->last_frame.intra_only = 0;
>      gen9_hcpd_context->last_frame.prob_buffer_saved_flag = 0;
>      gen9_hcpd_context->last_frame.prob_buffer_restored_flag = 0;
> -    gen9_hcpd_context->last_frame.mv_temporal_buffer_bo = NULL;
> +
> +    //Super block in VP9 is 64x64
> +    gen9_hcpd_context->ctb_size = 64;
> +    gen9_hcpd_context->min_cb_size = 8; //Min block size is 8
>  
>      vp9_gen_default_probabilities(ctx, gen9_hcpd_context);
>  }
> diff --git a/src/gen9_mfd.h b/src/gen9_mfd.h
> index c266dd4..a91a84a 100644
> --- a/src/gen9_mfd.h
> +++ b/src/gen9_mfd.h
> @@ -49,9 +49,15 @@ typedef struct vp9_frame_status
>      uint8_t intra_only;
>      uint8_t prob_buffer_saved_flag;
>      uint8_t prob_buffer_restored_flag;
> -    dri_bo * mv_temporal_buffer_bo;
>  }vp9_last_frame_status;
>  
> +typedef struct vp9_mv_temporal_buffer
> +{
> +    dri_bo *bo;
> +    uint16_t frame_width;
> +    uint16_t frame_height;
> +}VP9_MV_BUFFER;
> +
>  struct gen9_hcpd_context
>  {
>      struct hw_context base;
> @@ -84,6 +90,8 @@ struct gen9_hcpd_context
>      GenBuffer hvd_tile_rowstore_buffer;
>      GenBuffer vp9_probability_buffer;
>      GenBuffer vp9_segment_id_buffer;
> +    VP9_MV_BUFFER vp9_mv_temporal_buffer_curr;
> +    VP9_MV_BUFFER vp9_mv_temporal_buffer_last;
>  
>      unsigned short first_inter_slice_collocated_ref_idx;
>      unsigned short first_inter_slice_collocated_from_l0_flag;
> diff --git a/src/intel_media_common.c b/src/intel_media_common.c
> index 5fe9fc5..d6771c8 100644
> --- a/src/intel_media_common.c
> +++ b/src/intel_media_common.c
> @@ -123,9 +123,6 @@ void gen_free_vp9_surface(void **data)
>          return;
>      }
>  
> -    dri_bo_unreference(vp9_surface->motion_vector_temporal_bo);
> -    vp9_surface->motion_vector_temporal_bo = NULL;
> -
>      free(vp9_surface);
>      *data = NULL;
>  


More information about the Libva mailing list