On 05/22/2013 04:24 PM, Justin Ruggles wrote:
> On 05/30/2012 05:42 PM, Alex Converse wrote:
>> ---
>>  libavformat/movenc.c |   22 +++++++++++++++-------
>>  1 files changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>> index fa6e957..a8c68af 100644
>> --- a/libavformat/movenc.c
>> +++ b/libavformat/movenc.c
>> @@ -1464,10 +1464,15 @@ static int mov_write_edts_tag(AVIOContext *pb, 
>> MOVTrack *track)
>>                                        track->timescale, AV_ROUND_UP);
>>      int version = duration < INT32_MAX ? 0 : 1;
>>      int entry_size, entry_count, size;
>> -    int64_t delay, start_ct = track->cluster[0].cts;
>> -    delay = av_rescale_rnd(track->cluster[0].dts + start_ct, MOV_TIMESCALE,
>> -                           track->timescale, AV_ROUND_DOWN);
>> -    version |= delay < INT32_MAX ? 0 : 1;
>> +    int64_t delay, trim = 0;
>> +    delay = av_rescale_rnd(track->cluster[0].dts + track->cluster[0].cts,
>> +                           MOV_TIMESCALE, track->timescale, AV_ROUND_DOWN);
>> +    if (track->cluster[0].cts) {
>> +        trim = track->cluster[0].cts;
>> +    } else if (track->cluster[0].dts < 0) {
>> +        trim = -track->cluster[0].dts;
>> +    }
>> +    version |= delay < INT32_MAX && trim < INT32_MAX ? 0 : 1;
>>  
>>      entry_size = (version == 1) ? 20 : 12;
>>      entry_count = 1 + (delay > 0);
>> @@ -1496,10 +1501,10 @@ static int mov_write_edts_tag(AVIOContext *pb, 
>> MOVTrack *track)
>>      /* duration */
>>      if (version == 1) {
>>          avio_wb64(pb, duration);
>> -        avio_wb64(pb, start_ct);
>> +        avio_wb64(pb, trim);
>>      } else {
>>          avio_wb32(pb, duration);
>> -        avio_wb32(pb, start_ct);
>> +        avio_wb32(pb, trim);
>>      }
>>      avio_wb32(pb, 0x00010000);
>>      return size;
>> @@ -2882,8 +2887,11 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket 
>> *pkt)
>>           * of this packet to be what the previous packets duration implies. 
>> */
>>          trk->cluster[trk->entry].dts = trk->start_dts + trk->track_duration;
>>      }
>> -    if (trk->start_dts == AV_NOPTS_VALUE)
>> +    if (trk->start_dts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE) {
>>          trk->start_dts = pkt->dts;
>> +        if (trk->start_dts < 0 && pkt->pts == pkt->dts)
>> +            trk->start_dts = 0;
>> +    }
>>      trk->track_duration = pkt->dts - trk->start_dts + pkt->duration;
>>  
>>      if (pkt->pts == AV_NOPTS_VALUE) {
> 
> Should we go ahead and commit this? It is good enough for me, and it
> fixes the most common cases.
> 

Fine for me.

lu

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to