Commit e30acc03 authored by François Cartegnie's avatar François Cartegnie 🤞

demux: libmp4: rework tref reading

parent af5ddf9b
......@@ -3741,37 +3741,62 @@ static int MP4_ReadBox_HMMT( stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT( 1 );
}
static void MP4_FreeBox_tref_generic( MP4_Box_t *p_box )
static void MP4_FreeBox_TrackReference( MP4_Box_t *p_box )
{
free( p_box->data.p_tref_generic->i_track_ID );
free( p_box->data.p_track_reference->i_track_ID );
}
static int MP4_ReadBox_tref_generic( stream_t *p_stream, MP4_Box_t *p_box )
static int MP4_ReadBox_TrackReference( stream_t *p_stream, MP4_Box_t *p_box )
{
uint32_t count;
MP4_READBOX_ENTER( MP4_Box_data_tref_generic_t, MP4_FreeBox_tref_generic );
MP4_READBOX_ENTER( MP4_Box_data_trak_reference_t, MP4_FreeBox_TrackReference );
p_box->data.p_tref_generic->i_track_ID = NULL;
p_box->data.p_track_reference->i_track_ID = NULL;
count = i_read / sizeof(uint32_t);
p_box->data.p_tref_generic->i_entry_count = count;
p_box->data.p_tref_generic->i_track_ID = vlc_alloc( count,
p_box->data.p_track_reference->i_entry_count = count;
p_box->data.p_track_reference->i_track_ID = vlc_alloc( count,
sizeof(uint32_t) );
if( p_box->data.p_tref_generic->i_track_ID == NULL )
if( p_box->data.p_track_reference->i_track_ID == NULL )
MP4_READBOX_EXIT( 0 );
for( unsigned i = 0; i < count; i++ )
{
MP4_GET4BYTES( p_box->data.p_tref_generic->i_track_ID[i] );
MP4_GET4BYTES( p_box->data.p_track_reference->i_track_ID[i] );
}
#ifdef MP4_VERBOSE
msg_Dbg( p_stream, "read box: \"chap\" %d references",
p_box->data.p_tref_generic->i_entry_count );
p_box->data.p_track_reference->i_entry_count );
#endif
MP4_READBOX_EXIT( 1 );
}
static int MP4_ReadBox_tref( stream_t *p_stream, MP4_Box_t *p_box )
{
/* skip header */
ssize_t i_header = mp4_box_headersize( p_box );
if( vlc_stream_Read( p_stream, NULL, i_header ) != i_header )
return 0;
/* read each reference atom with forced handler */
uint64_t i_remain = p_box->i_size - 8;
while ( i_remain > 8 )
{
MP4_Box_t *p_childbox = MP4_ReadBoxUsing( p_stream, p_box,
MP4_ReadBox_TrackReference );
if( !p_childbox || i_remain < p_childbox->i_size )
{
MP4_BoxFree( p_childbox );
break;
}
MP4_BoxAddChild( p_box, p_childbox );
i_remain -= p_childbox->i_size;
}
return MP4_Seek( p_stream, p_box->i_pos + p_box->i_size ) ? 0 : 1;
}
static void MP4_FreeBox_keys( MP4_Box_t *p_box )
{
for( uint32_t i=0; i<p_box->data.p_keys->i_entry_count; i++ )
......@@ -4760,7 +4785,7 @@ static const struct
{ ATOM_hnti, MP4_ReadBoxContainer, ATOM_udta },
{ ATOM_rmra, MP4_ReadBoxContainer, ATOM_moov },
{ ATOM_rmda, MP4_ReadBoxContainer, ATOM_rmra },
{ ATOM_tref, MP4_ReadBoxContainer, ATOM_trak },
{ ATOM_tref, MP4_ReadBox_tref, ATOM_trak },
{ ATOM_gmhd, MP4_ReadBoxContainer, ATOM_minf },
{ ATOM_wave, MP4_ReadBoxContainer, ATOM_stsd },
{ ATOM_wave, MP4_ReadBoxContainer, ATOM_mp4a }, /* some quicktime mp4a/wave/mp4a.. */
......@@ -4974,16 +4999,8 @@ static const struct
{ ATOM_mp4s, MP4_ReadBox_sample_mp4s, ATOM_stsd },
/* XXX there is 2 box where we could find this entry stbl and tref*/
{ ATOM_hint, MP4_ReadBox_default, ATOM_tref },
{ ATOM_hint, MP4_ReadBox_default, ATOM_stbl },
/* found in tref box */
{ ATOM_dpnd, MP4_ReadBox_default, ATOM_tref },
{ ATOM_ipir, MP4_ReadBox_default, ATOM_tref },
{ ATOM_mpod, MP4_ReadBox_default, ATOM_tref },
{ ATOM_chap, MP4_ReadBox_tref_generic, ATOM_tref },
/* found in hnti */
{ ATOM_rtp, MP4_ReadBox_rtp, ATOM_hnti },
{ ATOM_sdp, MP4_ReadBox_sdp, ATOM_hnti },
......
......@@ -156,10 +156,6 @@ typedef int64_t stime_t;
#define ATOM_hdv2 VLC_FOURCC( 'h', 'd', 'v', '2' )
#define ATOM_rrtp VLC_FOURCC( 'r', 'r', 't', 'p' )
#define ATOM_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' )
#define ATOM_cdsc VLC_FOURCC( 'c', 'd', 's', 'c' )
#define ATOM_ipir VLC_FOURCC( 'i', 'p', 'i', 'r' )
#define ATOM_mpod VLC_FOURCC( 'm', 'p', 'o', 'd' )
#define ATOM_hnti VLC_FOURCC( 'h', 'n', 't', 'i' )
#define ATOM_rtp VLC_FOURCC( 'r', 't', 'p', ' ' )
#define ATOM_btrt VLC_FOURCC( 'b', 't', 'r', 't' )
......@@ -415,7 +411,6 @@ typedef int64_t stime_t;
#define ATOM_0x40PRM VLC_FOURCC( '@', 'P', 'R', 'M' )
#define ATOM_0x40PRQ VLC_FOURCC( '@', 'P', 'R', 'Q' )
#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
#define ATOM_MCPS VLC_FOURCC( 'M', 'C', 'P', 'S' )
#define ATOM_SDLN VLC_FOURCC( 'S', 'D', 'L', 'N' )
#define ATOM_vndr VLC_FOURCC( 'v', 'n', 'd', 'r' )
......@@ -441,6 +436,14 @@ typedef int64_t stime_t;
#define SAMPLEGROUP_rap VLC_FOURCC('r', 'a', 'p', ' ')
/* tref reference type boxes */
#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
#define ATOM_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' )
#define ATOM_hint VLC_FOURCC( 'h', 'i', 'n', 't' )
#define ATOM_ipir VLC_FOURCC( 'i', 'p', 'i', 'r' )
#define ATOM_mpod VLC_FOURCC( 'm', 'p', 'o', 'd' )
#define ATOM_cdsc VLC_FOURCC( 'c', 'd', 's', 'c' )
/* HEIF Specific */
#define HANDLER_pict VLC_FOURCC('p', 'i', 'c', 't')
......@@ -1254,7 +1257,7 @@ typedef struct
uint32_t i_entry_count;
uint32_t *i_track_ID;
} MP4_Box_data_tref_generic_t;
} MP4_Box_data_trak_reference_t;
typedef struct
{
......@@ -1790,7 +1793,7 @@ typedef union MP4_Box_data_s
MP4_Box_data_pnot_t *p_pnot;
MP4_Box_data_chpl_t *p_chpl;
MP4_Box_data_HMMT_t *p_hmmt;
MP4_Box_data_tref_generic_t *p_tref_generic;
MP4_Box_data_trak_reference_t *p_track_reference;
MP4_Box_data_tfrf_t *p_tfrf;
MP4_Box_data_tfxd_t *p_tfxd;
......
......@@ -990,8 +990,8 @@ static int Open( vlc_object_t * p_this )
b_enabled_es = true;
MP4_Box_t *p_chap = MP4_BoxGet( p_trak, "tref/chap", i );
if( p_chap && p_chap->data.p_tref_generic &&
p_chap->data.p_tref_generic->i_entry_count > 0 && !p_sys->p_tref_chap )
if( p_chap && p_chap->data.p_track_reference &&
p_chap->data.p_track_reference->i_entry_count > 0 && !p_sys->p_tref_chap )
p_sys->p_tref_chap = p_chap;
}
......@@ -2384,7 +2384,7 @@ static void LoadChapter( demux_t *p_demux )
}
else if( p_sys->p_tref_chap )
{
MP4_Box_data_tref_generic_t *p_chap = p_sys->p_tref_chap->data.p_tref_generic;
MP4_Box_data_trak_reference_t *p_chap = p_sys->p_tref_chap->data.p_track_reference;
unsigned int i, j;
/* Load the first subtitle track like quicktime */
......@@ -3534,7 +3534,7 @@ static void MP4_TrackSetup( demux_t *p_demux, mp4_track_t *p_track,
/* Mark chapter only track */
if( p_sys->p_tref_chap )
{
MP4_Box_data_tref_generic_t *p_chap = p_sys->p_tref_chap->data.p_tref_generic;
MP4_Box_data_trak_reference_t *p_chap = p_sys->p_tref_chap->data.p_track_reference;
unsigned int i;
for( i = 0; i < p_chap->i_entry_count; i++ )
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment