From patchwork Thu Jan 3 01:33:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 11641 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4216644E1C5 for ; Thu, 3 Jan 2019 03:33:11 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EACF168A277; Thu, 3 Jan 2019 03:33:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0773E689DCD for ; Thu, 3 Jan 2019 03:33:01 +0200 (EET) X-Originating-IP: 213.47.41.20 Received: from localhost (213-47-41-20.cable.dynamic.surfer.at [213.47.41.20]) (Authenticated sender: michael@niedermayer.cc) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 042A040005 for ; Thu, 3 Jan 2019 01:33:09 +0000 (UTC) Date: Thu, 3 Jan 2019 02:33:08 +0100 From: Michael Niedermayer To: FFmpeg development discussions and patches Message-ID: <20190103013308.GB3501@michaelspb> References: <20181121155848.201788-1-derek.buitenhuis@gmail.com> <20181121155848.201788-3-derek.buitenhuis@gmail.com> <20181122021650.GU3343@michaelspb> <0dbcde3f-8ab5-2c25-8e73-0ce96283c976@gmail.com> <20181123021616.GW3343@michaelspb> MIME-Version: 1.0 In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Subject: Re: [FFmpeg-devel] [PATCH 2/3] flvdec: Mark the demuxer as allowing discontinuous timestamps 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On Mon, Nov 26, 2018 at 01:51:25PM +0000, Derek Buitenhuis wrote: > On 23/11/2018 02:16, Michael Niedermayer wrote: > > do we have some sample flv files that require this patchset / that have > > discontinuites. > > I have many. I've mailed you one privately, while I work on getting a public one. > > > another thing i just realize now, why is this discontinuity issues coming up > > now? flv support is very old. This should be a long standing issue > > Probably not many codebases check the DISCONT flag. I only just added proper > discontinuity handling to some codebases this year, and that's why *I* noticed. > Chances are most people use the ffmpeg cli which seems to handle stuff differently, > and doesn't necessarily care about the flag. In my case, I only try to 'fix' > discontinuities if they appear to be in a format that allows them, during indexing. > > I could add a workaround specific to FLV, or some threshold stuff, but I'd prefer > that demuxers which may output discontinuous timestamps say they do. The file looks like 2 files concatenated, even with FLV main header between them. the patch below should make this work with sequential demuxing assuming the 2 files dont change streams somehow with the normal demuxer. not sure this is the best way to do it ... also trying a random other flv related tool, FLVTool2 1.0.6 does not seem to demux the 2nd file of the 2 correctly. Which makes me suspect more that the file is invalid. Not that this would fundamentally change anything thx [...] diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 4b9f46902b..c9423da31c 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -72,6 +72,8 @@ typedef struct FLVContext { int64_t *keyframe_filepositions; int missing_streams; AVRational framerate; + int64_t last_ts; + int64_t time_offset; } FLVContext; static int probe(AVProbeData *p, int live) @@ -917,6 +919,17 @@ static int resync(AVFormatContext *s) flv->resync_buffer[j ] = flv->resync_buffer[j1] = avio_r8(s->pb); + if (i >= 8) { + uint8_t *d = flv->resync_buffer + j1 - 8; + if (d[0] == 'F' && + d[1] == 'L' && + d[2] == 'V' && + d[3] < 5 && d[5] == 0) { + av_log(s, AV_LOG_WARNING, "Concatenated FLV detected, might fail to demux, decode and seek %Ld\n", flv->last_ts); + flv->time_offset = flv->last_ts + 1; + } + } + if (i > 22) { unsigned lsize2 = AV_RB32(flv->resync_buffer + j1 - 4); if (lsize2 >= 11 && lsize2 + 8LL < FFMIN(i, RESYNC_BUFFER_SIZE)) { @@ -1238,8 +1251,8 @@ retry_duration: ret = av_get_packet(s->pb, pkt, size); if (ret < 0) return ret; - pkt->dts = dts; - pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts; + pkt->dts = dts + flv->time_offset; + pkt->pts = (pts == AV_NOPTS_VALUE ? dts : pts) +flv->time_offset ; pkt->stream_index = st->index; pkt->pos = pos; if (flv->new_extradata[stream_type]) { @@ -1282,6 +1295,10 @@ leave: } } } + + if (ret >= 0) + flv->last_ts = pkt->dts; + return ret; }