ff_vaapi_encode_close() is not enough to free the resources like cbs if initialization failure happens after codec->configure (except for vp8/vp9). We need to call avctx->codec->close() to deallocate, otherwise memory leak happens. Add FF_CODEC_CAP_INIT_CLEANUP for vaapi encoders and deallocate the resources at free_and_end inside avcodec_open2().
Unified · Split
| @@ -2366,7 +2366,6 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) · 2365 unmodified lines | |||
| 2366 | return 0; | 2366 | return 0; |
| 2367 | 2367 | ||
| 2368 | fail: | 2368 | fail: |
| 2369 | ff_vaapi_encode_close(avctx); | ||
| 2370 | return err; | 2369 | return err; |
| 2371 | } | 2370 | } |
| 2372 | 2371 | ||
| @@ -1356,6 +1356,7 @@ AVCodec ff_h264_vaapi_encoder = { · 1355 unmodified lines | |||
| 1356 | .close = &vaapi_encode_h264_close, | 1356 | .close = &vaapi_encode_h264_close, |
| 1357 | .priv_class = &vaapi_encode_h264_class, | 1357 | .priv_class = &vaapi_encode_h264_class, |
| 1358 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, | 1358 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, |
| 1359 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 1359 | .defaults = vaapi_encode_h264_defaults, | 1360 | .defaults = vaapi_encode_h264_defaults, |
| 1360 | .pix_fmts = (const enum AVPixelFormat[]) { | 1361 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 1361 | AV_PIX_FMT_VAAPI, | 1362 | AV_PIX_FMT_VAAPI, |
| @@ -1292,6 +1292,7 @@ AVCodec ff_hevc_vaapi_encoder = { · 1291 unmodified lines | |||
| 1292 | .close = &vaapi_encode_h265_close, | 1292 | .close = &vaapi_encode_h265_close, |
| 1293 | .priv_class = &vaapi_encode_h265_class, | 1293 | .priv_class = &vaapi_encode_h265_class, |
| 1294 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, | 1294 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, |
| 1295 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 1295 | .defaults = vaapi_encode_h265_defaults, | 1296 | .defaults = vaapi_encode_h265_defaults, |
| 1296 | .pix_fmts = (const enum AVPixelFormat[]) { | 1297 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 1297 | AV_PIX_FMT_VAAPI, | 1298 | AV_PIX_FMT_VAAPI, |
| @@ -565,6 +565,7 @@ AVCodec ff_mjpeg_vaapi_encoder = { · 564 unmodified lines | |||
| 565 | .priv_class = &vaapi_encode_mjpeg_class, | 565 | .priv_class = &vaapi_encode_mjpeg_class, |
| 566 | .capabilities = AV_CODEC_CAP_HARDWARE | | 566 | .capabilities = AV_CODEC_CAP_HARDWARE | |
| 567 | AV_CODEC_CAP_INTRA_ONLY, | 567 | AV_CODEC_CAP_INTRA_ONLY, |
| 568 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 568 | .defaults = vaapi_encode_mjpeg_defaults, | 569 | .defaults = vaapi_encode_mjpeg_defaults, |
| 569 | .pix_fmts = (const enum AVPixelFormat[]) { | 570 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 570 | AV_PIX_FMT_VAAPI, | 571 | AV_PIX_FMT_VAAPI, |
| @@ -702,6 +702,7 @@ AVCodec ff_mpeg2_vaapi_encoder = { · 701 unmodified lines | |||
| 702 | .close = &vaapi_encode_mpeg2_close, | 702 | .close = &vaapi_encode_mpeg2_close, |
| 703 | .priv_class = &vaapi_encode_mpeg2_class, | 703 | .priv_class = &vaapi_encode_mpeg2_class, |
| 704 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, | 704 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, |
| 705 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 705 | .defaults = vaapi_encode_mpeg2_defaults, | 706 | .defaults = vaapi_encode_mpeg2_defaults, |
| 706 | .pix_fmts = (const enum AVPixelFormat[]) { | 707 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 707 | AV_PIX_FMT_VAAPI, | 708 | AV_PIX_FMT_VAAPI, |
| @@ -257,6 +257,7 @@ AVCodec ff_vp8_vaapi_encoder = { · 256 unmodified lines | |||
| 257 | .close = &ff_vaapi_encode_close, | 257 | .close = &ff_vaapi_encode_close, |
| 258 | .priv_class = &vaapi_encode_vp8_class, | 258 | .priv_class = &vaapi_encode_vp8_class, |
| 259 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, | 259 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, |
| 260 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 260 | .defaults = vaapi_encode_vp8_defaults, | 261 | .defaults = vaapi_encode_vp8_defaults, |
| 261 | .pix_fmts = (const enum AVPixelFormat[]) { | 262 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 262 | AV_PIX_FMT_VAAPI, | 263 | AV_PIX_FMT_VAAPI, |
| @@ -291,6 +291,7 @@ AVCodec ff_vp9_vaapi_encoder = { · 290 unmodified lines | |||
| 291 | .close = &ff_vaapi_encode_close, | 291 | .close = &ff_vaapi_encode_close, |
| 292 | .priv_class = &vaapi_encode_vp9_class, | 292 | .priv_class = &vaapi_encode_vp9_class, |
| 293 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, | 293 | .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, |
| 294 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 294 | .defaults = vaapi_encode_vp9_defaults, | 295 | .defaults = vaapi_encode_vp9_defaults, |
| 295 | .pix_fmts = (const enum AVPixelFormat[]) { | 296 | .pix_fmts = (const enum AVPixelFormat[]) { |
| 296 | AV_PIX_FMT_VAAPI, | 297 | AV_PIX_FMT_VAAPI, |