}
#define MP4_READBOX_EXIT( i_code ) \
- free( p_buff ); \
- if( i_read < 0 ) \
+ do \
{ \
- msg_Warn( p_stream, "Not enough data" ); \
- } \
- return( i_code )
+ free( p_buff ); \
+ if( i_read < 0 ) \
+ msg_Warn( p_stream, "Not enough data" ); \
+ return( i_code ); \
+ } while (0)
/* Some assumptions:
int i_sec;
/* date begin at 1 jan 1904 */
- i_date += ((I64C(1904) * 365) + 17) * 24 * 60 * 60;
+ i_date += ((INT64_C(1904) * 365) + 17) * 24 * 60 * 60;
i_day = i_date / ( 60*60*24);
i_hour = ( i_date /( 60*60 ) ) % 60;
if( p_box->i_size )
{
if MP4_BOX_TYPE_ASCII()
- msg_Dbg( p_stream, "found Box: %4.4s size "I64Fd,
+ msg_Dbg( p_stream, "found Box: %4.4s size %"PRId64,
(char*)&p_box->i_type, p_box->i_size );
else
- msg_Dbg( p_stream, "found Box: c%3.3s size "I64Fd,
+ msg_Dbg( p_stream, "found Box: c%3.3s size %"PRId64,
(char*)&p_box->i_type+1, p_box->i_size );
}
#endif
sizeof(uint32_t));
if( tab == NULL )
- p_box->data.p_ftyp->i_compatible_brands_count = 0;
+ MP4_READBOX_EXIT( 0 );
for( i =0; i < p_box->data.p_ftyp->i_compatible_brands_count; i++ )
{
static int MP4_ReadBox_hdlr( stream_t *p_stream, MP4_Box_t *p_box )
{
int32_t i_reserved;
- int code = 0;
MP4_READBOX_ENTER( MP4_Box_data_hdlr_t );
{
uint8_t *psz = p_box->data.p_hdlr->psz_name = malloc( i_read + 1 );
if( psz == NULL )
- goto error;
+ MP4_READBOX_EXIT( 0 );
/* Yes, I love .mp4 :( */
if( p_box->data.p_hdlr->i_predefined == VLC_FOURCC( 'm', 'h', 'l', 'r' ) )
p_box->data.p_hdlr->psz_name );
#endif
- code = 1;
-
-error:
- MP4_READBOX_EXIT( code );
+ MP4_READBOX_EXIT( 1 );
}
static void MP4_FreeBox_hdlr( MP4_Box_t *p_box )
static int MP4_ReadBox_stts( stream_t *p_stream, MP4_Box_t *p_box )
{
- unsigned int i, code = 0;
+ unsigned int i;
MP4_READBOX_ENTER( MP4_Box_data_stts_t );
MP4_GETVERSIONFLAGS( p_box->data.p_stts );
|| p_box->data.p_stts->i_sample_delta == NULL )
{
MP4_FreeBox_stts( p_box );
- goto error;
+ MP4_READBOX_EXIT( 0 );
}
for( i = 0; (i < p_box->data.p_stts->i_entry_count )&&( i_read >=8 ); i++ )
p_box->data.p_stts->i_entry_count );
#endif
- code = 1;
-error:
- MP4_READBOX_EXIT( code );
+ MP4_READBOX_EXIT( 1 );
+}
+
+
+static void MP4_FreeBox_ctts( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_ctts->i_sample_count );
+ FREENULL( p_box->data.p_ctts->i_sample_offset );
}
static int MP4_ReadBox_ctts( stream_t *p_stream, MP4_Box_t *p_box )
calloc( p_box->data.p_ctts->i_entry_count, sizeof(uint32_t) );
p_box->data.p_ctts->i_sample_offset =
calloc( p_box->data.p_ctts->i_entry_count, sizeof(uint32_t) );
+ if( ( p_box->data.p_ctts->i_sample_count == NULL )
+ || ( p_box->data.p_ctts->i_sample_offset == NULL ) )
+ {
+ MP4_FreeBox_ctts( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
for( i = 0; (i < p_box->data.p_ctts->i_entry_count )&&( i_read >=8 ); i++ )
{
MP4_READBOX_EXIT( 1 );
}
-static void MP4_FreeBox_ctts( MP4_Box_t *p_box )
-{
- FREENULL( p_box->data.p_ctts->i_sample_count );
- FREENULL( p_box->data.p_ctts->i_sample_offset );
-}
static int MP4_ReadLengthDescriptor( uint8_t **pp_peek, int64_t *i_read )
{
return( i_len );
}
+
+static void MP4_FreeBox_esds( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_esds->es_descriptor.psz_URL );
+ if( p_box->data.p_esds->es_descriptor.p_decConfigDescr )
+ {
+ FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info );
+ FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr );
+ }
+}
+
static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box )
{
#define es_descriptor p_box->data.p_esds->es_descriptor
unsigned int i_len;
unsigned int i_flags;
unsigned int i_type;
+ unsigned int code = 0;
MP4_READBOX_ENTER( MP4_Box_data_esds_t );
es_descriptor.p_decConfigDescr =
malloc( sizeof( MP4_descriptor_decoder_config_t ));
+ if( es_descriptor.p_decConfigDescr == NULL )
+ {
+ free( es_descriptor.psz_URL );
+ goto error;
+ }
MP4_GET1BYTE( es_descriptor.p_decConfigDescr->i_objectTypeIndication );
MP4_GET1BYTE( i_flags );
es_descriptor.p_decConfigDescr->i_decoder_specific_info_len = i_len;
es_descriptor.p_decConfigDescr->p_decoder_specific_info = malloc( i_len );
- if( es_descriptor.p_decConfigDescr->p_decoder_specific_info )
- memcpy( es_descriptor.p_decConfigDescr->p_decoder_specific_info,
- p_peek, i_len );
+ if( es_descriptor.p_decConfigDescr->p_decoder_specific_info == NULL )
+ {
+ MP4_FreeBox_esds( p_box );
+ goto error;
+ }
+ memcpy( es_descriptor.p_decConfigDescr->p_decoder_specific_info,
+ p_peek, i_len );
+ code = 1;
- MP4_READBOX_EXIT( 1 );
+error:
+ MP4_READBOX_EXIT( code );
#undef es_descriptor
}
-static void MP4_FreeBox_esds( MP4_Box_t *p_box )
-{
- FREENULL( p_box->data.p_esds->es_descriptor.psz_URL );
- if( p_box->data.p_esds->es_descriptor.p_decConfigDescr )
- {
- FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info );
- }
- FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr );
-}
static int MP4_ReadBox_avcC( stream_t *p_stream, MP4_Box_t *p_box )
{
*/
if( i_read > 0 )
{
- p_box->data.p_sample_soun->i_qt_description = i_read;
p_box->data.p_sample_soun->p_qt_description = malloc( i_read );
+ if( p_box->data.p_sample_soun->p_qt_description == NULL )
+ MP4_READBOX_EXIT( 0 );
+ p_box->data.p_sample_soun->i_qt_description = i_read;
memcpy( p_box->data.p_sample_soun->p_qt_description, p_peek, i_read );
}
else
p_box->data.p_sample_soun->i_bytes_per_frame = 0;
p_box->data.p_sample_soun->i_bytes_per_sample = 0;
- msg_Dbg( p_stream, "read box: \"soun\" mp4 or qt1/2 (rest="I64Fd")",
+ msg_Dbg( p_stream, "read box: \"soun\" mp4 or qt1/2 (rest=%"PRId64")",
i_read );
stream_Seek( p_stream, p_box->i_pos +
MP4_BOX_HEADERSIZE( p_box ) + 28 );
free( p_box->data.p_sample_soun->p_qt_description );
p_box->data.p_sample_soun->p_qt_description = malloc( i_read );
+ if( p_box->data.p_sample_soun->p_qt_description == NULL )
+ MP4_READBOX_EXIT( 0 );
p_box->data.p_sample_soun->i_qt_description = i_read;
memcpy( p_box->data.p_sample_soun->p_qt_description, p_peek, i_read );
}
*/
if( i_read > 0 )
{
- p_box->data.p_sample_vide->i_qt_image_description = i_read;
p_box->data.p_sample_vide->p_qt_image_description = malloc( i_read );
+ if( p_box->data.p_sample_vide->p_qt_image_description == NULL )
+ MP4_READBOX_EXIT( 0 );
+ p_box->data.p_sample_vide->i_qt_image_description = i_read;
memcpy( p_box->data.p_sample_vide->p_qt_image_description,
p_peek, i_read );
}
p_box->data.p_stsz->i_entry_size =
calloc( p_box->data.p_stsz->i_sample_count, sizeof(uint32_t) );
+ if( p_box->data.p_stsz->i_entry_size == NULL )
+ MP4_READBOX_EXIT( 0 );
if( !p_box->data.p_stsz->i_sample_size )
{
FREENULL( p_box->data.p_stsz->i_entry_size );
}
+static void MP4_FreeBox_stsc( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_stsc->i_first_chunk );
+ FREENULL( p_box->data.p_stsc->i_samples_per_chunk );
+ FREENULL( p_box->data.p_stsc->i_sample_description_index );
+}
+
static int MP4_ReadBox_stsc( stream_t *p_stream, MP4_Box_t *p_box )
{
unsigned int i;
calloc( p_box->data.p_stsc->i_entry_count, sizeof(uint32_t) );
p_box->data.p_stsc->i_sample_description_index =
calloc( p_box->data.p_stsc->i_entry_count, sizeof(uint32_t) );
+ if( p_box->data.p_stsc->i_first_chunk == NULL
+ || p_box->data.p_stsc->i_samples_per_chunk == NULL
+ || p_box->data.p_stsc->i_sample_description_index == NULL )
+ {
+ MP4_FreeBox_stsc( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
for( i = 0; (i < p_box->data.p_stsc->i_entry_count )&&( i_read >= 12 );i++ )
{
MP4_READBOX_EXIT( 1 );
}
-static void MP4_FreeBox_stsc( MP4_Box_t *p_box )
-{
- FREENULL( p_box->data.p_stsc->i_first_chunk );
- FREENULL( p_box->data.p_stsc->i_samples_per_chunk );
- FREENULL( p_box->data.p_stsc->i_sample_description_index );
-}
-
static int MP4_ReadBox_stco_co64( stream_t *p_stream, MP4_Box_t *p_box )
{
unsigned int i;
p_box->data.p_co64->i_chunk_offset =
calloc( p_box->data.p_co64->i_entry_count, sizeof(uint64_t) );
+ if( p_box->data.p_co64->i_chunk_offset == NULL )
+ MP4_READBOX_EXIT( 0 );
for( i = 0; i < p_box->data.p_co64->i_entry_count; i++ )
{
p_box->data.p_stss->i_sample_number =
calloc( p_box->data.p_stss->i_entry_count, sizeof(uint32_t) );
+ if( p_box->data.p_stss->i_sample_number == NULL )
+ MP4_READBOX_EXIT( 0 );
for( i = 0; (i < p_box->data.p_stss->i_entry_count )&&( i_read >= 4 ); i++ )
{
FREENULL( p_box->data.p_stss->i_sample_number );
}
+static void MP4_FreeBox_stsh( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_stsh->i_shadowed_sample_number );
+ FREENULL( p_box->data.p_stsh->i_sync_sample_number );
+}
+
static int MP4_ReadBox_stsh( stream_t *p_stream, MP4_Box_t *p_box )
{
unsigned int i;
p_box->data.p_stsh->i_shadowed_sample_number =
calloc( p_box->data.p_stsh->i_entry_count, sizeof(uint32_t) );
-
p_box->data.p_stsh->i_sync_sample_number =
calloc( p_box->data.p_stsh->i_entry_count, sizeof(uint32_t) );
+ if( p_box->data.p_stsh->i_shadowed_sample_number == NULL
+ || p_box->data.p_stsh->i_sync_sample_number == NULL )
+ {
+ MP4_FreeBox_stsh( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
for( i = 0; (i < p_box->data.p_stss->i_entry_count )&&( i_read >= 8 ); i++ )
{
MP4_READBOX_EXIT( 1 );
}
-static void MP4_FreeBox_stsh( MP4_Box_t *p_box )
-{
- FREENULL( p_box->data.p_stsh->i_shadowed_sample_number );
- FREENULL( p_box->data.p_stsh->i_sync_sample_number );
-}
-
static int MP4_ReadBox_stdp( stream_t *p_stream, MP4_Box_t *p_box )
{
}
#ifdef MP4_VERBOSE
- msg_Dbg( p_stream, "read box: \"stdp\" entry-count "I64Fd,
+ msg_Dbg( p_stream, "read box: \"stdp\" entry-count %"PRId64,
i_read / 2 );
#endif
FREENULL( p_box->data.p_stdp->i_priority );
}
+static void MP4_FreeBox_padb( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_padb->i_reserved1 );
+ FREENULL( p_box->data.p_padb->i_pad2 );
+ FREENULL( p_box->data.p_padb->i_reserved2 );
+ FREENULL( p_box->data.p_padb->i_pad1 );
+}
+
static int MP4_ReadBox_padb( stream_t *p_stream, MP4_Box_t *p_box )
{
- int code = 0;
unsigned int i;
uint32_t count;
MP4_GETVERSIONFLAGS( p_box->data.p_padb );
-
MP4_GET4BYTES( p_box->data.p_padb->i_sample_count );
count = (p_box->data.p_padb->i_sample_count + 1) / 2;
p_box->data.p_padb->i_pad2 = calloc( count, sizeof(uint16_t) );
p_box->data.p_padb->i_reserved2 = calloc( count, sizeof(uint16_t) );
p_box->data.p_padb->i_pad1 = calloc( count, sizeof(uint16_t) );
+ if( p_box->data.p_padb->i_reserved1 == NULL
+ || p_box->data.p_padb->i_pad2 == NULL
+ || p_box->data.p_padb->i_reserved2 == NULL
+ || p_box->data.p_padb->i_pad1 == NULL )
+ {
+ MP4_FreeBox_padb( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
for( i = 0; i < i_read / 2 ; i++ )
{
if( i >= count )
- goto error;
+ {
+ MP4_FreeBox_padb( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 7 )&0x01;
p_box->data.p_padb->i_pad2[i] = ( (*p_peek) >> 4 )&0x07;
p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 3 )&0x01;
}
#ifdef MP4_VERBOSE
- msg_Dbg( p_stream, "read box: \"stdp\" entry-count "I64Fd,
+ msg_Dbg( p_stream, "read box: \"stdp\" entry-count %"PRId64,
i_read / 2 );
#endif
- code = 1;
-error:
- MP4_READBOX_EXIT( code );
+ MP4_READBOX_EXIT( 1 );
}
-static void MP4_FreeBox_padb( MP4_Box_t *p_box )
+static void MP4_FreeBox_elst( MP4_Box_t *p_box )
{
- FREENULL( p_box->data.p_padb->i_reserved1 );
- FREENULL( p_box->data.p_padb->i_pad2 );
- FREENULL( p_box->data.p_padb->i_reserved2 );
- FREENULL( p_box->data.p_padb->i_pad1 );
+ FREENULL( p_box->data.p_elst->i_segment_duration );
+ FREENULL( p_box->data.p_elst->i_media_time );
+ FREENULL( p_box->data.p_elst->i_media_rate_integer );
+ FREENULL( p_box->data.p_elst->i_media_rate_fraction );
}
static int MP4_ReadBox_elst( stream_t *p_stream, MP4_Box_t *p_box )
calloc( p_box->data.p_elst->i_entry_count, sizeof(uint64_t) );
p_box->data.p_elst->i_media_rate_integer =
calloc( p_box->data.p_elst->i_entry_count, sizeof(uint16_t) );
- p_box->data.p_elst->i_media_rate_fraction=
+ p_box->data.p_elst->i_media_rate_fraction =
calloc( p_box->data.p_elst->i_entry_count, sizeof(uint16_t) );
+ if( p_box->data.p_elst->i_segment_duration == NULL
+ || p_box->data.p_elst->i_media_time == NULL
+ || p_box->data.p_elst->i_media_rate_integer == NULL
+ || p_box->data.p_elst->i_media_rate_fraction == NULL )
+ {
+ MP4_FreeBox_elst( p_box );
+ MP4_READBOX_EXIT( 0 );
+ }
for( i = 0; i < p_box->data.p_elst->i_entry_count; i++ )
MP4_READBOX_EXIT( 1 );
}
-static void MP4_FreeBox_elst( MP4_Box_t *p_box )
-{
- FREENULL( p_box->data.p_elst->i_segment_duration );
- FREENULL( p_box->data.p_elst->i_media_time );
- FREENULL( p_box->data.p_elst->i_media_rate_integer );
- FREENULL( p_box->data.p_elst->i_media_rate_fraction );
-}
-
static int MP4_ReadBox_cprt( stream_t *p_stream, MP4_Box_t *p_box )
{
unsigned int i_language;
/* now create a memory stream */
p_stream_memory =
stream_MemoryNew( VLC_OBJECT(p_stream), p_cmvd->data.p_cmvd->p_data,
- p_cmvd->data.p_cmvd->i_uncompressed_size, VLC_TRUE );
+ p_cmvd->data.p_cmvd->i_uncompressed_size, true );
/* and read uncompressd moov */
p_box->data.p_cmov->p_moov = MP4_ReadBox( p_stream_memory, NULL );
{
uint32_t i;
p_box->data.p_rdrf->psz_ref = malloc( i_len );
+ if( p_box->data.p_rdrf->psz_ref == NULL )
+ MP4_READBOX_EXIT( 0 );
i_len--;
for( i = 0; i < i_len; i++ )
p_box->data.p_0xa9xxx->psz_text = NULL;
MP4_GET2BYTES( i16 );
- i_length = i16 + 1;
+ i_length = i16;
if( i_length > 0 )
{
if( i_length >= i_read ) i_length = i_read + 1;
p_box->data.p_0xa9xxx->psz_text = malloc( i_length );
+ if( p_box->data.p_0xa9xxx->psz_text == NULL )
+ MP4_READBOX_EXIT( 0 );
i_length--;
memcpy( p_box->data.p_0xa9xxx->psz_text,
// the rest is the text
i_data_len -= 12;
p_box->data.p_0xa9xxx->psz_text = malloc( i_data_len + 1 );
+ if( p_box->data.p_0xa9xxx->psz_text == NULL )
+ MP4_READBOX_EXIT( 0 );
memcpy( p_box->data.p_0xa9xxx->psz_text,
p_peek, i_data_len );
p_box->data.p_tref_generic->i_track_ID = NULL;
p_box->data.p_tref_generic->i_entry_count = i_read / sizeof(uint32_t);
if( p_box->data.p_tref_generic->i_entry_count > 0 )
- p_box->data.p_tref_generic->i_track_ID = malloc( p_box->data.p_tref_generic->i_entry_count * sizeof(uint32_t) );
+ p_box->data.p_tref_generic->i_track_ID = calloc( p_box->data.p_tref_generic->i_entry_count, sizeof(uint32_t) );
+ if( p_box->data.p_tref_generic->i_track_ID == NULL )
+ MP4_READBOX_EXIT( 0 );
for( i = 0; i < p_box->data.p_tref_generic->i_entry_count; i++ )
{
{ FOURCC_dvc, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
{ FOURCC_dvp, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
+ { FOURCC_dv5n, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
+ { FOURCC_dv5p, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
{ FOURCC_VP31, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
{ FOURCC_vp31, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
{ FOURCC_h264, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide },
MP4_Box_t *p_box = malloc( sizeof( MP4_Box_t ) );
unsigned int i_index;
+ if( p_box == NULL )
+ return NULL;
+
if( !MP4_ReadBoxCommon( p_stream, p_box ) )
{
msg_Warn( p_stream, "cannot read one box" );
int i_result;
p_root = malloc( sizeof( MP4_Box_t ) );
+ if( p_root == NULL )
+ return NULL;
+
p_root->i_pos = 0;
p_root->i_type = VLC_FOURCC( 'r', 'o', 'o', 't' );
p_root->i_shortsize = 1;