On 7/4/17 3:26 PM, Peter Große wrote:
> On Wed, 28 Jun 2017 00:31:16 +0200
> Peter Große <pegro-wgafdpjn0n2zqb+pc5n...@public.gmane.org> wrote:
> 
>> Hello.
>>
>> I've problems playing a short clip [1] in a continuous loop using the -loop
>> option and I'm not sure, how to fix this.
>>
>> Running
>>   avconv -loop -1 -i in.mp4 -qscale 2 out.avi
>> leads to an infinite loop (without any output) after the first iteration.
>>
>> I narrowed down the problem to a call to av_seek_frame(), looking for a
>> non-existant timestamp. See below.
>>
>> The clip is a stream capture of a live stream containing one video and one
>> audio track. Both tracks start with negative stamps:
>>
>> Video:
>>     ts[0] = -512 (keyframe)
>>     ts[1] = -256 (no keyframe)
>>     ts[2] = 0 (no keyframe)
>>     ts[3] = 256 (no keyframe)
>>     ts[4] = 512 (no keyframe)
>>
>> Audio:
>>     ts[0] = -1024 (keyframe)
>>     ts[1] = 0 (keyframe)
>>     ts[2] = 1024 (keyframe)
>>     ts[3] = 2048 (keyframe)
>>     ts[4] = 3072 (keyframe)
>>
>> In libavformat/utils.c:1664 in update_stream_timings(), the smallest
>> timestamp of all streams of the given format context is calculated and set as
>> "start_time".
>>
>> In my case
>>   streams[0].start_time = 0
>>   streams[0].time_base = 1/12800
>>
>>   streams[1].start_time = -1024
>>   streams[1].time_base = 1/48000
>>
>> leads to
>>   ic->start_time = -21333
>>
>> due to the smaller timestamp of the audio track.
>>
>> When the clip ends, seek_to_start() (avtools/avconv.c:2515) is called, which
>> calls av_seek_frame() with stream_index -1 and this start_time.
>>
>> And there is the issue: stream_index=-1 indicates no specific stream is 
>> selected, but the given start_time relates to the audio track.
>>
>> The called seek_frame_internal() then selects the default stream, since no
>> specific stream was selected, which is in my case stream 0, the video track.
>> Then the "start_time" timestamp (of the audio track) gets rescaled with the 
>> time_base of the selected stream (the video track).
>>
>>   timestamp = -273
>>
>> The following call to read_seek (in my case mov_read_seek) then fails to 
>> find a frame with that invalid timestamp and returns AVERROR_INVALIDDATA.
>> This leads to seek_to_start() to return, as well as process_input() and
>> the loop starts again with the same result, leading to the described infinite
>> loop.
>>
>> My question is now: which of these issues are bugs and how to fix them
>> properly?
>>
>> Should the AVFormatContext->start_time be set to smallest timestamp of all
>> streams or only of the default stream? Maybe also store the stream index the
>> timestamp refers to?
>>
>> Should seek_to_start() use stream_index=-1 and the context start_time
>> together?
>>
>> How should the errors occurring during seek_to_start() be handled? I guess 
>> in the context of live streams restarting the encoding after errors 
>> is nice, but when decoding files any errors should make avconv exit, since 
>> recovering from decoding problems of the same file is not likely.
>>
>> How should the mov demuxer handle negative timestamps when seeking?
>> Currently, all negative timestamps are set to 0 in mov_read_seek()
>> (mov.c:4053), which leads in my case to mov_seek_stream() bailing out with
>> AVERROR_INVALIDDATA, since no key frame with that timestamp is found
>> (keyframe is at -512) and the condition
>>
>>   if (sample < 0 && st->nb_index_entries && 
>>       timestamp < st->index_entries[0].timestamp)
>>
>> is not met: timestamp=0 is not smaller than the first (negative) timestamp.
>>
>> Looking through the code, I noticed a time_offset is calculated when parsing
>> the header of the clip. Using this offset when seeking for timestamp=0 fixed
>> the immediate problem, see attached patch. But I'm not sure, if this is
>> correct and I think the other issues are still valid.
>>
>> I hope the information provided is enough to reproduce the issue.
>>
>> Regards
>> Peter
>>
>> [1] https://trac.ffmpeg.org/raw-attachment/ticket/6139/loop.mp4
> 
> I'd like to ask kindly if anyone could give me some more feedback to help me 
> fixing these issues? Or is now somehow a bad time? Is more information 
> required?
> 

Alexandra seemed to like your patch but I guess she is now busy, from my
understanding ideally the loop feature probably should change the
strategy and re-open the stream at every loop iteration to avoid to
handle seek-back quirks.

I'll try to have a look at it myself in the weekend if Alexandra is
still busy.

lu

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to