* libmp4.c : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: libmp4.c,v 1.15 2003/02/18 23:34:14 gbazin Exp $
+ * $Id: libmp4.c,v 1.20 2003/04/16 16:32:42 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
i_day, i_hour, i_min, i_sec );
}
+#if 0
+static void DataDump( uint8_t *p_data, int i_data )
+{
+ int i;
+ fprintf( stderr, "\nDumping %d bytes\n", i_data );
+ for( i = 0; i < i_data; i++ )
+ {
+ int c;
+ c = p_data[i];
+ if( c < 32 || c > 127 ) c = '.';
+ fprintf( stderr, "%c", c );
+ if( i % 60 == 59 ) fprintf( stderr, "\n" );
+ }
+ fprintf( stderr, "\n" );
+}
+#endif
/*****************************************************************************
* Some basic functions to manipulate stream more easily in vlc
i_filepos = MP4_TellAbsolute( p_input );
if( i_pos != i_filepos )
{
- p_input->pf_seek( p_input, i_pos );
input_AccessReinit( p_input );
+ p_input->pf_seek( p_input, i_pos );
}
return( 1 );
}
p_stream->p_input = p_input;
p_stream->i_start = 0;
p_stream->i_stop = i_size;
- if( !p_stream->p_buffer )
+ if( !p_buffer )
{
if( !( p_stream->p_buffer = malloc( i_size ) ) )
{
CreateUUID( &p_box->i_uuid, p_box->i_type );
}
#ifdef MP4_VERBOSE
- /* FIXME how to write uint64_t ??? */
if( p_box->i_size )
{
- msg_Dbg( p_stream->p_input, "Found Box: %4.4s size %d",
+ msg_Dbg( p_stream->p_input, "Found Box: %4.4s size "I64Fd,
(char*)&p_box->i_type,
- (uint32_t)p_box->i_size );
+ p_box->i_size );
}
#endif
if( i_type != 0x04)/* MP4DecConfigDescrTag */
{
+ es_descriptor.p_decConfigDescr = NULL;
MP4_READBOX_EXIT( 1 ); /* rest isn't interesting up to now */
}
MP4_GET1BYTE( i_type );
if( i_type != 0x05 )/* MP4DecSpecificDescrTag */
{
+ es_descriptor.p_decConfigDescr->i_decoder_specific_info_len = 0;
+ es_descriptor.p_decConfigDescr->p_decoder_specific_info = NULL;
MP4_READBOX_EXIT( 1 );
}
MP4_GET2BYTES( p_box->data.p_sample_soun->i_data_reference_index );
+ MP4_GET2BYTES( p_box->data.p_sample_soun->i_qt_version );
+ MP4_GET2BYTES( p_box->data.p_sample_soun->i_qt_revision_level );
+ MP4_GET4BYTES( p_box->data.p_sample_soun->i_qt_vendor );
+
+#if 0
for( i = 0; i < 2 ; i++ )
{
MP4_GET4BYTES( p_box->data.p_sample_soun->i_reserved2[i] );
}
+#endif
MP4_GET2BYTES( p_box->data.p_sample_soun->i_channelcount );
MP4_GET2BYTES( p_box->data.p_sample_soun->i_samplesize );
MP4_GET2BYTES( p_box->data.p_sample_soun->i_sampleratehi );
MP4_GET2BYTES( p_box->data.p_sample_soun->i_sampleratelo );
- MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 28 );
+ if( p_box->data.p_sample_soun->i_qt_version == 1 &&
+ i_read >= 16 )
+ {
+ /* qt3+ */
+ MP4_GET4BYTES( p_box->data.p_sample_soun->i_sample_per_packet );
+ MP4_GET4BYTES( p_box->data.p_sample_soun->i_bytes_per_packet );
+ MP4_GET4BYTES( p_box->data.p_sample_soun->i_bytes_per_frame );
+ MP4_GET4BYTES( p_box->data.p_sample_soun->i_bytes_per_sample );
+
+#ifdef MP4_VERBOSE
+ msg_Dbg( p_stream->p_input,
+ "Read Box: \"soun\" qt3+ sample/packet=%d bytes/packet=%d bytes/frame=%d bytes/sample=%d",
+ p_box->data.p_sample_soun->i_sample_per_packet, p_box->data.p_sample_soun->i_bytes_per_packet,
+ p_box->data.p_sample_soun->i_bytes_per_frame, p_box->data.p_sample_soun->i_bytes_per_sample );
+#endif
+ MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 44 );
+ }
+ else
+ {
+ p_box->data.p_sample_soun->i_sample_per_packet = 0;
+ p_box->data.p_sample_soun->i_bytes_per_packet = 0;
+ 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->p_input, "Read Box: \"soun\" mp4 or qt1/2 (rest="I64Fd")", i_read );
+ MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 28 );
+ }
MP4_ReadBoxContainerRaw( p_stream, p_box ); /* esds */
#ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input,
"Read Box: \"cmov\" box succesfully uncompressed" );
+ //DataDump( p_data, p_cmvd->data.p_cmvd->i_uncompressed_size );
/* now create a memory stream */
p_stream_memory = MP4_MemoryStream( p_stream->p_input,
p_cmvd->data.p_cmvd->i_uncompressed_size,
p_cmvd->data.p_cmvd->p_data );
+ //DataDump( p_stream_memory->p_buffer, p_stream_memory->i_stop );
+
/* and read uncompressd moov */
p_umov = malloc( sizeof( MP4_Box_t ) );
/* for codecs */
{ FOURCC_soun, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
- { FOURCC__mp3, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_ms02, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_ms11, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
{ FOURCC_ms55, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC__mp3, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
{ FOURCC_mp4a, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
{ FOURCC_twos, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_sowt, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_QDMC, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_QDM2, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_ima4, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_IMA4, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_dvi, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_alaw, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_ulaw, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_raw, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_MAC3, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
+ { FOURCC_MAC6, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
{ FOURCC_vide, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mp4v, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_SVQ1, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_SVQ3, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_DIVX, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_h263, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_cvid, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_3IV1, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3iv1, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_3IV2, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3iv2, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3IVD, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3ivd, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3VID, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_3vid, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mjpa, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mjpb, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mjqt, NULL, NULL }, /* found in mjpa/b */