lavf/segment: sanitize segment end time in case last packet do not have a defined...
authorStefano Sabatini <stefasab@gmail.com>
Thu, 17 Jul 2014 18:37:55 +0000 (20:37 +0200)
committerStefano Sabatini <stefasab@gmail.com>
Tue, 22 Jul 2014 11:53:31 +0000 (13:53 +0200)
In particular, avoids to set segments with duration set to 0
(e.g. segment with a single reference frame for which duration is
undefined).

libavformat/segment.c

index 4a516da..135def2 100644 (file)
@@ -48,6 +48,7 @@ typedef struct SegmentListEntry {
     int64_t offset_pts;
     char *filename;
     struct SegmentListEntry *next;
     int64_t offset_pts;
     char *filename;
     struct SegmentListEntry *next;
+    int64_t last_duration;
 } SegmentListEntry;
 
 typedef enum {
 } 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))) {
          (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;
 
         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));
     } 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) {
     }
 
     if (seg->segment_frame_count == 0) {