@ -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 ) ;