@@ -637,6 +637,9 @@ vaapi_decode_setup_context(AVCodecContext *avctx)
637637 tvherror (LS_VAAPI , "Decode: Failed to Open VAAPI device and create an AVHWDeviceContext for device: "
638638 "%s with error code: %s" ,
639639 ctx -> hw_accel_device , av_err2str (ret ));
640+ // unref self
641+ free (self );
642+ self = NULL ;
640643 return ret ;
641644 }
642645
@@ -645,6 +648,12 @@ vaapi_decode_setup_context(AVCodecContext *avctx)
645648 if (!avctx -> hw_device_ctx ) {
646649 tvherror (LS_VAAPI , "Decode: Failed to create a hardware device reference for device: %s." ,
647650 ctx -> hw_accel_device );
651+ // unref hw_device_ref
652+ av_buffer_unref (& self -> hw_device_ref );
653+ self -> hw_device_ref = NULL ;
654+ // unref self
655+ free (self );
656+ self = NULL ;
648657 return AVERROR (ENOMEM );
649658 }
650659 ctx -> hw_accel_ictx = self ;
@@ -767,13 +776,22 @@ vaapi_encode_setup_context(AVCodecContext *avctx)
767776 if ((ret = av_hwdevice_ctx_create (& self -> hw_frame_ref , AV_HWDEVICE_TYPE_VAAPI , NULL , NULL , 0 )) < 0 ) {
768777 tvherror (LS_VAAPI , "Encode: Failed to open VAAPI device and create an AVHWDeviceContext for it."
769778 "Error code: %s" ,av_err2str (ret ));
779+ // unref self
780+ free (self );
781+ self = NULL ;
770782 return ret ;
771783 }
772784
773785 /* set hw_frames_ctx for encoder's AVCodecContext */
774786 if ((ret = set_hwframe_ctx (avctx , self -> hw_frame_ref )) < 0 ) {
775787 tvherror (LS_VAAPI , "Encode: Failed to set hwframe context."
776788 "Error code: %s" ,av_err2str (ret ));
789+ // unref hw_frame_ref
790+ av_buffer_unref (& self -> hw_frame_ref );
791+ self -> hw_frame_ref = NULL ;
792+ // unref self
793+ free (self );
794+ self = NULL ;
777795 return ret ;
778796 }
779797 ctx -> hw_device_octx = av_buffer_ref (self -> hw_frame_ref );
0 commit comments