[FFmpeg-devel] [PATCH] mov: fix DTS calculation for samples with negative stts duration

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Fri May 29 15:27:36 CEST 2015


On 29.05.2015 05:03, Michael Niedermayer wrote:
> On Thu, May 28, 2015 at 06:49:02PM +0200, Andreas Cadhalpun wrote:
>> @@ -2522,7 +2519,27 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
>>  
>>                  current_offset += sample_size;
>>                  stream_size += sample_size;
>> +
>> +                /* A negative sample duration is invalid based on the spec,
>> +                 * but some samples need it to correct the DTS. */
>> +                if (sc->stts_data[stts_index].duration < 0) {
>> +                    av_log(mov->fc, AV_LOG_WARNING,
>> +                           "Invalid SampleDelta %d in STTS, at %d st:%d\n",
>> +                           sc->stts_data[stts_index].duration, stts_index,
>> +                           st->index);
>> +                    dts_correction += sc->stts_data[stts_index].duration - 1;
>> +                    sc->stts_data[stts_index].duration = 1;
>> +                }
>>                  current_dts += sc->stts_data[stts_index].duration;
>> +                if (current_dts + dts_correction > last_dts) {
>> +                    current_dts += dts_correction;
>> +                    dts_correction = 0;
>> +                } else {
>> +                    /* Avoid creating non-monotonous DTS */
>> +                    dts_correction += current_dts - last_dts - 1;
>> +                    current_dts = last_dts + 1;
> 
> this would enfore strict monotonicity not just monotoicity
> dts[i-1] == dts[i] was previously left as is
> is there a reason to change this ?

If the dts doesn't change, the packet duration is passed through. This
leads to a wrong packet duration, when dts_correction is in effect.

> Ive not checked what the spec says about it but i suspect there are
> files which have such dts

I haven't found an explicit mentioning of duration 0 in the spec, but
if you think it's better not to change how this was handled previously
for samples which didn't have a negative duration, one can simply
add '!dts_correction ||' before the 'current_dts + dts_correction > last_dts'
check. Attached patch includes this change.

Best regards,
Andreas

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mov-fix-DTS-calculation-for-samples-with-negative-st.patch
Type: text/x-diff
Size: 3525 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150529/316dc34d/attachment.bin>


More information about the ffmpeg-devel mailing list