[vlc-commits] mux: mp4: fix early data output

Francois Cartegnie git at videolan.org
Tue Jan 30 10:48:43 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jan 29 16:08:23 2018 +0100| [54c3a5ec62e48d1b28cd979f3b04d7c06593fc59] | committer: Francois Cartegnie

mux: mp4: fix early data output

was sending data in open(), but record code
does probe muxers, so possibly breaks stream

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=54c3a5ec62e48d1b28cd979f3b04d7c06593fc59
---

 modules/mux/mp4/mp4.c | 93 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 54 insertions(+), 39 deletions(-)

diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
index c0e5d66eec..71c71b3163 100644
--- a/modules/mux/mp4/mp4.c
+++ b/modules/mux/mp4/mp4.c
@@ -158,6 +158,9 @@ struct sout_mux_sys_t
     bool b_64_ext;
     bool b_fast_start;
 
+    /* global */
+    bool     b_header_sent;
+
     uint64_t i_mdat_pos;
     uint64_t i_pos;
     mtime_t  i_read_duration;
@@ -166,9 +169,9 @@ struct sout_mux_sys_t
     unsigned int   i_nb_streams;
     mp4_stream_t **pp_streams;
 
+
     /* mp4frag */
     bool           b_fragmented;
-    bool           b_header_sent;
     mtime_t        i_written_duration;
     uint32_t       i_mfhd_sequence;
 };
@@ -181,34 +184,10 @@ static bool CreateCurrentEdit(mp4_stream_t *, mtime_t, bool);
 static void DebugEdits(sout_mux_t *, const mp4_stream_t *);
 static int MuxStream(sout_mux_t *p_mux, sout_input_t *p_input, mp4_stream_t *p_stream);
 
-/*****************************************************************************
- * Open:
- *****************************************************************************/
-static int Open(vlc_object_t *p_this)
+static int WriteSlowStartHeader(sout_mux_t *p_mux)
 {
-    sout_mux_t      *p_mux = (sout_mux_t*)p_this;
-    sout_mux_sys_t  *p_sys;
-    bo_t            *box;
-
-    msg_Dbg(p_mux, "Mp4 muxer opened");
-    config_ChainParse(p_mux, SOUT_CFG_PREFIX, ppsz_sout_options, p_mux->p_cfg);
-
-    p_mux->pf_control   = Control;
-    p_mux->pf_addstream = AddStream;
-    p_mux->pf_delstream = DelStream;
-    p_mux->pf_mux       = Mux;
-    p_mux->p_sys        = p_sys = malloc(sizeof(sout_mux_sys_t));
-    if (!p_sys)
-        return VLC_ENOMEM;
-    p_sys->i_pos        = 0;
-    p_sys->i_nb_streams = 0;
-    p_sys->pp_streams   = NULL;
-    p_sys->i_mdat_pos   = 0;
-    p_sys->b_mov        = p_mux->psz_mux && !strcmp(p_mux->psz_mux, "mov");
-    p_sys->b_3gp        = p_mux->psz_mux && !strcmp(p_mux->psz_mux, "3gp");
-    p_sys->i_read_duration   = 0;
-    p_sys->i_start_dts = VLC_TS_INVALID;
-    p_sys->b_fragmented = false;
+    sout_mux_sys_t *p_sys = p_mux->p_sys;
+    bo_t *box;
 
     if (!p_sys->b_mov) {
         /* Now add ftyp header */
@@ -224,28 +203,19 @@ static int Open(vlc_object_t *p_this)
         }
 
         if(!box)
-        {
-            free(p_sys);
             return VLC_ENOMEM;
-        }
 
         p_sys->i_pos += bo_size(box);
         p_sys->i_mdat_pos = p_sys->i_pos;
         box_send(p_mux, box);
     }
 
-    /* FIXME FIXME
-     * Quicktime actually doesn't like the 64 bits extensions !!! */
-    p_sys->b_64_ext = false;
-
     /* Now add mdat header */
     box = box_new("mdat");
     if(!box)
-    {
-        free(p_sys);
         return VLC_ENOMEM;
-    }
-    bo_add_64be  (box, 0); // enough to store an extended size
+
+    bo_add_64be(box, 0); // enough to store an extended size
 
     if(box->b)
         p_sys->i_pos += bo_size(box);
@@ -256,6 +226,42 @@ static int Open(vlc_object_t *p_this)
 }
 
 /*****************************************************************************
+ * Open:
+ *****************************************************************************/
+static int Open(vlc_object_t *p_this)
+{
+    sout_mux_t      *p_mux = (sout_mux_t*)p_this;
+    sout_mux_sys_t  *p_sys;
+
+    msg_Dbg(p_mux, "Mp4 muxer opened");
+    config_ChainParse(p_mux, SOUT_CFG_PREFIX, ppsz_sout_options, p_mux->p_cfg);
+
+    p_mux->pf_control   = Control;
+    p_mux->pf_addstream = AddStream;
+    p_mux->pf_delstream = DelStream;
+    p_mux->pf_mux       = Mux;
+    p_mux->p_sys        = p_sys = malloc(sizeof(sout_mux_sys_t));
+    if (!p_sys)
+        return VLC_ENOMEM;
+    p_sys->i_pos        = 0;
+    p_sys->i_nb_streams = 0;
+    p_sys->pp_streams   = NULL;
+    p_sys->i_mdat_pos   = 0;
+    p_sys->b_mov        = p_mux->psz_mux && !strcmp(p_mux->psz_mux, "mov");
+    p_sys->b_3gp        = p_mux->psz_mux && !strcmp(p_mux->psz_mux, "3gp");
+    p_sys->i_read_duration   = 0;
+    p_sys->i_start_dts = VLC_TS_INVALID;
+    p_sys->b_fragmented = false;
+    p_sys->b_header_sent = false;
+
+    /* FIXME FIXME
+     * Quicktime actually doesn't like the 64 bits extensions !!! */
+    p_sys->b_64_ext = false;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
  * Close:
  *****************************************************************************/
 static void Close(vlc_object_t *p_this)
@@ -776,8 +782,17 @@ static int MuxStream(sout_mux_t *p_mux, sout_input_t *p_input, mp4_stream_t *p_s
 
 static int Mux(sout_mux_t *p_mux)
 {
+    sout_mux_sys_t *p_sys = p_mux->p_sys;
     int i_ret = VLC_SUCCESS;
 
+    if(!p_sys->b_header_sent)
+    {
+        i_ret = WriteSlowStartHeader(p_mux);
+        if(i_ret != VLC_SUCCESS)
+            return i_ret;
+        p_sys->b_header_sent = true;
+    }
+
     do
     {
         int i_stream = sout_MuxGetStream(p_mux, 2, NULL);



More information about the vlc-commits mailing list