* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
+#include <vlc/vlc.h>
+
+#include <stdio.h>
#include <stdlib.h> /* malloc(), free() */
-#include <vlc/vlc.h>
#include <vlc/input.h>
#ifdef HAVE_ZLIB_H
#define MP4_GETSTRINGZ( p_str ) \
if( ( i_read > 0 )&&(p_peek[0] ) ) \
{ \
- p_str = calloc( sizeof( char ), __MIN( strlen( p_peek ), i_read )+1);\
- memcpy( p_str, p_peek, __MIN( strlen( p_peek ), i_read ) ); \
- p_str[__MIN( strlen( p_peek ), i_read )] = 0; \
+ p_str = calloc( sizeof( char ), __MIN( strlen( (char*)p_peek ), i_read )+1);\
+ memcpy( p_str, p_peek, __MIN( strlen( (char*)p_peek ), i_read ) ); \
+ p_str[__MIN( strlen( (char*)p_peek ), i_read )] = 0; \
p_peek += strlen( p_str ) + 1; \
i_read -= strlen( p_str ) + 1; \
} \
#define MP4_READBOX_ENTER( MP4_Box_data_TYPE_t ) \
- int64_t i_read = p_box->i_size; \
+ uint64_t i_read = p_box->i_size; \
uint8_t *p_peek, *p_buff; \
- i_read = p_box->i_size; \
+ int i_actually_read; \
if( !( p_peek = p_buff = malloc( i_read ) ) ) \
{ \
return( 0 ); \
} \
- if( stream_Read( p_stream, p_peek, i_read ) < i_read )\
+ i_actually_read = stream_Read( p_stream, p_peek, i_read ); \
+ if( i_actually_read < 0 || (uint64_t)i_actually_read < i_read )\
{ \
free( p_buff ); \
return( 0 ); \
} \
return( i_code )
-#define FREE( p ) \
- if( p ) {free( p ); p = NULL; }
-
-
/* Some assumptions:
* The input method HAVE to be seekable
static void MP4_FreeBox_ftyp( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_ftyp->i_compatible_brands );
+ FREENULL( p_box->data.p_ftyp->i_compatible_brands );
}
static void MP4_FreeBox_hdlr( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_hdlr->psz_name );
+ FREENULL( p_box->data.p_hdlr->psz_name );
}
static int MP4_ReadBox_vmhd( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_url( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_url->psz_location )
+ FREENULL( p_box->data.p_url->psz_location )
}
static int MP4_ReadBox_urn( stream_t *p_stream, MP4_Box_t *p_box )
}
static void MP4_FreeBox_urn( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_urn->psz_name );
- FREE( p_box->data.p_urn->psz_location );
+ FREENULL( p_box->data.p_urn->psz_name );
+ FREENULL( p_box->data.p_urn->psz_location );
}
static void MP4_FreeBox_stts( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stts->i_sample_count );
- FREE( p_box->data.p_stts->i_sample_delta );
+ FREENULL( p_box->data.p_stts->i_sample_count );
+ FREENULL( p_box->data.p_stts->i_sample_delta );
}
static int MP4_ReadBox_ctts( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_ctts( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_ctts->i_sample_count );
- FREE( p_box->data.p_ctts->i_sample_offset );
+ 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 )
+static int MP4_ReadLengthDescriptor( uint8_t **pp_peek, uint64_t *i_read )
{
unsigned int i_b;
unsigned int i_len = 0;
static void MP4_FreeBox_esds( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_esds->es_descriptor.psz_URL );
+ FREENULL( p_box->data.p_esds->es_descriptor.psz_URL );
if( p_box->data.p_esds->es_descriptor.p_decConfigDescr )
{
- FREE( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info );
+ FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info );
}
- FREE( p_box->data.p_esds->es_descriptor.p_decConfigDescr );
+ FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr );
}
static int MP4_ReadBox_avcC( stream_t *p_stream, MP4_Box_t *p_box )
for( i = 0; i < p_avcC->i_sps; i++ )
{
- FREE( p_avcC->sps[i] );
+ FREENULL( p_avcC->sps[i] );
}
for( i = 0; i < p_avcC->i_pps; i++ )
{
- FREE( p_avcC->pps[i] );
+ FREENULL( p_avcC->pps[i] );
}
- if( p_avcC->i_sps > 0 ) FREE( p_avcC->sps );
- if( p_avcC->i_pps > 0 ) FREE( p_avcC->pps );
+ if( p_avcC->i_sps > 0 ) FREENULL( p_avcC->sps );
+ if( p_avcC->i_pps > 0 ) FREENULL( p_avcC->pps );
}
static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box )
{
/* SoundDescriptionV2 */
double f_sample_rate;
+ int64_t dummy;
uint32_t i_channel;
MP4_GET4BYTES( p_box->data.p_sample_soun->i_sample_per_packet );
- MP4_GET8BYTES( (*(int64_t *)&f_sample_rate) );
+ MP4_GET8BYTES( dummy );
+ memcpy( &f_sample_rate, &dummy, 8 );
msg_Dbg( p_stream, "read box: %f Hz", f_sample_rate );
p_box->data.p_sample_soun->i_sampleratehi = (int)f_sample_rate % 65536;
if( p_box->i_type == FOURCC_drms )
{
p_box->data.p_sample_soun->p_drms =
- drms_alloc( p_stream->p_vlc->psz_homedir );
+ drms_alloc( p_stream->p_libvlc->psz_homedir );
if( p_box->data.p_sample_soun->p_drms == NULL )
{
static void MP4_FreeBox_sample_soun( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_sample_soun->p_qt_description );
+ FREENULL( p_box->data.p_sample_soun->p_qt_description );
if( p_box->i_type == FOURCC_drms )
{
void MP4_FreeBox_sample_vide( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_sample_vide->p_qt_image_description );
+ FREENULL( p_box->data.p_sample_vide->p_qt_image_description );
}
static int MP4_ReadBox_sample_mp4s( stream_t *p_stream, MP4_Box_t *p_box )
/* We can't easily call it, and anyway ~ 20 bytes lost isn't a real problem */
static void MP4_FreeBox_sample_text( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_sample_text->psz_text_name );
+ FREENULL( p_box->data.p_sample_text->psz_text_name );
}
#endif
static void MP4_FreeBox_stsz( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stsz->i_entry_size );
+ FREENULL( p_box->data.p_stsz->i_entry_size );
}
static int MP4_ReadBox_stsc( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_stsc( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stsc->i_first_chunk );
- FREE( p_box->data.p_stsc->i_samples_per_chunk );
- FREE( p_box->data.p_stsc->i_sample_description_index );
+ 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 )
static void MP4_FreeBox_stco_co64( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_co64->i_chunk_offset );
+ FREENULL( p_box->data.p_co64->i_chunk_offset );
}
static int MP4_ReadBox_stss( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_stss( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stss->i_sample_number )
+ FREENULL( p_box->data.p_stss->i_sample_number )
}
static int MP4_ReadBox_stsh( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_stsh( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stsh->i_shadowed_sample_number )
- FREE( p_box->data.p_stsh->i_sync_sample_number )
+ FREENULL( p_box->data.p_stsh->i_shadowed_sample_number )
+ FREENULL( p_box->data.p_stsh->i_sync_sample_number )
}
static void MP4_FreeBox_stdp( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_stdp->i_priority )
+ FREENULL( p_box->data.p_stdp->i_priority )
}
static int MP4_ReadBox_padb( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_padb( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_padb->i_reserved1 );
- FREE( p_box->data.p_padb->i_pad2 );
- FREE( p_box->data.p_padb->i_reserved2 );
- FREE( p_box->data.p_padb->i_pad1 );
+ 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_elst( stream_t *p_stream, MP4_Box_t *p_box )
static void MP4_FreeBox_elst( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_elst->i_segment_duration );
- FREE( p_box->data.p_elst->i_media_time );
- FREE( p_box->data.p_elst->i_media_rate_integer );
- FREE( p_box->data.p_elst->i_media_rate_fraction );
+ 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 )
static void MP4_FreeBox_cprt( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_cprt->psz_notice );
+ FREENULL( p_box->data.p_cprt->psz_notice );
}
}
static void MP4_FreeBox_cmvd( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_cmvd->p_data );
+ FREENULL( p_box->data.p_cmvd->p_data );
}
static void MP4_FreeBox_rdrf( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_rdrf->psz_ref )
+ FREENULL( p_box->data.p_rdrf->psz_ref )
}
if( p_drms_box && p_drms_box->data.p_sample_soun->p_drms )
{
- int i_ret = drms_init( p_drms_box->data.p_sample_soun->p_drms,
+ int i_ret;
+ if( config_GetInt( p_stream, "france" ) )
+ {
+ i_ret = -7;
+ }
+ else
+ {
+ i_ret= drms_init( p_drms_box->data.p_sample_soun->p_drms,
p_box->i_type, p_peek, i_read );
+ }
if( i_ret )
{
char *psz_error;
case -4: psz_error = "could not get SCI data"; break;
case -5: psz_error = "no user key found in SCI data"; break;
case -6: psz_error = "invalid user key"; break;
+ case -7: psz_error = "you live in France"; break;
default: psz_error = "unknown error"; break;
}
static int MP4_ReadBox_0xa9xxx( stream_t *p_stream, MP4_Box_t *p_box )
{
- int16_t i_length, i_dummy;
+ uint16_t i_length, i_dummy;
MP4_READBOX_ENTER( MP4_Box_data_0xa9xxx_t );
}
static void MP4_FreeBox_0xa9xxx( MP4_Box_t *p_box )
{
- FREE( p_box->data.p_0xa9xxx->psz_text );
+ FREENULL( p_box->data.p_0xa9xxx->psz_text );
}
/* For generic */
if( !psz_path || !psz_path[0] )
{
- FREE( psz_path );
+ FREENULL( psz_path );
*pp_result = NULL;
return;
}
// psz_path,psz_token,i_number );
if( !psz_token )
{
- FREE( psz_token );
+ FREENULL( psz_token );
free( psz_fmt );
*pp_result = p_box;
return;
else
{
// fprintf( stderr, "Argg malformed token \"%s\"",psz_token );
- FREE( psz_token );
+ FREENULL( psz_token );
free( psz_fmt );
*pp_result = NULL;
return;