From patchwork Wed Apr 5 17:29:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felipe Astroza Araya X-Patchwork-Id: 3302 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp296053vss; Wed, 5 Apr 2017 10:36:50 -0700 (PDT) X-Received: by 10.28.216.208 with SMTP id p199mr20550815wmg.44.1491413810407; Wed, 05 Apr 2017 10:36:50 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o191si25276871wme.129.2017.04.05.10.36.49; Wed, 05 Apr 2017 10:36:50 -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; dkim=neutral (body hash did not verify) header.i=@astroza-cl.20150623.gappssmtp.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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C759F6882FE; Wed, 5 Apr 2017 20:36:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D097268798D for ; Wed, 5 Apr 2017 20:36:37 +0300 (EEST) Received: by mail-qt0-f194.google.com with SMTP id r5so2559841qtb.2 for ; Wed, 05 Apr 2017 10:36:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=astroza-cl.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=BuY/tRhtUjoevGSTTvSb9p6U8h15igL64QBX3wK0Wb0=; b=xVx0NTsQegaod+36krSKZE7NXdVbbS2qJAelP2MIWtqJCZMv1UlM1UpLztp2QRLS6f n0Cys7xiH7Ai4uSVFfD/ZvyizZp9k09o9ZTKrOeiDdvH1f61jsLFfWleo21TEEuFFlaN at4qq3PnhQLo/wepCJj5LfAzKQSXEbBsk/omWDUIj92z4PVcHwo1QIdezkO6Ols4z994 sfRTpvN/+f0rWP6Pg5rtBZZxR22uy/1o3yYEDCAV12c2mVG1HobXOzxOJgIAI2odhAPf 9wp5DDAQ8DSuD9b2p+vkw6gVbfUz0Ur6j+TpMwlqlw/IOic8T5+BArAWiHVrm3hKZVp2 L9cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=BuY/tRhtUjoevGSTTvSb9p6U8h15igL64QBX3wK0Wb0=; b=Ekit7rLQrE/+bFsBpX0ejrE0WyEK4heg4BLkkhAYUO4l+BqRPP+jTgvTEYOrf74uP0 mOqqJ6fZE+7jK82hYLKEhsLKu0NwitKRLxbFH1LpZH+060wt7RKEvR4+Z6PChRYNHaGv Q2uj3F+nB0Lbielx+GdSL35pl0zNQE5wY4pUymXM74SQQvhz4cdbp0dFOOJMzUvk/yf+ Osl/W8PwjqoN0DzD2JkDqUdawvUWCHUf2aQeR71/7NZkR7QvZ7q48E6Bb/mxYv5DHE26 bEmNoe++TDj+88KjRxa25QVf2YAbFVMb0CAE2X8AFOXVrtbKzQYziI4DSG54T2oyQ1XX gTgA== X-Gm-Message-State: AFeK/H3+K77gM5kIGb/3AWxQ1XM2nLcz7FR0MhS06kK3JTn94NVzAqrHtA0y+O9GwQzztg== X-Received: by 10.200.50.92 with SMTP id y28mr33321391qta.289.1491413417886; Wed, 05 Apr 2017 10:30:17 -0700 (PDT) Received: from freya.ned.cl ([186.67.84.242]) by smtp.gmail.com with ESMTPSA id r24sm1276601qkl.54.2017.04.05.10.30.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Apr 2017 10:30:17 -0700 (PDT) From: felipe@astroza.cl To: ffmpeg-devel@ffmpeg.org Date: Wed, 5 Apr 2017 14:29:30 -0300 Message-Id: <1491413370-18163-1-git-send-email-felipe@astroza.cl> X-Mailer: git-send-email 2.7.4 Subject: [FFmpeg-devel] [PATCH] flvdec: option for dropping negative CTS frames Initial frames with negative pts can produce video/audio desynchronization when a decoder is not prepared to handle negative pts. For example: QSV transcoding from RTMP Wowza server 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: Felipe Astroza MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Felipe Astroza Signed-off-by: Felipe Astroza --- libavformat/flvdec.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 3959a36..1556fe0 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -44,6 +44,7 @@ typedef struct FLVContext { const AVClass *class; ///< Class for private options. int trust_metadata; ///< configure streams according onMetaData + int drop_negative_cts;///< drop frames if cts is negative int wrong_dts; ///< wrong dts due to negative cts uint8_t *new_extradata[FLV_STREAM_TYPE_NB]; int new_extradata_size[FLV_STREAM_TYPE_NB]; @@ -1139,10 +1140,16 @@ retry_duration: int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; pts = dts + cts; if (cts < 0) { // dts might be wrong - if (!flv->wrong_dts) + if (flv->drop_negative_cts) { av_log(s, AV_LOG_WARNING, - "Negative cts, previous timestamps might be wrong.\n"); - flv->wrong_dts = 1; + "Negative cts, frames will be dropped.\n"); + dts = pts = AV_NOPTS_VALUE; + } else { + if (!flv->wrong_dts) + av_log(s, AV_LOG_WARNING, + "Negative cts, previous timestamps might be wrong.\n"); + flv->wrong_dts = 1; + } } else if (FFABS(dts - pts) > 1000*60*15) { av_log(s, AV_LOG_WARNING, "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts); @@ -1253,6 +1260,7 @@ static int flv_read_seek(AVFormatContext *s, int stream_index, #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM static const AVOption options[] = { { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, + { "flv_drop_negative_cts", "Drop frames with negative composition timestamp", OFFSET(drop_negative_cts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, { NULL } };