]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mux.c
Merge commit '55aa03b9f8f11ebb7535424cc0e5635558590f49'
[ffmpeg] / libavformat / mux.c
index d93931518ab7ac7cf95141283cc0fcad3120a9da..98ec7a4cf2d600429550d037c0976399fa9f18b2 100644 (file)
@@ -551,14 +551,19 @@ int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
 
     if (chunked) {
         uint64_t max= av_rescale_q_rnd(s->max_chunk_duration, AV_TIME_BASE_Q, st->time_base, AV_ROUND_UP);
-        if (   st->interleaver_chunk_size     + pkt->size     <= s->max_chunk_size-1U
-            && st->interleaver_chunk_duration + pkt->duration <= max-1U) {
-            st->interleaver_chunk_size     += pkt->size;
-            st->interleaver_chunk_duration += pkt->duration;
-        } else {
-            st->interleaver_chunk_size     =
-            st->interleaver_chunk_duration = 0;
+        st->interleaver_chunk_size     += pkt->size;
+        st->interleaver_chunk_duration += pkt->duration;
+        if (   (s->max_chunk_size && st->interleaver_chunk_size > s->max_chunk_size)
+            || (max && st->interleaver_chunk_duration           > max)) {
+            st->interleaver_chunk_size      = 0;
             this_pktl->pkt.flags |= CHUNK_START;
+            if (max && st->interleaver_chunk_duration > max) {
+                int64_t syncoffset = (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)*max/2;
+                int64_t syncto = av_rescale(pkt->dts + syncoffset, 1, max)*max - syncoffset;
+
+                st->interleaver_chunk_duration += (pkt->dts - syncto)/8 - max;
+            } else
+                st->interleaver_chunk_duration = 0;
         }
     }
     if (*next_point) {