Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH v3 2/4] avformat/movenc: add missing timestamp check when peek from interleave queues
       [not found] <20211231113610.85358-1-quinkblack@foxmail.com>
@ 2021-12-31 11:36 ` Zhao Zhili
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 3/4] avformat/movenc: check track start_dts before use it Zhao Zhili
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 4/4] avformat/tests/movenc: test dealing with abnormal timestamp Zhao Zhili
  2 siblings, 0 replies; 3+ messages in thread
From: Zhao Zhili @ 2021-12-31 11:36 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

---
 libavformat/movenc.c | 80 +++++++++++++++++++++++++-------------------
 1 file changed, 45 insertions(+), 35 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f5bb785b01..9b3bd99e97 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5403,6 +5403,45 @@ static int mov_write_squashed_packets(AVFormatContext *s)
     return 0;
 }
 
+static int check_pkt_time(AVFormatContext *s, int stream_index,
+                          int64_t *pkt_pts, int64_t *pkt_dts,
+                          int64_t *pkt_duration) {
+    MOVMuxContext *mov = s->priv_data;
+    MOVTrack *trk = &mov->tracks[stream_index];
+    int64_t ref;
+    uint64_t duration;
+
+    if (trk->entry) {
+        ref = trk->cluster[trk->entry - 1].dts;
+    } else if (   trk->start_dts != AV_NOPTS_VALUE
+               && !trk->frag_discont) {
+        ref = trk->start_dts + trk->track_duration;
+    } else
+        ref = *pkt_dts; // Skip tests for the first packet
+
+    if (trk->dts_shift != AV_NOPTS_VALUE) {
+        /* With negative CTS offsets we have set an offset to the DTS,
+         * reverse this for the check. */
+        ref -= trk->dts_shift;
+    }
+
+    duration = *pkt_dts - ref;
+    if (*pkt_dts < ref || duration >= INT_MAX) {
+        av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n",
+               duration, *pkt_dts
+        );
+
+        *pkt_dts = ref + 1;
+        *pkt_pts = AV_NOPTS_VALUE;
+    }
+
+    if (*pkt_duration < 0 || *pkt_duration > INT_MAX) {
+        av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" is invalid\n", *pkt_duration);
+        return AVERROR(EINVAL);
+    }
+    return 0;
+}
+
 static int mov_flush_fragment(AVFormatContext *s, int force)
 {
     MOVMuxContext *mov = s->priv_data;
@@ -5429,12 +5468,15 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
         if (!track->end_reliable) {
             const AVPacket *pkt = ff_interleaved_peek(s, i);
             if (pkt) {
-                int64_t offset, dts, pts;
+                int64_t offset, dts, pts, duration;
                 ff_get_muxer_ts_offset(s, i, &offset);
                 pts = pkt->pts + offset;
                 dts = pkt->dts + offset;
+                duration = pkt->duration;
                 if (track->dts_shift != AV_NOPTS_VALUE)
                     dts += track->dts_shift;
+                if (check_pkt_time(s, pkt->stream_index, &pts, &dts, &duration))
+                    continue;
                 track->track_duration = dts - track->start_dts;
                 if (pts != AV_NOPTS_VALUE)
                     track->end_pts = pts;
@@ -5627,40 +5669,8 @@ static int mov_auto_flush_fragment(AVFormatContext *s, int force)
 
 static int check_pkt(AVFormatContext *s, AVPacket *pkt)
 {
-    MOVMuxContext *mov = s->priv_data;
-    MOVTrack *trk = &mov->tracks[pkt->stream_index];
-    int64_t ref;
-    uint64_t duration;
-
-    if (trk->entry) {
-        ref = trk->cluster[trk->entry - 1].dts;
-    } else if (   trk->start_dts != AV_NOPTS_VALUE
-               && !trk->frag_discont) {
-        ref = trk->start_dts + trk->track_duration;
-    } else
-        ref = pkt->dts; // Skip tests for the first packet
-
-    if (trk->dts_shift != AV_NOPTS_VALUE) {
-        /* With negative CTS offsets we have set an offset to the DTS,
-         * reverse this for the check. */
-        ref -= trk->dts_shift;
-    }
-
-    duration = pkt->dts - ref;
-    if (pkt->dts < ref || duration >= INT_MAX) {
-        av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n",
-            duration, pkt->dts
-        );
-
-        pkt->dts = ref + 1;
-        pkt->pts = AV_NOPTS_VALUE;
-    }
-
-    if (pkt->duration < 0 || pkt->duration > INT_MAX) {
-        av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" is invalid\n", pkt->duration);
-        return AVERROR(EINVAL);
-    }
-    return 0;
+    return check_pkt_time(s, pkt->stream_index, &pkt->pts, &pkt->dts,
+                          &pkt->duration);
 }
 
 int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
-- 
2.31.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [FFmpeg-devel] [PATCH v3 3/4] avformat/movenc: check track start_dts before use it
       [not found] <20211231113610.85358-1-quinkblack@foxmail.com>
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 2/4] avformat/movenc: add missing timestamp check when peek from interleave queues Zhao Zhili
@ 2021-12-31 11:36 ` Zhao Zhili
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 4/4] avformat/tests/movenc: test dealing with abnormal timestamp Zhao Zhili
  2 siblings, 0 replies; 3+ messages in thread
From: Zhao Zhili @ 2021-12-31 11:36 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

---
 libavformat/movenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 9b3bd99e97..faae684fdb 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -5465,7 +5465,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
     // tracks may need to be filled in.
     for (i = 0; i < s->nb_streams; i++) {
         MOVTrack *track = &mov->tracks[i];
-        if (!track->end_reliable) {
+        if (!track->end_reliable && track->start_dts != AV_NOPTS_VALUE) {
             const AVPacket *pkt = ff_interleaved_peek(s, i);
             if (pkt) {
                 int64_t offset, dts, pts, duration;
-- 
2.31.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [FFmpeg-devel] [PATCH v3 4/4] avformat/tests/movenc: test dealing with abnormal timestamp
       [not found] <20211231113610.85358-1-quinkblack@foxmail.com>
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 2/4] avformat/movenc: add missing timestamp check when peek from interleave queues Zhao Zhili
  2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 3/4] avformat/movenc: check track start_dts before use it Zhao Zhili
@ 2021-12-31 11:36 ` Zhao Zhili
  2 siblings, 0 replies; 3+ messages in thread
From: Zhao Zhili @ 2021-12-31 11:36 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

---
 libavformat/tests/movenc.c | 30 +++++++++++++++++++++++++++++-
 tests/ref/fate/movenc      | 14 ++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/libavformat/tests/movenc.c b/libavformat/tests/movenc.c
index 2af72f11c7..79de20ee75 100644
--- a/libavformat/tests/movenc.c
+++ b/libavformat/tests/movenc.c
@@ -248,11 +248,14 @@ static void init(int bf, int audio_preroll)
 static void mux_frames(int n, int c)
 {
     int end_frames = frames + n;
+    int has_audio = 0;
     while (1) {
         uint8_t pktdata[8] = { 0 };
         av_packet_unref(pkt);
 
-        if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0) {
+        if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0 ||
+            (frames == end_frames && !has_audio)) {
+            has_audio = 1;
             pkt->dts = pkt->pts = audio_dts;
             pkt->stream_index = 1;
             pkt->duration = audio_duration;
@@ -787,6 +790,31 @@ int main(int argc, char **argv)
     finish();
     close_out();
 
+    // Abnormal difference of timestamp between two streams.
+    do_interleave = 1;
+    init_out("streams-timestamp-offset");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    av_dict_set(&opts, "frag_duration", "650000", 0);
+    init_fps(0, 0, 30);
+    audio_dts = INT_MAX - audio_duration / 2;
+    mux_gops(1);
+    finish();
+    close_out();
+    do_interleave = 0;
+
+    // Abnormal timestamp jump.
+    do_interleave = 1;
+    init_out("streams-timestamp-jump");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    av_dict_set(&opts, "frag_duration", "650000", 0);
+    init_fps(0, 0, 30);
+    mux_gops(1);
+    audio_dts = (int64_t)(INT_MAX) * 3 / 2;
+    mux_gops(1);
+    finish();
+    close_out();
+    do_interleave = 0;
+
     av_free(md5);
     av_packet_free(&pkt);
 
diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc
index 81ea75f372..a5614f49a7 100644
--- a/tests/ref/fate/movenc
+++ b/tests/ref/fate/movenc
@@ -151,3 +151,17 @@ write_data len 900, time 0, type sync atom moof
 write_data len 908, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
 3be575022e446855bca1e45b7942cc0c 3115 empty-moov-neg-cts
+write_data len 36, time nopts, type header atom ftyp
+write_data len 1123, time nopts, type header atom -
+write_data len 280, time 0, type sync atom moof
+write_data len 288, time 666667, type boundary atom moof
+write_data len 129, time nopts, type trailer atom -
+60d2f9877f29bd154b0047dfbca8e36a 1856 streams-timestamp-offset
+write_data len 36, time nopts, type header atom ftyp
+write_data len 1123, time nopts, type header atom -
+write_data len 588, time 0, type sync atom moof
+write_data len 472, time 666667, type boundary atom moof
+write_data len 280, time 1000000, type sync atom moof
+write_data len 288, time 1666667, type boundary atom moof
+write_data len 205, time nopts, type trailer atom -
+15951eb265243ad827446117f3a24099 2992 streams-timestamp-jump
-- 
2.31.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-12-31 11:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20211231113610.85358-1-quinkblack@foxmail.com>
2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 2/4] avformat/movenc: add missing timestamp check when peek from interleave queues Zhao Zhili
2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 3/4] avformat/movenc: check track start_dts before use it Zhao Zhili
2021-12-31 11:36 ` [FFmpeg-devel] [PATCH v3 4/4] avformat/tests/movenc: test dealing with abnormal timestamp Zhao Zhili

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git