[Libva] [LIBVA-INTEL-DRIVER][PATCH 2/2] Fix the potential NULL issue

Xiang, Haihao haihao.xiang at intel.com
Wed Jun 8 02:12:42 UTC 2016


Thanks for the patch, applied.


> From: Zhao Yakui <yakui.zhao at intel.com>
> 
> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> ---
>  src/gen9_vp9_encoder.c | 99
> +++++++++++++++++++++++++++++++++++++++++++++-----
>  src/gen9_vp9_encoder.h |  1 +
>  2 files changed, 90 insertions(+), 10 deletions(-)
> 
> diff --git a/src/gen9_vp9_encoder.c b/src/gen9_vp9_encoder.c
> index e6b1543..eecd206 100644
> --- a/src/gen9_vp9_encoder.c
> +++ b/src/gen9_vp9_encoder.c
> @@ -272,6 +272,11 @@ gen9_vp9_init_check_surfaces(VADriverContextP
> ctx,
>                          &vp9_surface->scaled_4x_surface_id);
>  
>      vp9_surface->scaled_4x_surface_obj = SURFACE(vp9_surface-
> >scaled_4x_surface_id);
> +
> +    if (!vp9_surface->scaled_4x_surface_obj) {
> +        return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +    }
> +
>      i965_check_alloc_surface_bo(ctx, vp9_surface-
> >scaled_4x_surface_obj, 1,
>                                  VA_FOURCC('N', 'V', '1', '2'),
> SUBSAMPLE_YUV420);
>  
> @@ -284,6 +289,11 @@ gen9_vp9_init_check_surfaces(VADriverContextP
> ctx,
>                          1,
>                          &vp9_surface->scaled_16x_surface_id);
>      vp9_surface->scaled_16x_surface_obj = SURFACE(vp9_surface-
> >scaled_16x_surface_id);
> +
> +    if (!vp9_surface->scaled_16x_surface_obj) {
> +        return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +    }
> +
>      i965_check_alloc_surface_bo(ctx, vp9_surface-
> >scaled_16x_surface_obj, 1,
>                                  VA_FOURCC('N', 'V', '1', '2'),
> SUBSAMPLE_YUV420);
>  
> @@ -344,6 +354,11 @@ gen9_vp9_check_dys_surfaces(VADriverContextP
> ctx,
>                          1,
>                          &vp9_surface->dys_surface_id);
>      vp9_surface->dys_surface_obj = SURFACE(vp9_surface-
> >dys_surface_id);
> +
> +    if (!vp9_surface->dys_surface_obj) {
> +        return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +    }
> +
>      i965_check_alloc_surface_bo(ctx, vp9_surface->dys_surface_obj,
> 1,
>                                  VA_FOURCC('N', 'V', '1', '2'),
> SUBSAMPLE_YUV420);
>  
> @@ -358,6 +373,11 @@ gen9_vp9_check_dys_surfaces(VADriverContextP
> ctx,
>                          &vp9_surface->dys_4x_surface_id);
>  
>      vp9_surface->dys_4x_surface_obj = SURFACE(vp9_surface-
> >dys_4x_surface_id);
> +
> +    if (!vp9_surface->dys_4x_surface_obj) {
> +        return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +    }
> +
>      i965_check_alloc_surface_bo(ctx, vp9_surface-
> >dys_4x_surface_obj, 1,
>                                  VA_FOURCC('N', 'V', '1', '2'),
> SUBSAMPLE_YUV420);
>  
> @@ -370,6 +390,11 @@ gen9_vp9_check_dys_surfaces(VADriverContextP
> ctx,
>                          1,
>                          &vp9_surface->dys_16x_surface_id);
>      vp9_surface->dys_16x_surface_obj = SURFACE(vp9_surface-
> >dys_16x_surface_id);
> +
> +    if (!vp9_surface->dys_16x_surface_obj) {
> +        return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +    }
> +
>      i965_check_alloc_surface_bo(ctx, vp9_surface-
> >dys_16x_surface_obj, 1,
>                                  VA_FOURCC('N', 'V', '1', '2'),
> SUBSAMPLE_YUV420);
>  
> @@ -1135,6 +1160,10 @@ void gen9_vp9_set_curbe_brc(VADriverContextP
> ctx,
>      segment_param  = param->psegment_param;
>  
>      cmd = gen8p_gpe_context_map_curbe(gpe_context);
> +
> +    if (!cmd)
> +        return;
> +
>      memset(cmd, 0, sizeof(vp9_brc_curbe_data));
>  
>      if (!vp9_state->dys_enabled)
> @@ -1548,7 +1577,7 @@
> intel_vp9enc_construct_picstate_batchbuf(VADriverContextP ctx,
>      pdata = i965_map_gpe_resource(gpe_resource);
>      vp9_state = (struct gen9_vp9_state *) encoder_context-
> >enc_priv_state;
>  
> -    if (!vp9_state || !vp9_state->pic_param)
> +    if (!vp9_state || !vp9_state->pic_param || !pdata)
>          return;
>  
>      pic_param = vp9_state->pic_param;
> @@ -1954,6 +1983,10 @@ gen9_vp9_brc_update_kernel(VADriverContextP
> ctx,
>      {
>          char *brc_const_buffer;
>          brc_const_buffer = i965_map_gpe_resource(&vme_context-
> >res_brc_const_data_buffer);
> +
> +        if (!brc_const_buffer)
> +            return VA_STATUS_ERROR_OPERATION_FAILED;
> +
>          if (vp9_state->picture_coding_type)
>              memcpy(brc_const_buffer, vp9_brc_const_data_p_g9,
>                     sizeof(vp9_brc_const_data_p_g9));
> @@ -2025,6 +2058,10 @@ void gen9_vp9_set_curbe_me(VADriverContextP
> ctx,
>          enc_media_state = VP9_MEDIA_STATE_4X_ME;
>  
>      me_cmd = gen8p_gpe_context_map_curbe(gpe_context);
> +
> +    if (!me_cmd)
> +        return;
> +
>      memset(me_cmd, 0, sizeof(vp9_me_curbe_data));
>  
>      me_cmd->dw1.max_num_mvs           = 0x10;
> @@ -2362,6 +2399,10 @@ gen9_vp9_set_curbe_scaling_cm(VADriverContextP
> ctx,
>      vp9_scaling4x_curbe_data_cm *curbe_cmd;
>  
>      curbe_cmd = gen8p_gpe_context_map_curbe(gpe_context);
> +
> +    if (!curbe_cmd)
> +        return;
> +
>      memset(curbe_cmd, 0, sizeof(vp9_scaling4x_curbe_data_cm));
>  
>      curbe_cmd->dw0.input_picture_width = curbe_param-
> >input_picture_width;
> @@ -2549,8 +2590,15 @@ static void
>  gen9_vp9_dys_set_sampler_state(struct i965_gpe_context *gpe_context)
>  {
>      struct gen9_sampler_8x8_avs                *sampler_cmd;
> +
> +    if (!gpe_context)
> +        return;
> +
>      dri_bo_map(gpe_context->dynamic_state.bo, 1);
>  
> +    if (!gpe_context->dynamic_state.bo->virtual)
> +        return;
> +
>      sampler_cmd = (struct gen9_sampler_8x8_avs *)
>         (gpe_context->dynamic_state.bo->virtual + gpe_context-
> >sampler_offset);
>  
> @@ -2623,6 +2671,10 @@ gen9_vp9_set_curbe_dys(VADriverContextP ctx,
>      vp9_dys_curbe_data  *curbe_cmd;
>  
>      curbe_cmd = gen8p_gpe_context_map_curbe(gpe_context);
> +
> +    if (!curbe_cmd)
> +        return;
> +
>      memset(curbe_cmd, 0, sizeof(vp9_dys_curbe_data));
>  
>      curbe_cmd->dw0.input_frame_width    = curbe_param->input_width;
> @@ -2780,7 +2832,8 @@ gen9_vp9_run_dys_refframes(VADriverContextP
> ctx,
>                              &dys_kernel_param);
>      }
>  
> -    if (vp9_state->dys_ref_frame_flag & VP9_LAST_REF) {
> +    if ((vp9_state->dys_ref_frame_flag & VP9_LAST_REF) &&
> +         vp9_state->last_ref_obj) {
>          obj_surface = vp9_state->last_ref_obj;
>          vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface-
> >private_data);
>  
> @@ -2832,7 +2885,8 @@ gen9_vp9_run_dys_refframes(VADriverContextP
> ctx,
>          }
>      }
>  
> -    if (vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) {
> +    if ((vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) &&
> +         vp9_state->golden_ref_obj) {
>          obj_surface = vp9_state->golden_ref_obj;
>          vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface-
> >private_data);
>  
> @@ -2884,7 +2938,8 @@ gen9_vp9_run_dys_refframes(VADriverContextP
> ctx,
>          }
>      }
>  
> -    if (vp9_state->dys_ref_frame_flag & VP9_ALT_REF) {
> +    if ((vp9_state->dys_ref_frame_flag & VP9_ALT_REF) &&
> +         vp9_state->alt_ref_obj) {
>          obj_surface = vp9_state->alt_ref_obj;
>          vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface-
> >private_data);
>  
> @@ -2969,6 +3024,10 @@ gen9_vp9_set_curbe_mbenc(VADriverContextP ctx,
>      }
>  
>      curbe_cmd = gen8p_gpe_context_map_curbe(gpe_context);
> +
> +    if (!curbe_cmd)
> +        return;
> +
>      memset(curbe_cmd, 0, sizeof(vp9_mbenc_curbe_data));
>  
>      if (vp9_state->dys_in_use)
> @@ -3843,6 +3902,10 @@
> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>          encode_state->seq_param_ext->buffer)
>          seq_param = (VAEncSequenceParameterBufferVP9 *)encode_state-
> >seq_param_ext->buffer;
>  
> +    if (!seq_param) {
> +        seq_param = &vp9_state->bogus_seq_param;
> +    }
> +
>      vp9_state->pic_param = pic_param;
>      vp9_state->segment_param = seg_param;
>      vp9_state->seq_param = seq_param;
> @@ -4051,7 +4114,8 @@
> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>          !pic_param->pic_flags.bits.intra_only) {
>          vp9_state->dys_ref_frame_flag = vp9_state->ref_frame_flag;
>  
> -        if (vp9_state->ref_frame_flag & VP9_LAST_REF) {
> +        if ((vp9_state->ref_frame_flag & VP9_LAST_REF) &&
> +             vp9_state->last_ref_obj) {
>              obj_surface = vp9_state->last_ref_obj;
>              vp9_priv_surface = (struct gen9_surface_vp9
> *)(obj_surface->private_data);
>  
> @@ -4059,7 +4123,8 @@
> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>                  vp9_state->frame_height == vp9_priv_surface-
> >frame_height)
>                  vp9_state->dys_ref_frame_flag &= ~(VP9_LAST_REF);
>          }
> -        if (vp9_state->ref_frame_flag & VP9_GOLDEN_REF) {
> +        if ((vp9_state->ref_frame_flag & VP9_GOLDEN_REF) &&
> +             vp9_state->golden_ref_obj) {
>              obj_surface = vp9_state->golden_ref_obj;
>              vp9_priv_surface = (struct gen9_surface_vp9
> *)(obj_surface->private_data);
>  
> @@ -4067,7 +4132,8 @@
> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>                  vp9_state->frame_height == vp9_priv_surface-
> >frame_height)
>                  vp9_state->dys_ref_frame_flag &= ~(VP9_GOLDEN_REF);
>          }
> -        if (vp9_state->ref_frame_flag & VP9_ALT_REF) {
> +        if ((vp9_state->ref_frame_flag & VP9_ALT_REF) &&
> +             vp9_state->alt_ref_obj) {
>              obj_surface = vp9_state->alt_ref_obj;
>              vp9_priv_surface = (struct gen9_surface_vp9
> *)(obj_surface->private_data);
>  
> @@ -4214,7 +4280,8 @@
> gen9_vme_gpe_kernel_prepare_vp9(VADriverContextP ctx,
>      }
>  
>      if (vp9_state->dys_ref_frame_flag) {
> -        if (vp9_state->dys_ref_frame_flag & VP9_LAST_REF) {
> +        if ((vp9_state->dys_ref_frame_flag & VP9_LAST_REF) &&
> +             vp9_state->last_ref_obj) {
>              obj_surface = vp9_state->last_ref_obj;
>              surface_param.frame_width = vp9_state->frame_width;
>              surface_param.frame_height = vp9_state->frame_height;
> @@ -4225,7 +4292,8 @@
> gen9_vme_gpe_kernel_prepare_vp9(VADriverContextP ctx,
>              if (va_status)
>                  return va_status;
>          }
> -        if (vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) {
> +        if ((vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) &&
> +             vp9_state->golden_ref_obj) {
>              obj_surface = vp9_state->golden_ref_obj;
>              surface_param.frame_width = vp9_state->frame_width;
>              surface_param.frame_height = vp9_state->frame_height;
> @@ -4236,7 +4304,8 @@
> gen9_vme_gpe_kernel_prepare_vp9(VADriverContextP ctx,
>              if (va_status)
>                  return va_status;
>          }
> -        if (vp9_state->dys_ref_frame_flag & VP9_ALT_REF) {
> +        if ((vp9_state->dys_ref_frame_flag & VP9_ALT_REF) &&
> +             vp9_state->alt_ref_obj) {
>              obj_surface = vp9_state->alt_ref_obj;
>              surface_param.frame_width = vp9_state->frame_width;
>              surface_param.frame_height = vp9_state->frame_height;
> @@ -4843,6 +4912,9 @@
> intel_vp9enc_refresh_frame_internal_buffers(VADriverContextP ctx,
>      i965_zero_gpe_resource(&pak_context-
> >res_compressed_input_buffer);
>      buffer = i965_map_gpe_resource(&pak_context-
> >res_compressed_input_buffer);
>  
> +    if (!buffer)
> +        return;
> +
>      /* write tx_size */
>      if ((pic_param->luma_ac_qindex == 0) &&
>          (pic_param->luma_dc_qindex_delta == 0) &&
> @@ -5357,6 +5429,9 @@
> intel_vp9enc_construct_pak_insertobj_batchbuffer(VADriverContextP
> ctx,
>      uncompressed_header_length = vp9_state->header_length;
>      cmd_ptr = i965_map_gpe_resource(obj_batch_buffer);
>  
> +    if (!cmd_ptr)
> +        return;
> +
>      bits_in_last_dw = uncompressed_header_length % 4;
>      bits_in_last_dw *= 8;
>  
> @@ -5437,6 +5512,10 @@ gen9_vp9_pak_picture_level(VADriverContextP
> ctx,
>              uint8_t *prob_ptr;
>  
>              prob_ptr = i965_map_gpe_resource(&pak_context-
> >res_prob_buffer);
> +
> +            if (!prob_ptr)
> +                return;
> +
>              /* copy the current fc to vp9_prob buffer */
>              memcpy(prob_ptr, &vp9_state->vp9_current_fc,
> sizeof(FRAME_CONTEXT));
>              if ((pic_param->pic_flags.bits.frame_type ==
> HCP_VP9_KEY_FRAME) ||
> diff --git a/src/gen9_vp9_encoder.h b/src/gen9_vp9_encoder.h
> index ccc9f80..8034240 100644
> --- a/src/gen9_vp9_encoder.h
> +++ b/src/gen9_vp9_encoder.h
> @@ -1908,6 +1908,7 @@ struct gen9_vp9_state {
>      struct object_surface                       *alt_ref_obj;
>  
>      VAEncSequenceParameterBufferVP9 *seq_param;
> +    VAEncSequenceParameterBufferVP9 bogus_seq_param;
>      VAEncPictureParameterBufferVP9  *pic_param;
>      VAEncMiscParameterTypeVP9PerSegmantParam *segment_param;
>      double   brc_init_current_target_buf_full_in_bits;


More information about the Libva mailing list