X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fvaapi_encode.c;h=910fd1b3652481c307c8b1e4064ed72577a1298d;hb=513e6a30fb013ca34812ccaaf3d090680ac868c5;hp=550ea47991d3e74b0d3341afbb0d723c6c7ba74d;hpb=96cf0d8a9cf35f3c49860bf1c000c382dd661607;p=ffmpeg diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 550ea47991d..910fd1b3652 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -321,10 +321,12 @@ static int vaapi_encode_issue(AVCodecContext *avctx, } } - pic->slices = av_mallocz_array(pic->nb_slices, sizeof(*pic->slices)); - if (!pic->slices) { - err = AVERROR(ENOMEM); - goto fail; + if (pic->nb_slices > 0) { + 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 = &pic->slices[i]; @@ -760,6 +762,8 @@ static int vaapi_encode_truncate_gop(AVCodecContext *avctx) VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodePicture *pic, *last_pic, *next; + av_assert0(!ctx->pic_start || ctx->pic_start->input_available); + // Find the last picture we actually have input for. for (pic = ctx->pic_start; pic; pic = pic->next) { if (!pic->input_available) @@ -768,8 +772,6 @@ static int vaapi_encode_truncate_gop(AVCodecContext *avctx) } if (pic) { - av_assert0(last_pic); - if (last_pic->type == PICTURE_TYPE_B) { // Some fixing up is required. Change the type of this // picture to P, then modify preceding B references which @@ -1094,10 +1096,10 @@ static av_cold int vaapi_encode_config_attributes(AVCodecContext *avctx) goto fail; } if (avctx->max_b_frames > 0 && ref_l1 < 1) { - av_log(avctx, AV_LOG_ERROR, "B frames are not " - "supported (%#x).\n", attr[i].value); - err = AVERROR(EINVAL); - goto fail; + av_log(avctx, AV_LOG_WARNING, "B frames are not " + "supported (%#x) by the underlying driver.\n", + attr[i].value); + avctx->max_b_frames = 0; } } break; @@ -1562,6 +1564,8 @@ av_cold int ff_vaapi_encode_close(AVCodecContext *avctx) vaapi_encode_free(avctx, pic); } + av_buffer_pool_uninit(&ctx->output_buffer_pool); + if (ctx->va_context != VA_INVALID_ID) { vaDestroyContext(ctx->hwctx->display, ctx->va_context); ctx->va_context = VA_INVALID_ID; @@ -1572,8 +1576,6 @@ av_cold int ff_vaapi_encode_close(AVCodecContext *avctx) ctx->va_config = VA_INVALID_ID; } - av_buffer_pool_uninit(&ctx->output_buffer_pool); - av_freep(&ctx->codec_sequence_params); av_freep(&ctx->codec_picture_params);