[vlc-commits] mux: mp4: fix early data output
Francois Cartegnie
git at videolan.org
Tue Jan 30 11:32:44 CET 2018
vlc/vlc-3.0 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jan 29 16:08:23 2018 +0100| [4af4ce49ec566fa686ef040e774b6342fedb4fa8] | committer: Francois Cartegnie
mux: mp4: fix early data output
was sending data in open(), but record code
does probe muxers, so possibly breaks stream
(cherry picked from commit 54c3a5ec62e48d1b28cd979f3b04d7c06593fc59)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=4af4ce49ec566fa686ef040e774b6342fedb4fa8
---
modules/mux/mp4/mp4.c | 92 +++++++++++++++++++++++++++++----------------------
1 file changed, 53 insertions(+), 39 deletions(-)
diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
index 2daeceeba5..4c17a0e963 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;
};
@@ -180,34 +183,10 @@ static block_t *ConvertSUBT(block_t *);
static bool CreateCurrentEdit(mp4_stream_t *, mtime_t, bool);
static void DebugEdits(sout_mux_t *, const mp4_stream_t *);
-/*****************************************************************************
- * 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 */
@@ -223,28 +202,19 @@ static int Open(vlc_object_t *p_this)
}
if(!box)
- {
- free(p_sys);
return VLC_ENOMEM;
- }
p_sys->i_pos += box->b->i_buffer;
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 += box->b->i_buffer;
@@ -255,6 +225,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)
@@ -586,6 +592,14 @@ static int Mux(sout_mux_t *p_mux)
{
sout_mux_sys_t *p_sys = p_mux->p_sys;
+ if(!p_sys->b_header_sent)
+ {
+ int i_ret = WriteSlowStartHeader(p_mux);
+ if(i_ret != VLC_SUCCESS)
+ return i_ret;
+ p_sys->b_header_sent = true;
+ }
+
for (;;) {
int i_stream = sout_MuxGetStream(p_mux, 2, NULL);
if (i_stream < 0)
More information about the vlc-commits
mailing list