]> granicus.if.org Git - handbrake/commitdiff
muxavformat: fix last subtitle persistence in mp4
authorJohn Stebbins <jstebbins.hb@gmail.com>
Mon, 9 May 2016 15:03:18 +0000 (08:03 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Tue, 17 May 2016 16:11:30 +0000 (10:11 -0600)
libav doesn't seems to honor the duration of the subtitle AVPacket.  It
is required to send an "empty" subtitle packet to terminate all
subtitles, including the last one.

libhb/muxavformat.c

index 7aa9b654a008ce129672fb27590fa929813f41be..ef72130b6ff3b12128a1323ae96a55f42cde50a9 100644 (file)
@@ -1051,7 +1051,29 @@ static int avformatMux(hb_mux_object_t *m, hb_mux_data_t *track, hb_buffer_t *bu
         buf = tmp;
     }
     if (buf == NULL)
+    {
+        if (job->mux == HB_MUX_AV_MP4 && track->type == MUX_TYPE_SUBTITLE)
+        {
+            // Write a final "empty" subtitle to terminate the last
+            // subtitle that was written
+            if (track->duration > 0)
+            {
+                AVPacket empty_pkt;
+                uint8_t empty[2] = {0,0};
+
+                av_init_packet(&empty_pkt);
+                empty_pkt.data = empty;
+                empty_pkt.size = 2;
+                empty_pkt.dts = track->duration;
+                empty_pkt.pts = track->duration;
+                empty_pkt.duration = 90;
+                empty_pkt.convergence_duration = empty_pkt.duration;
+                empty_pkt.stream_index = track->st->index;
+                av_interleaved_write_frame(m->oc, &empty_pkt);
+            }
+        }
         return 0;
+    }
 
     if (track->type == MUX_TYPE_VIDEO && (job->mux & HB_MUX_MASK_MKV) &&
         buf->s.renderOffset < 0)