From patchwork Mon Apr 26 03:03:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wenbin Chen X-Patchwork-Id: 27411 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:5014:0:0:0:0:0 with SMTP id e20csp3598182iob; Sun, 25 Apr 2021 20:07:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz2jEhtpaiL5m3CawuNzoZb2gnF7GouvybcHdnCq4PNOjf1vhg30QGG0swdo1BliSb8JqJb X-Received: by 2002:a05:6402:416:: with SMTP id q22mr18534498edv.204.1619406451051; Sun, 25 Apr 2021 20:07:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619406451; cv=none; d=google.com; s=arc-20160816; b=qZWmtVeTbd2seyE+zn4a3SV+ZUKopWCBhYNB2rqCLec7L15P28N918n4Xw4+euCFlL SQkt1Yaer6Fy2e+njkqthUEgZ4lvM0EXPXs5oQkoFEQi0OOmZ94ulQaN5EWJZ7A/GVvg v2f4r502lnoOk5VtEyb5zvxtTDx40reV7yuDZnr/z84GEBRJri/yq88ZxB9dv82XIavR EtSrjyo03UpWpH2wTi0OoMqRglPWK983hmsOJ+GWJXb4eaSkPQs1OOKMpU+osPVUT87t QyMgMtBEc1XXnZvydSuPlBMqP0FL2WtgXdAxlTjQukCSZQQ8je0HOe5E/R7OB6/o0cJH NMrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=g2lIgA4d1P7fbpmtYGPe9OnQ3SXd4vjF7f7tymrpeeo=; b=AmFpDlpP7IawL7eEP2U+3KopobCod/s81QJ7taosp/kXX8cHS7g6AbHr7fuJHCLZM+ 0s1+MY4CvR9KKPrhyMQ7g2jVYp53QkRmoIRqDyIlmKdgpsuhIkMWHn/b4ASYFvbddnnw vV5G1LVLPbzWBEeORe6IjYv8Zd8Kntm+4LQ3rnC2ACq72PQTpYJRrHBHhfjlq6fWN+ae tE5bGJ7WWF7ifXdjkTSKHrSjjSIATLxIwj1Rs/toMP3+o7utiVg8y7YOwkNMKscSz6O6 d8Dw52C7+fS6s5LtQHB2zhDngnQ0InMbJZM71aQs/o5B86VYJ/48s/DSB76BGRyDxpKg vVTw== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cy1si2284668edb.517.2021.04.25.20.07.30; Sun, 25 Apr 2021 20:07:31 -0700 (PDT) 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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F2348689986; Mon, 26 Apr 2021 06:07:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D34426881BB for ; Mon, 26 Apr 2021 06:07:14 +0300 (EEST) IronPort-SDR: U2MD8NQ3F13XLoja6lD0kGoNjckjAw4ePxbhxGE1G3NwLDdl5fyM1AowTuDSuuc7vS/r4MjvLx X1oVWrl+A+kQ== X-IronPort-AV: E=McAfee;i="6200,9189,9965"; a="183406441" X-IronPort-AV: E=Sophos;i="5.82,251,1613462400"; d="scan'208";a="183406441" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2021 20:07:06 -0700 IronPort-SDR: z7GRLfdfCfgF2M+GX2M2EvSobbz9s1w5hbkiiirAiU05FRLYciEJ8VBJxV6y8nGd37C9CTB2Fd 5ajj+mDzlvgA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,251,1613462400"; d="scan'208";a="422435051" Received: from chenwenbin-z390-aorus-ultra.sh.intel.com ([10.239.35.3]) by fmsmga008.fm.intel.com with ESMTP; 25 Apr 2021 20:07:05 -0700 From: wenbin.chen@intel.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Apr 2021 11:03:40 +0800 Message-Id: <20210426030341.3274799-2-wenbin.chen@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210426030341.3274799-1-wenbin.chen@intel.com> References: <20210426030341.3274799-1-wenbin.chen@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] libavcodec/qsvdec: remove redundant decodeHeader() 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 Cc: "Chen,Wenbin" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: D0KBCIQ3kByh From: "Chen,Wenbin" Since ffmpeg-qsv uses return value to reinit decoder, it doesn't need to decode header each time. Move qsv_decode_header's position so that it will be called only if codec needed to be reinitialized. Rearrange the code of flushing decoder and re-init decoder operation. Remove the buffer_count and use the got_frame to decide whether the decoder is drain. Signed-off-by: Wenbin Chen Signed-off-by Guangxin Xu --- libavcodec/qsvdec.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 88232f5d8d..fe416e74ca 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -63,7 +63,6 @@ typedef struct QSVContext { AVFifoBuffer *async_fifo; int zero_consume_run; - int buffered_count; int reinit_flag; enum AVPixelFormat orig_pix_fmt; @@ -504,8 +503,6 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q, ++q->zero_consume_run; if (q->zero_consume_run > 1) ff_qsv_print_warning(avctx, ret, "A decode call did not consume any data"); - } else if (!*sync && bs.DataOffset) { - ++q->buffered_count; } else { q->zero_consume_run = 0; } @@ -637,20 +634,21 @@ static int qsv_process_data(AVCodecContext *avctx, QSVContext *q, if (!avctx->coded_height) avctx->coded_height = 720; - ret = qsv_decode_header(avctx, q, pkt, pix_fmt, ¶m); - - if (q->reinit_flag || (ret >= 0 && (q->orig_pix_fmt != ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC) || - avctx->coded_width != param.mfx.FrameInfo.Width || - avctx->coded_height != param.mfx.FrameInfo.Height))) { + /* decode zero-size pkt to flush the buffered pkt before reinit */ + if (q->reinit_flag) { AVPacket zero_pkt = {0}; + ret = qsv_decode(avctx, q, frame, got_frame, &zero_pkt); + if (*got_frame) + return ret; + } - if (q->buffered_count) { - q->reinit_flag = 1; - /* decode zero-size pkt to flush the buffered pkt before reinit */ - q->buffered_count--; - return qsv_decode(avctx, q, frame, got_frame, &zero_pkt); - } + if (q->reinit_flag || !q->session) { q->reinit_flag = 0; + ret = qsv_decode_header(avctx, q, pkt, pix_fmt, ¶m); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Error decoding header\n"); + goto reinit_fail; + } q->orig_pix_fmt = avctx->pix_fmt = pix_fmt = ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC);