| 
																	
																	
																		
																	
																	
																 | 
																@@ -36,13 +36,17 @@ static int vaapi_encode_make_packed_header(AVCodecContext *avctx, | 
															
														
														
													
														
															
																 | 
																 | 
																    VAAPIEncodeContext *ctx = avctx->priv_data; | 
																 | 
																 | 
																    VAAPIEncodeContext *ctx = avctx->priv_data; | 
															
														
														
													
														
															
																 | 
																 | 
																    VAStatus vas; | 
																 | 
																 | 
																    VAStatus vas; | 
															
														
														
													
														
															
																 | 
																 | 
																    VABufferID param_buffer, data_buffer; | 
																 | 
																 | 
																    VABufferID param_buffer, data_buffer; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    VABufferID *tmp; | 
															
														
														
													
														
															
																 | 
																 | 
																    VAEncPackedHeaderParameterBuffer params = { | 
																 | 
																 | 
																    VAEncPackedHeaderParameterBuffer params = { | 
															
														
														
													
														
															
																 | 
																 | 
																        .type = type, | 
																 | 
																 | 
																        .type = type, | 
															
														
														
													
														
															
																 | 
																 | 
																        .bit_length = bit_len, | 
																 | 
																 | 
																        .bit_length = bit_len, | 
															
														
														
													
														
															
																 | 
																 | 
																        .has_emulation_bytes = 1, | 
																 | 
																 | 
																        .has_emulation_bytes = 1, | 
															
														
														
													
														
															
																 | 
																 | 
																    }; | 
																 | 
																 | 
																    }; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    av_assert0(pic->nb_param_buffers + 2 <= MAX_PARAM_BUFFERS); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 2); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (!tmp) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        return AVERROR(ENOMEM); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pic->param_buffers = tmp; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, | 
																 | 
																 | 
																    vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, | 
															
														
														
													
														
															
																 | 
																 | 
																                         VAEncPackedHeaderParameterBufferType, | 
																 | 
																 | 
																                         VAEncPackedHeaderParameterBufferType, | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -77,9 +81,13 @@ static int vaapi_encode_make_param_buffer(AVCodecContext *avctx, | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																    VAAPIEncodeContext *ctx = avctx->priv_data; | 
																 | 
																 | 
																    VAAPIEncodeContext *ctx = avctx->priv_data; | 
															
														
														
													
														
															
																 | 
																 | 
																    VAStatus vas; | 
																 | 
																 | 
																    VAStatus vas; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    VABufferID *tmp; | 
															
														
														
													
														
															
																 | 
																 | 
																    VABufferID buffer; | 
																 | 
																 | 
																    VABufferID buffer; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 1); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (!tmp) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        return AVERROR(ENOMEM); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pic->param_buffers = tmp; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, | 
																 | 
																 | 
																    vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, | 
															
														
														
													
														
															
																 | 
																 | 
																                         type, len, 1, data, &buffer); | 
																 | 
																 | 
																                         type, len, 1, data, &buffer); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -313,15 +321,14 @@ static int vaapi_encode_issue(AVCodecContext *avctx, | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    av_assert0(pic->nb_slices <= MAX_PICTURE_SLICES); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pic->slices = av_mallocz_array(pic->nb_slices, sizeof(*pic->slices)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (!pic->slices) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        err = AVERROR(ENOMEM); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        goto fail; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																    for (i = 0; i < pic->nb_slices; i++) { | 
																 | 
																 | 
																    for (i = 0; i < pic->nb_slices; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																        slice = av_mallocz(sizeof(*slice)); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        if (!slice) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            err = AVERROR(ENOMEM); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            goto fail; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        slice = &pic->slices[i]; | 
															
														
														
													
														
															
																 | 
																 | 
																        slice->index = i; | 
																 | 
																 | 
																        slice->index = i; | 
															
														
														
													
														
															
																 | 
																 | 
																        pic->slices[i] = slice; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (ctx->codec->slice_params_size > 0) { | 
																 | 
																 | 
																        if (ctx->codec->slice_params_size > 0) { | 
															
														
														
													
														
															
																 | 
																 | 
																            slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size); | 
																 | 
																 | 
																            slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -425,8 +432,16 @@ fail_with_picture: | 
															
														
														
													
														
															
																 | 
																 | 
																fail: | 
																 | 
																 | 
																fail: | 
															
														
														
													
														
															
																 | 
																 | 
																    for(i = 0; i < pic->nb_param_buffers; i++) | 
																 | 
																 | 
																    for(i = 0; i < pic->nb_param_buffers; i++) | 
															
														
														
													
														
															
																 | 
																 | 
																        vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]); | 
																 | 
																 | 
																        vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    for (i = 0; i < pic->nb_slices; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (pic->slices) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_freep(&pic->slices[i].priv_data); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_freep(&pic->slices[i].codec_slice_params); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																fail_at_end: | 
																 | 
																 | 
																fail_at_end: | 
															
														
														
													
														
															
																 | 
																 | 
																    av_freep(&pic->codec_picture_params); | 
																 | 
																 | 
																    av_freep(&pic->codec_picture_params); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    av_freep(&pic->param_buffers); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    av_freep(&pic->slices); | 
															
														
														
													
														
															
																 | 
																 | 
																    av_frame_free(&pic->recon_image); | 
																 | 
																 | 
																    av_frame_free(&pic->recon_image); | 
															
														
														
													
														
															
																 | 
																 | 
																    av_buffer_unref(&pic->output_buffer_ref); | 
																 | 
																 | 
																    av_buffer_unref(&pic->output_buffer_ref); | 
															
														
														
													
														
															
																 | 
																 | 
																    pic->output_buffer = VA_INVALID_ID; | 
																 | 
																 | 
																    pic->output_buffer = VA_INVALID_ID; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -535,15 +550,18 @@ static int vaapi_encode_free(AVCodecContext *avctx, | 
															
														
														
													
														
															
																 | 
																 | 
																        vaapi_encode_discard(avctx, pic); | 
																 | 
																 | 
																        vaapi_encode_discard(avctx, pic); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    for (i = 0; i < pic->nb_slices; i++) { | 
																 | 
																 | 
																    for (i = 0; i < pic->nb_slices; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																        av_freep(&pic->slices[i]->priv_data); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        av_freep(&pic->slices[i]->codec_slice_params); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        av_freep(&pic->slices[i]); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (pic->slices) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_freep(&pic->slices[i].priv_data); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_freep(&pic->slices[i].codec_slice_params); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																    av_freep(&pic->codec_picture_params); | 
																 | 
																 | 
																    av_freep(&pic->codec_picture_params); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    av_frame_free(&pic->input_image); | 
																 | 
																 | 
																    av_frame_free(&pic->input_image); | 
															
														
														
													
														
															
																 | 
																 | 
																    av_frame_free(&pic->recon_image); | 
																 | 
																 | 
																    av_frame_free(&pic->recon_image); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    av_freep(&pic->param_buffers); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    av_freep(&pic->slices); | 
															
														
														
													
														
															
																 | 
																 | 
																    // Output buffer should already be destroyed. | 
																 | 
																 | 
																    // Output buffer should already be destroyed. | 
															
														
														
													
														
															
																 | 
																 | 
																    av_assert0(pic->output_buffer == VA_INVALID_ID); | 
																 | 
																 | 
																    av_assert0(pic->output_buffer == VA_INVALID_ID); | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																	
																 | 
																
  |