[FFmpeg-devel] [PATCH v3 1/4] avformat/movenc: fix assert failure in get_cluster_duration()
Zhao Zhili
quinkblack at foxmail.com
Fri Dec 31 13:36:07 EET 2021
When editlist is disabled, the workaournd method of shift dts to
zero and increase the first sample duration doesn't work if the
timestamp is larger than mp4 spec restriction (e.g., sample_delta
in stts entry). Further more, it triggers get_cluster_duration()
assert failure. This patch will drop large offsets between
multiple tracks.
---
libavformat/movenc.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 0f912dd012..f5bb785b01 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5917,7 +5917,18 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
* to signal the difference in starting time without an edit list.
* Thus move the timestamp for this first sample to 0, increasing
* its duration instead. */
- trk->cluster[trk->entry].dts = trk->start_dts = 0;
+ if (pkt->dts + pkt->duration <= INT32_MAX) {
+ trk->cluster[trk->entry].dts = trk->start_dts = 0;
+ } else {
+ /* Impossible to write a sample duration >= UINT32_MAX.
+ * Use INT32_MAX as a tight restriction.
+ */
+ trk->start_dts = pkt->dts;
+ av_log(s, AV_LOG_WARNING,
+ "Track %d starts with a nonzero dts %" PRId64
+ " which will be shifted to zero\n",
+ pkt->stream_index, pkt->dts);
+ }
}
if (trk->start_dts == AV_NOPTS_VALUE) {
trk->start_dts = pkt->dts;
--
2.31.1
More information about the ffmpeg-devel
mailing list