[vlc-commits] mux: mp4: add composition time (fix #711)
Francois Cartegnie
git at videolan.org
Mon Jun 2 23:39:13 CEST 2014
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jun 2 23:38:34 2014 +0200| [2fc9f597272e46be8b17e3101f4d19b51205d7da] | committer: Francois Cartegnie
mux: mp4: add composition time (fix #711)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2fc9f597272e46be8b17e3101f4d19b51205d7da
---
modules/mux/mp4.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/modules/mux/mp4.c b/modules/mux/mp4.c
index 207f71c..47a3e73 100644
--- a/modules/mux/mp4.c
+++ b/modules/mux/mp4.c
@@ -110,6 +110,7 @@ typedef struct
/* stats */
int64_t i_dts_start;
int64_t i_duration;
+ bool b_hasbframes;
/* for later stco fix-up (fast start files) */
uint64_t i_stco_pos;
@@ -413,6 +414,7 @@ static int AddStream(sout_mux_t *p_mux, sout_input_t *p_input)
calloc(p_stream->i_entry_max, sizeof(mp4_entry_t));
p_stream->i_dts_start = 0;
p_stream->i_duration = 0;
+ p_stream->b_hasbframes = false;
p_input->p_sys = p_stream;
@@ -502,9 +504,15 @@ static int Mux(sout_mux_t *p_mux)
mp4_entry_t *e = &p_stream->entry[p_stream->i_entry_count];
e->i_pos = p_sys->i_pos;
e->i_size = p_data->i_buffer;
- e->i_pts_dts = p_data->i_pts - p_data->i_dts;
- if (e->i_pts_dts < 0)
- e->i_pts_dts = 0;
+
+ if ( p_data->i_dts > VLC_TS_INVALID && p_data->i_pts > p_data->i_dts )
+ {
+ e->i_pts_dts = p_data->i_pts - p_data->i_dts;
+ if ( !p_stream->b_hasbframes )
+ p_stream->b_hasbframes = true;
+ }
+ else e->i_pts_dts = 0;
+
e->i_length = p_data->i_length;
e->i_flags = p_data->i_flags;
@@ -1408,7 +1416,26 @@ static bo_t *GetStblBox(sout_mux_t *p_mux, mp4_stream_t *p_stream)
}
bo_fix_32be(stts, 12, i_index);
- /* FIXME add ctts ?? FIXME */
+ /* composition time handling */
+ bo_t *ctts = NULL;
+ if ( p_stream->b_hasbframes && (ctts = box_full_new("ctts", 0, 0)) )
+ {
+ bo_add_32be(ctts, 0);
+ i_index = 0;
+ for (unsigned i = 0; i < p_stream->i_entry_count; i_index++)
+ {
+ int i_first = i;
+ mtime_t i_offset = p_stream->entry[i].i_pts_dts;
+
+ for (; i < p_stream->i_entry_count; ++i)
+ if (i == p_stream->i_entry_count || p_stream->entry[i].i_pts_dts != i_offset)
+ break;
+
+ bo_add_32be(ctts, i - i_first); // sample-count
+ bo_add_32be(ctts, i_offset * i_timescale / CLOCK_FREQ ); // sample-offset
+ }
+ bo_fix_32be(ctts, 12, i_index);
+ }
bo_t *stsz = box_full_new("stsz", 0, 0);
int i_size = 0;
@@ -1453,6 +1480,8 @@ static bo_t *GetStblBox(sout_mux_t *p_mux, mp4_stream_t *p_stream)
box_gather(stbl, stts);
if (stss)
box_gather(stbl, stss);
+ if (ctts)
+ box_gather(stbl, ctts);
box_gather(stbl, stsc);
box_gather(stbl, stsz);
p_stream->i_stco_pos = stbl->len + 16;
More information about the vlc-commits
mailing list