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.
-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel