Message ID | 1587405459-29001-3-git-send-email-kevin.j.wheatley@gmail.com |
---|---|
State | New |
Headers | show |
Series | avformat/movenc: Support for variable timescale in mov containers | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On Mon, 20 Apr 2020, Kevin Wheatley wrote: > Signed-off-by: Kevin Wheatley <kevin.j.wheatley@gmain.com> > --- > libavformat/movenc.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) You should squash this patch with the previous. > > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > index 7d79eca..508fa73 100644 > --- a/libavformat/movenc.c > +++ b/libavformat/movenc.c > @@ -2879,7 +2879,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, > MOVTrack *track, AVStream *st) > { > int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track), > - MOV_TIMESCALE, track->timescale, > + mov->mov_timescale, track->timescale, > AV_ROUND_UP); > int version = duration < INT32_MAX ? 0 : 1; > int flags = MOV_TKHD_FLAG_IN_MOVIE; > @@ -3027,7 +3027,7 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, > MOVTrack *track) > { > int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track), > - MOV_TIMESCALE, track->timescale, > + mov->mov_timescale, track->timescale, > AV_ROUND_UP); > int version = duration < INT32_MAX ? 0 : 1; > int entry_size, entry_count, size; > @@ -3046,7 +3046,7 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, > } > } > > - delay = av_rescale_rnd(start_dts + start_ct, MOV_TIMESCALE, > + delay = av_rescale_rnd(start_dts + start_ct, mov->mov_timescale, > track->timescale, AV_ROUND_DOWN); > version |= delay < INT32_MAX ? 0 : 1; > > @@ -3081,8 +3081,8 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, > /* Avoid accidentally ending up with start_ct = -1 which has got a > * special meaning. Normally start_ct should end up positive or zero > * here, but use FFMIN in case dts is a small positive integer > - * rounded to 0 when represented in MOV_TIMESCALE units. */ > - av_assert0(av_rescale_rnd(start_dts, MOV_TIMESCALE, track->timescale, AV_ROUND_DOWN) <= 0); > + * rounded to 0 when represented in mov->mov_timescale units. */ > + av_assert0(av_rescale_rnd(start_dts, mov->mov_timescale, track->timescale, AV_ROUND_DOWN) <= 0); > start_ct = -FFMIN(start_dts, 0); > /* Note, this delay is calculated from the pts of the first sample, > * ensuring that we don't reduce the duration for cases with > @@ -3316,7 +3316,7 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov) > if (mov->tracks[i].entry > 0 && mov->tracks[i].timescale) { > int64_t max_track_len_temp = av_rescale_rnd( > calc_pts_duration(mov, &mov->tracks[i]), > - MOV_TIMESCALE, > + mov->mov_timescale, > mov->tracks[i].timescale, > AV_ROUND_UP); > if (max_track_len < max_track_len_temp) > @@ -3345,7 +3345,7 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov) > avio_wb32(pb, mov->time); /* creation time */ > avio_wb32(pb, mov->time); /* modification time */ > } > - avio_wb32(pb, MOV_TIMESCALE); > + avio_wb32(pb, mov->mov_timescale); > (version == 1) ? avio_wb64(pb, max_track_len) : avio_wb32(pb, max_track_len); /* duration of longest track */ > > avio_wb32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */ > @@ -5921,7 +5921,7 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) > > track->mode = mov->mode; > track->tag = MKTAG('t','e','x','t'); > - track->timescale = MOV_TIMESCALE; > + track->timescale = mov->mov_timescale; > track->par = avcodec_parameters_alloc(); > if (!track->par) > return AVERROR(ENOMEM); > @@ -5982,8 +5982,8 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) > AVChapter *c = s->chapters[i]; > AVDictionaryEntry *t; > > - int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,MOV_TIMESCALE}); > - pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,MOV_TIMESCALE}); > + int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,mov->mov_timescale}); > + pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,mov->mov_timescale}); > pkt.duration = end - pkt.dts; > > if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { > @@ -6518,7 +6518,7 @@ static int mov_init(AVFormatContext *s) > } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) { > track->timescale = st->time_base.den; > } else { > - track->timescale = MOV_TIMESCALE; > + track->timescale = mov->mov_timescale; I think this should remain MOV_TIMESCALE. This is a stream with unknown stream type, we have no idea what track timescale to use, and in the next patch I think you should determine the mov timescale based on the track timescales and not time bases. Regards, Marton
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 7d79eca..508fa73 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2879,7 +2879,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track, AVStream *st) { int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track), - MOV_TIMESCALE, track->timescale, + mov->mov_timescale, track->timescale, AV_ROUND_UP); int version = duration < INT32_MAX ? 0 : 1; int flags = MOV_TKHD_FLAG_IN_MOVIE; @@ -3027,7 +3027,7 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track), - MOV_TIMESCALE, track->timescale, + mov->mov_timescale, track->timescale, AV_ROUND_UP); int version = duration < INT32_MAX ? 0 : 1; int entry_size, entry_count, size; @@ -3046,7 +3046,7 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, } } - delay = av_rescale_rnd(start_dts + start_ct, MOV_TIMESCALE, + delay = av_rescale_rnd(start_dts + start_ct, mov->mov_timescale, track->timescale, AV_ROUND_DOWN); version |= delay < INT32_MAX ? 0 : 1; @@ -3081,8 +3081,8 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, /* Avoid accidentally ending up with start_ct = -1 which has got a * special meaning. Normally start_ct should end up positive or zero * here, but use FFMIN in case dts is a small positive integer - * rounded to 0 when represented in MOV_TIMESCALE units. */ - av_assert0(av_rescale_rnd(start_dts, MOV_TIMESCALE, track->timescale, AV_ROUND_DOWN) <= 0); + * rounded to 0 when represented in mov->mov_timescale units. */ + av_assert0(av_rescale_rnd(start_dts, mov->mov_timescale, track->timescale, AV_ROUND_DOWN) <= 0); start_ct = -FFMIN(start_dts, 0); /* Note, this delay is calculated from the pts of the first sample, * ensuring that we don't reduce the duration for cases with @@ -3316,7 +3316,7 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov) if (mov->tracks[i].entry > 0 && mov->tracks[i].timescale) { int64_t max_track_len_temp = av_rescale_rnd( calc_pts_duration(mov, &mov->tracks[i]), - MOV_TIMESCALE, + mov->mov_timescale, mov->tracks[i].timescale, AV_ROUND_UP); if (max_track_len < max_track_len_temp) @@ -3345,7 +3345,7 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov) avio_wb32(pb, mov->time); /* creation time */ avio_wb32(pb, mov->time); /* modification time */ } - avio_wb32(pb, MOV_TIMESCALE); + avio_wb32(pb, mov->mov_timescale); (version == 1) ? avio_wb64(pb, max_track_len) : avio_wb32(pb, max_track_len); /* duration of longest track */ avio_wb32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */ @@ -5921,7 +5921,7 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) track->mode = mov->mode; track->tag = MKTAG('t','e','x','t'); - track->timescale = MOV_TIMESCALE; + track->timescale = mov->mov_timescale; track->par = avcodec_parameters_alloc(); if (!track->par) return AVERROR(ENOMEM); @@ -5982,8 +5982,8 @@ static int mov_create_chapter_track(AVFormatContext *s, int tracknum) AVChapter *c = s->chapters[i]; AVDictionaryEntry *t; - int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,MOV_TIMESCALE}); - pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,MOV_TIMESCALE}); + int64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,mov->mov_timescale}); + pkt.pts = pkt.dts = av_rescale_q(c->start, c->time_base, (AVRational){1,mov->mov_timescale}); pkt.duration = end - pkt.dts; if ((t = av_dict_get(c->metadata, "title", NULL, 0))) { @@ -6518,7 +6518,7 @@ static int mov_init(AVFormatContext *s) } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) { track->timescale = st->time_base.den; } else { - track->timescale = MOV_TIMESCALE; + track->timescale = mov->mov_timescale; } if (!track->height) track->height = st->codecpar->height;
Signed-off-by: Kevin Wheatley <kevin.j.wheatley@gmain.com> --- libavformat/movenc.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)