decodeQtLanguageCode( i_language, p_box->data.p_mdhd->rgs_language,
&p_box->data.p_mdhd->b_mac_encoding );
- MP4_GET2BYTES( p_box->data.p_mdhd->i_predefined );
+ MP4_GET2BYTES( p_box->data.p_mdhd->i_quality );
#ifdef MP4_VERBOSE
MP4_ConvertDate2Str( s_creation_time, p_box->data.p_mdhd->i_creation_time, false );
MP4_GET1BYTE( i_type );
- if( i_type == 0x03 ) /* MP4ESDescrTag */
+ if( i_type == 0x03 ) /* MP4ESDescrTag ISO/IEC 14496-1 8.3.3 */
{
i_len = MP4_ReadLengthDescriptor( &p_peek, &i_read );
unsigned int i_len;
MP4_GET1BYTE( i_len );
+ i_len = __MIN(i_read, i_len);
es_descriptor.psz_URL = malloc( i_len + 1 );
if( es_descriptor.psz_URL )
{
MP4_GET1BYTE( i_type ); /* get next type */
}
- if( i_type != 0x04)/* MP4DecConfigDescrTag */
+ if( i_type != 0x04)/* MP4DecConfigDescrTag ISO/IEC 14496-1 8.3.4 */
{
es_descriptor.p_decConfigDescr = NULL;
MP4_READBOX_EXIT( 1 ); /* rest isn't interesting up to now */
if( unlikely( es_descriptor.p_decConfigDescr == NULL ) )
MP4_READBOX_EXIT( 0 );
- MP4_GET1BYTE( es_descriptor.p_decConfigDescr->i_objectTypeIndication );
+ MP4_GET1BYTE( es_descriptor.p_decConfigDescr->i_objectProfileIndication );
MP4_GET1BYTE( i_flags );
es_descriptor.p_decConfigDescr->i_streamType = i_flags >> 2;
es_descriptor.p_decConfigDescr->b_upStream = ( i_flags >> 1 )&0x01;
MP4_GET4BYTES( es_descriptor.p_decConfigDescr->i_max_bitrate );
MP4_GET4BYTES( es_descriptor.p_decConfigDescr->i_avg_bitrate );
MP4_GET1BYTE( i_type );
- if( i_type != 0x05 )/* MP4DecSpecificDescrTag */
+ if( i_type != 0x05 )/* MP4DecSpecificDescrTag ISO/IEC 14496-1 8.3.5 */
{
es_descriptor.p_decConfigDescr->i_decoder_specific_info_len = 0;
es_descriptor.p_decConfigDescr->p_decoder_specific_info = NULL;
MP4_READBOX_EXIT( 0 );
}
+static int MP4_ReadBox_WMA2( stream_t *p_stream, MP4_Box_t *p_box )
+{
+ MP4_READBOX_ENTER( MP4_Box_data_WMA2_t );
+
+ MP4_Box_data_WMA2_t *p_WMA2 = p_box->data.p_WMA2;
+
+ MP4_GET2BYTESLE( p_WMA2->Format.wFormatTag );
+ MP4_GET2BYTESLE( p_WMA2->Format.nChannels );
+ MP4_GET4BYTESLE( p_WMA2->Format.nSamplesPerSec );
+ MP4_GET4BYTESLE( p_WMA2->Format.nAvgBytesPerSec );
+ MP4_GET2BYTESLE( p_WMA2->Format.nBlockAlign );
+ MP4_GET2BYTESLE( p_WMA2->Format.wBitsPerSample );
+
+ uint16_t i_cbSize;
+ MP4_GET2BYTESLE( i_cbSize );
+
+ if ( i_read < 0 || i_cbSize > i_read )
+ goto error;
+
+ p_WMA2->i_extra = i_cbSize;
+ if ( p_WMA2->i_extra )
+ {
+ p_WMA2->p_extra = malloc( p_WMA2->i_extra );
+ if ( ! p_WMA2->p_extra )
+ goto error;
+ memcpy( p_WMA2->p_extra, p_peek, p_WMA2->i_extra );
+ }
+
+ MP4_READBOX_EXIT( 1 );
+
+error:
+ MP4_READBOX_EXIT( 0 );
+}
+
+static void MP4_FreeBox_WMA2( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_WMA2->p_extra );
+}
+
+static int MP4_ReadBox_strf( stream_t *p_stream, MP4_Box_t *p_box )
+{
+ MP4_READBOX_ENTER( MP4_Box_data_strf_t );
+
+ MP4_Box_data_strf_t *p_strf = p_box->data.p_strf;
+
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biSize );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biWidth );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biHeight );
+ MP4_GET2BYTESLE( p_strf->bmiHeader.biPlanes );
+ MP4_GET2BYTESLE( p_strf->bmiHeader.biBitCount );
+ MP4_GETFOURCC( p_strf->bmiHeader.biCompression );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biSizeImage );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biXPelsPerMeter );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biYPelsPerMeter );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biClrUsed );
+ MP4_GET4BYTESLE( p_strf->bmiHeader.biClrImportant );
+
+ if ( i_read < 0 )
+ goto error;
+
+ p_strf->i_extra = i_read;
+ if ( p_strf->i_extra )
+ {
+ p_strf->p_extra = malloc( p_strf->i_extra );
+ if ( ! p_strf->p_extra )
+ goto error;
+ memcpy( p_strf->p_extra, p_peek, i_read );
+ }
+
+ MP4_READBOX_EXIT( 1 );
+
+error:
+ MP4_READBOX_EXIT( 0 );
+}
+
+static void MP4_FreeBox_strf( MP4_Box_t *p_box )
+{
+ FREENULL( p_box->data.p_strf->p_extra );
+}
+
+static int MP4_ReadBox_ASF( stream_t *p_stream, MP4_Box_t *p_box )
+{
+ MP4_READBOX_ENTER( MP4_Box_data_ASF_t );
+
+ MP4_Box_data_ASF_t *p_asf = p_box->data.p_asf;
+
+ if (i_read != 8)
+ MP4_READBOX_EXIT( 0 );
+
+ MP4_GET1BYTE( p_asf->i_stream_number );
+ /* remaining is unknown */
+
+ MP4_READBOX_EXIT( 1 );
+}
+
static int MP4_ReadBox_stsdext_chan( stream_t *p_stream, MP4_Box_t *p_box )
{
MP4_READBOX_ENTER( MP4_Box_data_chan_t );
static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box )
{
+ p_box->i_handler = ATOM_soun;
MP4_READBOX_ENTER( MP4_Box_data_sample_soun_t );
p_box->data.p_sample_soun->p_qt_description = NULL;
int MP4_ReadBox_sample_vide( stream_t *p_stream, MP4_Box_t *p_box )
{
+ p_box->i_handler = ATOM_vide;
MP4_READBOX_ENTER( MP4_Box_data_sample_vide_t );
for( unsigned i = 0; i < 6 ; i++ )
MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_data_size );
MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_frame_count );
+ if ( i_read < 32 )
+ MP4_READBOX_EXIT( 0 );
memcpy( &p_box->data.p_sample_vide->i_compressorname, p_peek, 32 );
p_peek += 32; i_read -= 32;
{
int32_t t;
+ p_box->i_handler = ATOM_text;
MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );
MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );
static int MP4_ReadBox_sample_tx3g( stream_t *p_stream, MP4_Box_t *p_box )
{
+ p_box->i_handler = ATOM_text;
MP4_READBOX_ENTER( MP4_Box_data_sample_text_t );
MP4_GET4BYTES( p_box->data.p_sample_text->i_reserved1 );
static int MP4_ReadBox_cprt( stream_t *p_stream, MP4_Box_t *p_box )
{
- unsigned int i_language;
+ uint16_t i_language;
+ bool b_mac;
MP4_READBOX_ENTER( MP4_Box_data_cprt_t );
MP4_GETVERSIONFLAGS( p_box->data.p_cprt );
- i_language = GetWBE( p_peek );
- for( unsigned i = 0; i < 3; i++ )
- {
- p_box->data.p_cprt->i_language[i] =
- ( ( i_language >> ( (2-i)*5 ) )&0x1f ) + 0x60;
- }
- p_peek += 2; i_read -= 2;
+ MP4_GET2BYTES( i_language );
+ decodeQtLanguageCode( i_language, p_box->data.p_cprt->rgs_language, &b_mac );
+
MP4_GETSTRINGZ( p_box->data.p_cprt->psz_notice );
#ifdef MP4_VERBOSE
- msg_Dbg( p_stream, "read box: \"cprt\" language %c%c%c notice %s",
- p_box->data.p_cprt->i_language[0],
- p_box->data.p_cprt->i_language[1],
- p_box->data.p_cprt->i_language[2],
+ msg_Dbg( p_stream, "read box: \"cprt\" language %3.3s notice %s",
+ p_box->data.p_cprt->rgs_language,
p_box->data.p_cprt->psz_notice );
#endif
{ ATOM_rmda, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_rmra },
{ ATOM_tref, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_trak },
{ ATOM_gmhd, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_minf },
- { ATOM_wave, MP4_ReadBoxContainer, MP4_FreeBox_Common, 0 },
+ { ATOM_wave, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_stsd },
+ { ATOM_wave, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_WMA2 }, /* flip4mac */
{ ATOM_ilst, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_meta },
{ ATOM_mvex, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_moov },
{ ATOM_mvex, MP4_ReadBoxContainer, MP4_FreeBox_Common, ATOM_ftyp },
{ ATOM_padb, MP4_ReadBox_padb, MP4_FreeBox_padb, 0 },
{ ATOM_elst, MP4_ReadBox_elst, MP4_FreeBox_elst, ATOM_edts },
{ ATOM_cprt, MP4_ReadBox_cprt, MP4_FreeBox_cprt, 0 },
- { ATOM_esds, MP4_ReadBox_esds, MP4_FreeBox_esds, 0 },
+ { ATOM_esds, MP4_ReadBox_esds, MP4_FreeBox_esds, ATOM_wave }, /* mp4a in wave chunk */
+ { ATOM_esds, MP4_ReadBox_esds, MP4_FreeBox_esds, ATOM_mp4a },
+ { ATOM_esds, MP4_ReadBox_esds, MP4_FreeBox_esds, ATOM_mp4v },
{ ATOM_dcom, MP4_ReadBox_dcom, MP4_FreeBox_Common, 0 },
{ ATOM_cmvd, MP4_ReadBox_cmvd, MP4_FreeBox_cmvd, 0 },
- { ATOM_avcC, MP4_ReadBox_avcC, MP4_FreeBox_avcC, 0 },
+ { ATOM_avcC, MP4_ReadBox_avcC, MP4_FreeBox_avcC, ATOM_avc1 },
{ ATOM_hvcC, MP4_ReadBox_hvcC, MP4_FreeBox_hvcC, 0 },
{ ATOM_dac3, MP4_ReadBox_dac3, MP4_FreeBox_Common, 0 },
{ ATOM_dec3, MP4_ReadBox_dec3, MP4_FreeBox_Common, 0 },
{ ATOM_sawb, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun, ATOM_stsd },
{ ATOM_OggS, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun, ATOM_stsd },
{ ATOM_alac, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun, ATOM_stsd },
+ { ATOM_WMA2, MP4_ReadBox_sample_soun, MP4_FreeBox_sample_soun, ATOM_stsd }, /* flip4mac */
/* Sound extensions */
{ ATOM_chan, MP4_ReadBox_stsdext_chan, MP4_FreeBox_stsdext_chan, 0 },
+ { ATOM_WMA2, MP4_ReadBox_WMA2, MP4_FreeBox_WMA2, ATOM_wave }, /* flip4mac */
{ ATOM_drmi, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
{ ATOM_vide, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
{ ATOM_qdrw, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
{ ATOM_mp2v, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
{ ATOM_hdv2, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
+ { ATOM_WMV3, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, ATOM_stsd },
{ ATOM_mjqt, MP4_ReadBox_default, NULL, 0 }, /* found in mjpa/b */
{ ATOM_mjht, MP4_ReadBox_default, NULL, 0 },
{ ATOM_yv12, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, 0 },
{ ATOM_yuv2, MP4_ReadBox_sample_vide, MP4_FreeBox_sample_vide, 0 },
+ { ATOM_strf, MP4_ReadBox_strf, MP4_FreeBox_strf, ATOM_WMV3 }, /* flip4mac */
+ { ATOM_ASF , MP4_ReadBox_ASF, MP4_FreeBox_Common, ATOM_WMV3 }, /* flip4mac */
+ { ATOM_ASF , MP4_ReadBox_ASF, MP4_FreeBox_Common, ATOM_wave }, /* flip4mac */
+
{ ATOM_mp4s, MP4_ReadBox_sample_mp4s, MP4_FreeBox_Common, 0 },
/* XXX there is 2 box where we could find this entry stbl and tref*/
{ ATOM_key, MP4_ReadBox_drms, MP4_FreeBox_Common, 0 },
{ ATOM_iviv, MP4_ReadBox_drms, MP4_FreeBox_Common, 0 },
{ ATOM_priv, MP4_ReadBox_drms, MP4_FreeBox_Common, 0 },
- { ATOM_frma, MP4_ReadBox_frma, MP4_FreeBox_Common, 0 },
+ { ATOM_frma, MP4_ReadBox_frma, MP4_FreeBox_Common, ATOM_sinf }, /* and rinf */
+ { ATOM_frma, MP4_ReadBox_frma, MP4_FreeBox_Common, ATOM_wave }, /* flip4mac */
{ ATOM_skcr, MP4_ReadBox_skcr, MP4_FreeBox_Common, 0 },
/* found in udta */
return NULL;
}
+ p_box->pf_free = MP4_Box_Function[i_index].MP4_FreeBox_function;
+
return p_box;
}
*****************************************************************************/
void MP4_BoxFree( stream_t *s, MP4_Box_t *p_box )
{
- unsigned int i_index;
MP4_Box_t *p_child;
if( !p_box )
/* Now search function to call */
if( p_box->data.p_payload )
{
- for( i_index = 0; ; i_index++ )
- {
- if( ( MP4_Box_Function[i_index].i_type == p_box->i_type )||
- ( MP4_Box_Function[i_index].i_type == 0 ) )
- {
- break;
- }
- }
- if( MP4_Box_Function[i_index].MP4_FreeBox_function == NULL )
+ if (unlikely( p_box->pf_free == NULL ))
{
/* Should not happen */
if MP4_BOX_TYPE_ASCII()
}
else
{
- MP4_Box_Function[i_index].MP4_FreeBox_function( p_box );
+ p_box->pf_free( p_box );
}
free( p_box->data.p_payload );
}