summaryrefslogtreecommitdiff
path: root/libavformat/segment.c
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2014-07-17 20:37:55 +0200
committerStefano Sabatini <stefasab@gmail.com>2014-07-22 13:53:31 +0200
commit44071b0d252f7bb0d42fa8da1d486b56c4ba3acd (patch)
treecf79c643990f9a63f40c4ec0252743c4be14dc6e /libavformat/segment.c
parent713157484a101d0fba92420c9d62d711f2f0012b (diff)
downloadffmpeg-44071b0d252f7bb0d42fa8da1d486b56c4ba3acd.tar.gz
lavf/segment: sanitize segment end time in case last packet do not have a defined duration
In particular, avoids to set segments with duration set to 0 (e.g. segment with a single reference frame for which duration is undefined).
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r--libavformat/segment.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c
index 4a516dac3d..135def226b 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -48,6 +48,7 @@ typedef struct SegmentListEntry {
int64_t offset_pts;
char *filename;
struct SegmentListEntry *next;
+ int64_t last_duration;
} SegmentListEntry;
typedef enum {
@@ -719,6 +720,10 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
(pkt->pts != AV_NOPTS_VALUE &&
av_compare_ts(pkt->pts, st->time_base,
end_pts-seg->time_delta, AV_TIME_BASE_Q) >= 0))) {
+ /* sanitize end time in case last packet didn't have a defined duration */
+ if (seg->cur_entry.last_duration == 0)
+ seg->cur_entry.end_time = (double)pkt->pts * av_q2d(st->time_base);
+
if ((ret = segment_end(s, seg->individual_header_trailer, 0)) < 0)
goto fail;
@@ -734,6 +739,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
} else if (pkt->pts != AV_NOPTS_VALUE && pkt->stream_index == seg->reference_stream_index) {
seg->cur_entry.end_time =
FFMAX(seg->cur_entry.end_time, (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base));
+ seg->cur_entry.last_duration = pkt->duration;
}
if (seg->segment_frame_count == 0) {