On 02/19/2017 03:23 PM, John Stebbins wrote:
> initial_padding was getting added to the edit list indirectly due to
> initial negative dts. But in cases where the audio is delayed,
> all or part of initial_padding would be unaccounted for. This patch
> makes initial_padding explicit.
> ---
> libavformat/movenc.c | 53
> +++++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 38 insertions(+), 15 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 689291d..1f29716 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1698,9 +1698,28 @@ static int mov_write_edts_tag(AVIOContext *pb,
> MOVMuxContext *mov,
> track->timescale, AV_ROUND_UP);
> int version = duration < INT32_MAX ? 0 : 1;
> int entry_size, entry_count, size;
> - int64_t delay, start_ct = track->start_cts;
> - delay = av_rescale_rnd(track->start_dts + start_ct, MOV_TIMESCALE,
> + int64_t delay;
> + int64_t mediatime;
> + int64_t skip = 0;
> +
> + delay = av_rescale_rnd(track->start_dts + track->start_cts,
> MOV_TIMESCALE,
> track->timescale, AV_ROUND_DOWN);
> +
> + if (track->par->codec_type == AVMEDIA_TYPE_AUDIO &&
> + track->par->initial_padding > 0) {
> + /* Adjust delay so that initial_padding gets recorded in the
> + * MediaTime of an edit list entry even in the case that
> + * delay is positive. I.e. we don't want initial_padding to be
> + * absorbed and hidden in the delay. MediaTime must contain
> + * initial_padding in order to know where the actual media
> + * timeline begins. A player should drop samples until MediaTime
> + * is reached */
> + delay += av_rescale_rnd(track->par->initial_padding, MOV_TIMESCALE,
> + track->par->sample_rate, AV_ROUND_DOWN);
> + skip = av_rescale_rnd(track->par->initial_padding,
> + track->timescale,
> + track->par->sample_rate, AV_ROUND_DOWN);
> + }
> version |= delay < INT32_MAX ? 0 : 1;
>
> entry_size = (version == 1) ? 20 : 12;
> @@ -1731,33 +1750,37 @@ static int mov_write_edts_tag(AVIOContext *pb,
> MOVMuxContext *mov,
> }
> avio_wb32(pb, 0x00010000);
> } else {
> - /* 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 a small positive integer
> - * rounded to 0 when represented in MOV_TIMESCALE units. */
> - start_ct = -FFMIN(track->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
> - * dts<0 pts=0. */
> - duration += delay;
> + /* Avoid accidentally ending up with mediatime = -1 which has got a
> + * special meaning. skip and -track->start_dts are guaranteed to be
> + * positive here, so it is not possible mediatime to be -1 */
> + skip = FFMAX(skip, -track->start_dts);I was doing some additional testing (or rather I recruited someone to help me test ;) and found an error in my math. The above calculation should be skip = FFMAX(skip, -track->start_dts - track->start_cts); Sending an update to fix this. -- John GnuPG fingerprint: D0EC B3DB C372 D1F1 0B01 83F0 49F1 D7B2 60D4 D0F7
signature.asc
Description: OpenPGP digital signature
_______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
