[vlc-commits] demux: mp4: add support for cslg

Francois Cartegnie git at videolan.org
Mon Jun 12 21:51:00 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jun 12 21:49:10 2017 +0200| [051b8a74bcc43a70463a3facc4c8e7cbd4b59ec8] | committer: Francois Cartegnie

demux: mp4: add support for cslg

refs big_buck_bunny_720p_h264.mov

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

 modules/demux/mp4/libmp4.c | 27 +++++++++++++++++++++++++++
 modules/demux/mp4/libmp4.h | 12 ++++++++++++
 modules/demux/mp4/mp4.c    | 13 +++++++++----
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c
index f67f965b6a..bd0feaedb3 100644
--- a/modules/demux/mp4/libmp4.c
+++ b/modules/demux/mp4/libmp4.c
@@ -1507,6 +1507,32 @@ static int MP4_ReadBox_ctts( stream_t *p_stream, MP4_Box_t *p_box )
     MP4_READBOX_EXIT( 1 );
 }
 
+static int MP4_ReadBox_cslg( stream_t *p_stream, MP4_Box_t *p_box )
+{
+    MP4_READBOX_ENTER( MP4_Box_data_cslg_t, NULL );
+
+    unsigned i_version, i_flags;
+    MP4_GET1BYTE( i_version );
+    MP4_GET3BYTES( i_flags );
+    VLC_UNUSED(i_flags);
+
+    if( i_version > 1 )
+        MP4_READBOX_EXIT( 0 );
+
+#define READ_CSLG(readbytes) {\
+    readbytes( p_box->data.p_cslg->ct_to_dts_shift );\
+    readbytes( p_box->data.p_cslg->i_least_delta );\
+    readbytes( p_box->data.p_cslg->i_max_delta );\
+    readbytes( p_box->data.p_cslg->i_composition_starttime );\
+    readbytes( p_box->data.p_cslg->i_composition_endtime ); }
+
+    if( i_version == 0 )
+        READ_CSLG(MP4_GET4BYTES)
+    else
+        READ_CSLG(MP4_GET8BYTES)
+
+    MP4_READBOX_EXIT( 1 );
+}
 
 static int MP4_ReadLengthDescriptor( uint8_t **pp_peek, int64_t  *i_read )
 {
@@ -4210,6 +4236,7 @@ static const struct
     { ATOM_dref,    MP4_ReadBox_LtdContainer, 0 },
     { ATOM_stts,    MP4_ReadBox_stts,         ATOM_stbl },
     { ATOM_ctts,    MP4_ReadBox_ctts,         ATOM_stbl },
+    { ATOM_cslg,    MP4_ReadBox_cslg,         ATOM_stbl },
     { ATOM_stsd,    MP4_ReadBox_LtdContainer, ATOM_stbl },
     { ATOM_stsz,    MP4_ReadBox_stsz,         ATOM_stbl },
     { ATOM_stsc,    MP4_ReadBox_stsc,         ATOM_stbl },
diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h
index 646ffb018a..c37c22aea2 100644
--- a/modules/demux/mp4/libmp4.h
+++ b/modules/demux/mp4/libmp4.h
@@ -87,6 +87,7 @@ typedef int64_t stime_t;
 #define ATOM_stbl VLC_FOURCC( 's', 't', 'b', 'l' )
 #define ATOM_stts VLC_FOURCC( 's', 't', 't', 's' )
 #define ATOM_ctts VLC_FOURCC( 'c', 't', 't', 's' )
+#define ATOM_cslg VLC_FOURCC( 'c', 's', 'l', 'g' )
 #define ATOM_stsd VLC_FOURCC( 's', 't', 's', 'd' )
 #define ATOM_stsz VLC_FOURCC( 's', 't', 's', 'z' )
 #define ATOM_stz2 VLC_FOURCC( 's', 't', 'z', '2' )
@@ -613,6 +614,16 @@ typedef struct MP4_Box_data_ctts_s
 
 } MP4_Box_data_ctts_t;
 
+typedef struct MP4_Box_data_cslg_s
+{
+    int64_t ct_to_dts_shift;
+    int64_t i_least_delta;
+    int64_t i_max_delta;
+    int64_t i_composition_starttime;
+    int64_t i_composition_endtime;
+
+} MP4_Box_data_cslg_t;
+
 // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-125526
 typedef struct MP4_Box_data_colr_s
 {
@@ -1630,6 +1641,7 @@ typedef union MP4_Box_data_s
     MP4_Box_data_lcont_t *p_lcont;
     MP4_Box_data_stts_t *p_stts;
     MP4_Box_data_ctts_t *p_ctts;
+    MP4_Box_data_cslg_t *p_cslg;
     MP4_Box_data_colr_t *p_colr;
 
     MP4_Box_data_sbgp_t *p_sbgp;
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index b2062feff4..2cc016f037 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -2628,6 +2628,11 @@ static int TrackCreateSamplesIndex( demux_t *p_demux,
 
         msg_Warn( p_demux, "CTTS table of %"PRIu32" entries", ctts->i_entry_count );
 
+        int64_t i_cts_shift = 0;
+        const MP4_Box_t *p_cslg = MP4_BoxGet( p_demux_track->p_stbl, "cslg" );
+        if( p_cslg && BOXDATA(p_cslg) )
+            i_cts_shift = BOXDATA(p_cslg)->ct_to_dts_shift;
+
         /* Create pts-dts table per chunk */
         uint32_t i_index = 0;
         uint32_t i_current_index_samples_left = 0;
@@ -2670,7 +2675,7 @@ static int TrackCreateSamplesIndex( demux_t *p_demux,
                     if ( i_current_index_samples_left > i_sample_count )
                     {
                         ck->p_sample_count_pts[i] = i_sample_count;
-                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index];
+                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index] + i_cts_shift;
                         i_current_index_samples_left -= i_sample_count;
                         i_sample_count = 0;
                         assert( i == ck->i_entries_pts - 1 );
@@ -2679,7 +2684,7 @@ static int TrackCreateSamplesIndex( demux_t *p_demux,
                     else
                     {
                         ck->p_sample_count_pts[i] = i_current_index_samples_left;
-                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index];
+                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index] + i_cts_shift;
                         i_sample_count -= i_current_index_samples_left;
                         i_current_index_samples_left = 0;
                         i_index++;
@@ -2690,7 +2695,7 @@ static int TrackCreateSamplesIndex( demux_t *p_demux,
                     if ( ctts->pi_sample_count[i_index] > i_sample_count )
                     {
                         ck->p_sample_count_pts[i] = i_sample_count;
-                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index];
+                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index] + i_cts_shift;
                         i_current_index_samples_left = ctts->pi_sample_count[i_index] - i_sample_count;
                         i_sample_count = 0;
                         assert( i == ck->i_entries_pts - 1 );
@@ -2699,7 +2704,7 @@ static int TrackCreateSamplesIndex( demux_t *p_demux,
                     else
                     {
                         ck->p_sample_count_pts[i] = ctts->pi_sample_count[i_index];
-                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index];
+                        ck->p_sample_offset_pts[i] = ctts->pi_sample_offset[i_index] + i_cts_shift;
                         i_sample_count -= ctts->pi_sample_count[i_index];
                         i_index++;
                     }



More information about the vlc-commits mailing list