[Ffmpeg-devel] "error, non monotone timestamps" when extracting audio from 3gp

Julian Scheid julian
Sat Dec 10 17:33:26 CET 2005


Julian Scheid wrote:
> But using today's ffmpeg from CVS (same configuration options, same gcc
> version, same mp3lame and AMR codec versions), or when using Debian
> unstable's latest ffmpeg package, I get the following errors (the full
> log files are attached):
> 
> error, non monotone timestamps 1355254 >= 1355254 (CVS)
> error, non monotone timestamps 1353600 >= 1353600 (Debian/unstable)
> 
> And in both cases I end up with only 762 bytes of bogus audio data.

Since nobody cared to answer to my post, I decided to track down this
issue myself and managed to come up with a fix.  Being unfamiliar with
the code base, I'm not entirely sure that it is the right solution but
it seems to do the trick.  Following are the details of my findings.

The immediate cause seems to be that the following test in
libavformat/mov.c line 2005 fails for all but the first couple of audio
samples:

> if (sc && sc->sample_to_time_index < sc->stts_count && pkt) {	 

stts_count is 1 which I verified to be correct for my input file, so
I took a look at the value of sample_to_index_time. Further digging
showed that it is increased when the following test in line 2011
evaluates to true:

> if ((sc->sample_to_time_sample + count) < sc->current_sample) {	 

Looking at the value of sc->current_sample, I noticed that it didn't
increase by 1 for each sample, but instead by 27 which is the sample
size.

I could be wrong, but as far as I can see the current_sample field is
meant to be the sample number, not an offset into the sample data.
Unfortunately there is no comment explaining the purpose of the field,
but its name and usage seems to indicate so.

Now, I found one place in line 1951 in which the current_sample field
value is incremented by multiples of sc->sample_size:

> sc->current_sample += sc->sample_size * sc->sample_to_chunk[idx].count;

I suppose this is the cause of the problem, as changing this line to the
following makes my issue go away:

	sc->current_sample += sc->sample_to_chunk[idx].count;

A corresponding patch against CVS HEAD is attached.

Please let me know if this is the correct fix.

Thanks,

Julian Scheid
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffmpeg-mov-sample_number.patch
Type: text/x-patch
Size: 560 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20051210/e183a633/attachment.bin>



More information about the ffmpeg-devel mailing list