[FFmpeg-devel] [PATCH] more mov edl fixes

Baptiste Coudurier baptiste.coudurier
Mon Mar 16 19:55:28 CET 2009


On 3/16/2009 10:35 AM, Reimar D?ffinger wrote:
> On Mon, Mar 16, 2009 at 10:15:32AM -0700, Baptiste Coudurier wrote:
>> Hi Reimar,
>>
>> On 3/16/2009 6:49 AM, Reimar D?ffinger wrote:
>>> Hello,
>>> attached patch fixes sync of
>>> http://samples.mplayerhq.hu/mov/weirdedl.mp4 (subtitles are supposed to
>>> be exactly in sync, the audio is supposed to be delayed by exactly 3
>>> seconds compared to how it plays now).
>>> Two issues:
>>> 1) it uses an "fillup" edl entry with time == -1 (implemented by the
>>> second chunk of the patch).
>>> 2) edl time values are relative to container, not track rate,
>>> implemented in an ugly way by the first chunk.
>>>
>>>
>>> Index: libavformat/mov.c
>>> ===================================================================
>>> --- libavformat/mov.c	(revision 18004)
>>> +++ libavformat/mov.c	(working copy)
>>> @@ -1246,7 +1246,7 @@
>>>      /* adjust first dts according to edit list */
>>>      if (sc->time_offset) {
>>>          assert(sc->time_offset % sc->time_rate == 0);
>>> -        current_dts = - (sc->time_offset / sc->time_rate);
>>> +        current_dts = - ((int64_t)sc->time_offset * sc->time_scale / mov->time_scale / sc->time_rate);
>>>      }
>>>  
>>>      /* only use old uncompressed audio chunk demuxing when stts specifies it */
>>> @@ -1741,12 +1741,12 @@
>>>  
>>>      for(i=0; i<edit_count; i++){
>>>          int time;
>>> -        get_be32(pb); /* Track duration */
>>> +        int duration = get_be32(pb); /* Track duration */
>>>          time = get_be32(pb); /* Media time */
>>>          get_be32(pb); /* Media rate */
>>> -        if (i == 0 && time != -1) {
>>> -            sc->time_offset = time;
>>> -            sc->time_rate = av_gcd(sc->time_rate, time);
>>> +        if (i == 0) {
>>> +            sc->time_offset = time != -1 ? time : -duration;
>>> +            sc->time_rate = av_gcd(sc->time_rate, FFABS(sc->time_offset));
>>>          }
>>>      }
>> I think you can rescale here, using av_rescale. Values are available.
> 
> No, sc->time_scale is 0 here.

Crap.

Well, I think av_rescale can be used.

Are you sure the rescaling is right for "time" ? "time" should be in
track timescale, while duration is in movie timescale IIRC.

-- 
Baptiste COUDURIER                              GnuPG Key Id: 0x5C1ABAAA
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
checking for life_signs in -lkenny... no
FFmpeg maintainer                                  http://www.ffmpeg.org




More information about the ffmpeg-devel mailing list