| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -36,13 +36,17 @@ static int vaapi_encode_make_packed_header(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VAAPIEncodeContext *ctx = avctx->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VAStatus vas; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VABufferID param_buffer, data_buffer; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VABufferID *tmp; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VAEncPackedHeaderParameterBuffer params = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        .type = type, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        .bit_length = bit_len, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        .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, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         VAEncPackedHeaderParameterBufferType, | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -77,9 +81,13 @@ static int vaapi_encode_make_param_buffer(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VAAPIEncodeContext *ctx = avctx->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VAStatus vas; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    VABufferID *tmp; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    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, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         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++) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        slice = av_mallocz(sizeof(*slice)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!slice) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            err = AVERROR(ENOMEM); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            goto fail; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        slice = &pic->slices[i]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        slice->index = i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        pic->slices[i] = slice; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (ctx->codec->slice_params_size > 0) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size); | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -425,8 +432,16 @@ fail_with_picture: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			fail: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for(i = 0; i < pic->nb_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: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->codec_picture_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->param_buffers); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->slices); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_frame_free(&pic->recon_image); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_buffer_unref(&pic->output_buffer_ref); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    pic->output_buffer = VA_INVALID_ID; | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -535,15 +550,18 @@ static int vaapi_encode_free(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        vaapi_encode_discard(avctx, pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    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_frame_free(&pic->input_image); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_frame_free(&pic->recon_image); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->param_buffers); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->slices); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // Output buffer should already be destroyed. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_assert0(pic->output_buffer == VA_INVALID_ID); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |