From: Zhao Zhili <quinkblack@foxmail.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Zhao Zhili <quinkblack@foxmail.com>
Subject: [FFmpeg-devel] [PATCH v3 2/4] avformat/movenc: add missing timestamp check when peek from interleave queues
Date: Fri, 31 Dec 2021 19:36:08 +0800
Message-ID: <tencent_20A6D1A7E4EABB13321C520B8C662F90AA06@qq.com> (raw)
In-Reply-To: <20211231113610.85358-1-quinkblack@foxmail.com>
---
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".
next parent reply other threads:[~2021-12-31 11:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20211231113610.85358-1-quinkblack@foxmail.com>
2021-12-31 11:36 ` Zhao Zhili [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tencent_20A6D1A7E4EABB13321C520B8C662F90AA06@qq.com \
--to=quinkblack@foxmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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