From patchwork Mon Feb 13 05:39:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Chen, Wenbin" X-Patchwork-Id: 40376 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp3210122pzk; Sun, 12 Feb 2023 21:39:50 -0800 (PST) X-Google-Smtp-Source: AK7set9ciZtDGf10ni0pkZ2UY3DZqH0Gn9/ZB4u1gzesA1k49fVYU1kx9Ol35CQ82K311MxlMY1w X-Received: by 2002:a50:aad4:0:b0:4ab:4d55:6f74 with SMTP id r20-20020a50aad4000000b004ab4d556f74mr10176209edc.13.1676266790377; Sun, 12 Feb 2023 21:39:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676266790; cv=none; d=google.com; s=arc-20160816; b=D4Cew/P+kjvPC/tzUGKcLx2P86qk7T9V1q5SNjE4uxKtvGam2LxH92KG7whzfNrW9O ecCDuQjUv4tXkATLmI3W3ErXMtdS7+b5UU0NZahd9adtFM3U88vTL//sNnNS7qkWpq85 lRv4wXh0YgBOLd27K0VRlZJLbII4dXpb5vmx5IgLu7SO/2te5on6aGS5LEwmE8jqHSAx DlgR9GkSEgQ3ksDTiEWQzCO8DAiGSH/fdNwKUsB1isOpnCNyvy28W+NJlV6JAA9j07j+ +EMxb2hXWNNdCjs3KIpTyl6tvbnIm4WKLmxAq/rzf7hbUn8iu7QdShTopnL1S3C9jHYO lALQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=wXrMc9n29G1oHxSMODEEFFvezfck7fw+djcMpqtTbS0=; b=e/AtNQXf1a0G0iEKxwlA2br+X7lH3OqoVtuQ+lNW2A6ksHEJsdkD5bNfuFqw8Pd1i0 54dsHYrOlWgAXOqFDBSCMdfHBfPnGFiyg/SWbQlvNmuewi/Sl8vB9XWfiCyGyrkLPVAV brNv70bNtM/RF99lJB8ZlvS8oN+wThIF3FNunv0dFInuKBAgCjkyEsZbiv+76JXiFuM1 40oFIq4m/00ycWKqCYxqTWRtWxLBwPTFDwIT3VrPbDzksT0gyxJFKHXxRNTxXgg/b8E8 +sSo732UFjZr5U2Z/xt02MV3Ms4wROMpZG3JwavldtGsM90br/VO7tQTqXE53bA5WecP rCgQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="Xmn89//W"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d22-20020a05640208d600b004aac33c1f4csi6150998edz.93.2023.02.12.21.39.45; Sun, 12 Feb 2023 21:39:50 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="Xmn89//W"; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A77BF68BA02; Mon, 13 Feb 2023 07:39:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8D09968B9CA for ; Mon, 13 Feb 2023 07:39:35 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1676266780; x=1707802780; h=from:to:subject:date:message-id:mime-version: content-transfer-encoding; bh=AY494Ni8KXIB6rtOveF06LYGnWgA+3n1ROytQRD31kI=; b=Xmn89//WHD4D8aXU9hKwuIiZklVCwd8wzuEF4g+qgzco7zsdDeHzaPob FyVR3woBvUDWuUNqV8fR7KnxiXvI48orR4AZqzEv4wgmkMlYGbBiY9RRZ UgJKEVZSpdjSfCpiC00oZEFyGqo79tCIQKJ3DfifWk85oXgk4k7bFrTm/ BN/HhaYNhcX5pBzFW10Avq82yE5LarLisaHM8byjEDq9aaoUyF702At5V qllfDrF8zlnTi9MBrMDluYi0ljkVAPu0ZHZl13Zn/+4rtuyVN1Llj7drZ 91YKHi+U89SVMi2e3CejDHXMoID9ZPKhHrMvAUonhGmmsxo4s0nluprEI A==; X-IronPort-AV: E=McAfee;i="6500,9779,10619"; a="393214131" X-IronPort-AV: E=Sophos;i="5.97,293,1669104000"; d="scan'208";a="393214131" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Feb 2023 21:39:32 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10619"; a="670682045" X-IronPort-AV: E=Sophos;i="5.97,293,1669104000"; d="scan'208";a="670682045" Received: from wenbin-z390-aorus-ultra.sh.intel.com ([10.239.35.4]) by fmsmga007.fm.intel.com with ESMTP; 12 Feb 2023 21:39:31 -0800 From: wenbin.chen-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Feb 2023 13:39:31 +0800 Message-Id: <20230213053931.534552-1-wenbin.chen@intel.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavcodec/qsvenc: Flush cached frames before reset encoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Je7r85ZhUztl From: Wenbin Chen According to https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#configuration-change. Before calling MFXVideoENCODE_Reset, The application needs to retrieve any cached frames in the SDK encoder. A loop is added before MFXVideoENCODE_Reset to retrieve cached frames and add them to async_fifo, so that dynamic configuration works when async_depth > 1. Signed-off-by: Wenbin Chen --- libavcodec/qsvenc.c | 118 +++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 2f0e94a914..f3b488dec8 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -1600,7 +1600,7 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) q->param.AsyncDepth = q->async_depth; - q->async_fifo = av_fifo_alloc2(q->async_depth, sizeof(QSVPacket), 0); + q->async_fifo = av_fifo_alloc2(q->async_depth, sizeof(QSVPacket), AV_FIFO_FLAG_AUTO_GROW); if (!q->async_fifo) return AVERROR(ENOMEM); @@ -2296,58 +2296,6 @@ static int update_pic_timing_sei(AVCodecContext *avctx, QSVEncContext *q) return updated; } -static int update_parameters(AVCodecContext *avctx, QSVEncContext *q, - const AVFrame *frame) -{ - int needReset = 0, ret = 0; - - if (!frame || avctx->codec_id == AV_CODEC_ID_MJPEG) - return 0; - - needReset = update_qp(avctx, q); - needReset |= update_max_frame_size(avctx, q); - needReset |= update_gop_size(avctx, q); - needReset |= update_rir(avctx, q); - needReset |= update_low_delay_brc(avctx, q); - needReset |= update_frame_rate(avctx, q); - needReset |= update_bitrate(avctx, q); - needReset |= update_pic_timing_sei(avctx, q); - ret = update_min_max_qp(avctx, q); - if (ret < 0) - return ret; - needReset |= ret; - if (!needReset) - return 0; - - if (avctx->hwaccel_context) { - AVQSVContext *qsv = avctx->hwaccel_context; - int i, j; - q->param.ExtParam = q->extparam; - for (i = 0; i < qsv->nb_ext_buffers; i++) - q->param.ExtParam[i] = qsv->ext_buffers[i]; - q->param.NumExtParam = qsv->nb_ext_buffers; - - for (i = 0; i < q->nb_extparam_internal; i++) { - for (j = 0; j < qsv->nb_ext_buffers; j++) { - if (qsv->ext_buffers[j]->BufferId == q->extparam_internal[i]->BufferId) - break; - } - if (j < qsv->nb_ext_buffers) - continue; - q->param.ExtParam[q->param.NumExtParam++] = q->extparam_internal[i]; - } - } else { - q->param.ExtParam = q->extparam_internal; - q->param.NumExtParam = q->nb_extparam_internal; - } - av_log(avctx, AV_LOG_DEBUG, "Parameter change, call msdk reset.\n"); - ret = MFXVideoENCODE_Reset(q->session, &q->param); - if (ret < 0) - return ff_qsv_print_error(avctx, ret, "Error during resetting"); - - return 0; -} - static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, const AVFrame *frame) { @@ -2438,7 +2386,7 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, if (ret < 0) { ret = (ret == MFX_ERR_MORE_DATA) ? - 0 : ff_qsv_print_error(avctx, ret, "Error during encoding"); + AVERROR(EAGAIN) : ff_qsv_print_error(avctx, ret, "Error during encoding"); goto free; } @@ -2466,6 +2414,66 @@ nomem: goto free; } +static int update_parameters(AVCodecContext *avctx, QSVEncContext *q, + const AVFrame *frame) +{ + int needReset = 0, ret = 0; + + if (!frame || avctx->codec_id == AV_CODEC_ID_MJPEG) + return 0; + + needReset = update_qp(avctx, q); + needReset |= update_max_frame_size(avctx, q); + needReset |= update_gop_size(avctx, q); + needReset |= update_rir(avctx, q); + needReset |= update_low_delay_brc(avctx, q); + needReset |= update_frame_rate(avctx, q); + needReset |= update_bitrate(avctx, q); + needReset |= update_pic_timing_sei(avctx, q); + ret = update_min_max_qp(avctx, q); + if (ret < 0) + return ret; + needReset |= ret; + if (!needReset) + return 0; + + if (avctx->hwaccel_context) { + AVQSVContext *qsv = avctx->hwaccel_context; + int i, j; + q->param.ExtParam = q->extparam; + for (i = 0; i < qsv->nb_ext_buffers; i++) + q->param.ExtParam[i] = qsv->ext_buffers[i]; + q->param.NumExtParam = qsv->nb_ext_buffers; + + for (i = 0; i < q->nb_extparam_internal; i++) { + for (j = 0; j < qsv->nb_ext_buffers; j++) { + if (qsv->ext_buffers[j]->BufferId == q->extparam_internal[i]->BufferId) + break; + } + if (j < qsv->nb_ext_buffers) + continue; + q->param.ExtParam[q->param.NumExtParam++] = q->extparam_internal[i]; + } + } else { + q->param.ExtParam = q->extparam_internal; + q->param.NumExtParam = q->nb_extparam_internal; + } + + // Flush codec before reset configuration. + while (ret != AVERROR(EAGAIN)) { + ret = encode_frame(avctx, q, NULL); + if (ret < 0 && ret != AVERROR(EAGAIN)) + return ret; + } + + av_log(avctx, AV_LOG_DEBUG, "Parameter change, call msdk reset.\n"); + ret = MFXVideoENCODE_Reset(q->session, &q->param); + if (ret < 0) + return ff_qsv_print_error(avctx, ret, "Error during resetting"); + + return 0; +} + int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, AVPacket *pkt, const AVFrame *frame, int *got_packet) { @@ -2476,7 +2484,7 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, return ret; ret = encode_frame(avctx, q, frame); - if (ret < 0) + if (ret < 0 && ret != AVERROR(EAGAIN)) return ret; if ((av_fifo_can_read(q->async_fifo) >= q->async_depth) ||