[FFmpeg-devel] [PATCH 2/3] avformat/movenc: Use base container timescale, instead of hard coded default
Marton Balint
cus at passwd.hu
Fri May 22 00:19:23 EEST 2020
On Mon, 20 Apr 2020, Kevin Wheatley wrote:
> Signed-off-by: Kevin Wheatley <kevin.j.wheatley at 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
More information about the ffmpeg-devel
mailing list