From patchwork Sun Sep 30 01:00:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 10515 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:1296:0:0:0:0:0 with SMTP id 22-v6csp1349844jap; Sat, 29 Sep 2018 18:01:14 -0700 (PDT) X-Google-Smtp-Source: ACcGV623WO5UbaaNg8mxPcTNJ5e+qUMFmVAkO0qmn6g+xNkvdsVXNZJ/fg6npOlu1NQm0LI2g+S6 X-Received: by 2002:a1c:a9ce:: with SMTP id s197-v6mr119993wme.82.1538269274165; Sat, 29 Sep 2018 18:01:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538269274; cv=none; d=google.com; s=arc-20160816; b=XF7O7pyhkiSTB2IJjF5v59hV9kblT62ayXf0x6CJRX2JWCQ3TtzEcOjtCpOjK5O3EM o+qkK0ZiurWIb0PrlLuc8JlmhA43pEys8AV8MjWVn5sw16swvwuu1mHZS3TBV4uk+oH8 fSwKVIFbXlLXSalcLpfOZAFGVenCCtAFWuikk/91l0UlsrCFk6ufcixL8cSZlLUtyVkp 2pck2ws2FCW70Lkrf/Hvqstu4KMtc1PFeZirsUfTNqRnN1B2cwLrrnPUGlCbJhW2Hhuh jfsoSEStOARd34Y9OH6WwqqbebFCyD7f3aiK4QfLK4y8vgXZzvqnIXOE/B6b74nrSUFX HPfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to; bh=GAv+z6znEVpJTA5r1HG+COrpiyMH7xXu+TQWoGm//18=; b=xXLpwKOJjfyVXLgSuv1Yt1y8TkhJdcGHhV0z7T8F0426XrnRKCK4df2GvFc4h0OU7D MVauuWFLHA78V9HlzQ7+rCE2GPPstv4YPyqxknyC1IlcAAbrNDzQAGBcHPYzLFyqK2my kuZ7ATLn7zr0lJpC4khjRQbgpzbakHJI/X5qDS6ar5p1lO6WKWzhFF9WAGJut7SGHysb UaM0BPQgE7HeuX/DwkTbpYYBDOBRJJ2atJtUEn0dWqtbAFHmfDMemNyOuWzvSv00n5bu Doin8nTezapEMJxr2k8OXu0SRLU3XDpsZiJkKGp4z/JO/1plaL2E0TuGdn5Fd9PYWLI3 V6QQ== 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 u16-v6si4450847wmu.50.2018.09.29.18.01.13; Sat, 29 Sep 2018 18:01:14 -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 B4FB868A0CE; Sun, 30 Sep 2018 04:00:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5017E689F89 for ; Sun, 30 Sep 2018 04:00:47 +0300 (EEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Sep 2018 18:01:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,322,1534834800"; d="scan'208";a="95097066" Received: from unknown (HELO kubernetes-master.sh.intel.com) ([10.239.159.161]) by orsmga001.jf.intel.com with ESMTP; 29 Sep 2018 18:01:02 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Sun, 30 Sep 2018 09:00:59 +0800 Message-Id: <20180930010059.5233-1-linjie.fu@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] avcodec/qsvdec:flush the buffered data before reinit X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Zhong Li , Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Flush the buffered data in libmfx before video param reinit in case the frames drop. Cache the first frame causing the reinit and decode zero-size pkt to flush the buffered pkt before reinit. After all the buffered pkts being flushed, resume to reinit and decode. Fix the issue in ticket #7399. Modified in qsvdec_other.c as well. Signed-off-by: Linjie Fu Signed-off-by: Zhong Li --- libavcodec/qsvdec.c | 12 ++++++++++++ libavcodec/qsvdec.h | 2 ++ libavcodec/qsvdec_h2645.c | 11 +++++++---- libavcodec/qsvdec_other.c | 10 +++++++--- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 22e7a46a85..ca4500b456 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -372,6 +372,8 @@ 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; } @@ -493,6 +495,7 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, int dummy_size; int ret; const AVPixFmtDescriptor *desc; + AVPacket zero_pkt = {0}; if (!q->avctx_internal) { q->avctx_internal = avcodec_alloc_context3(NULL); @@ -527,6 +530,15 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, AV_PIX_FMT_NONE }; enum AVPixelFormat qsv_format; + 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); + } + + q->reinit_flag = 0; + qsv_format = ff_qsv_map_pixfmt(q->parser->format, &q->fourcc); if (qsv_format < 0) { av_log(avctx, AV_LOG_ERROR, diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h index 5b7b03a48b..111536caba 100644 --- a/libavcodec/qsvdec.h +++ b/libavcodec/qsvdec.h @@ -53,6 +53,8 @@ typedef struct QSVContext { AVFifoBuffer *async_fifo; int zero_consume_run; + int buffered_count; + int reinit_flag; // the internal parser and codec context for parsing the data AVCodecParserContext *parser; diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c index d9d2318d1a..b8a78aa81b 100644 --- a/libavcodec/qsvdec_h2645.c +++ b/libavcodec/qsvdec_h2645.c @@ -146,10 +146,11 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, /* no more data */ if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); - - av_packet_unref(&s->buffer_pkt); - - av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL); + /* in progress of reinit, no read from fifo and keep the buffer_pkt */ + if (!s->qsv.reinit_flag) { + av_packet_unref(&s->buffer_pkt); + av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL); + } } ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->buffer_pkt); @@ -159,6 +160,8 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, av_packet_unref(&s->buffer_pkt); return ret; } + if (s->qsv.reinit_flag) + continue; s->buffer_pkt.size -= ret; s->buffer_pkt.data += ret; diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c index 993c7a8e80..b449bb21b7 100644 --- a/libavcodec/qsvdec_other.c +++ b/libavcodec/qsvdec_other.c @@ -132,9 +132,11 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, /* no more data */ if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); - - av_packet_unref(&s->input_ref); - av_fifo_generic_read(s->packet_fifo, &s->input_ref, sizeof(s->input_ref), NULL); + /* in progress of reinit, no read from fifo and keep the buffer_pkt */ + if (!s->qsv.reinit_flag) { + av_packet_unref(&s->input_ref); + av_fifo_generic_read(s->packet_fifo, &s->input_ref, sizeof(s->input_ref), NULL); + } } ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->input_ref); @@ -145,6 +147,8 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data, return ret; } + if (s->qsv.reinit_flag) + continue; s->input_ref.size -= ret; s->input_ref.data += ret;