[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