[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