X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmp4%2Flibmp4.c;h=4407898e8f0532fe05bb2bdc23e32d5c795d78f5;hb=50cabe81a09c38ac91014e20fdace0b7821e5c1a;hp=a817a1c87b3791596a7bbe7e26df10d30c7ea06f;hpb=4befbe9485739f35567f98c14e1e370654d00e66;p=vlc diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index a817a1c87b..4407898e8f 100644 --- a/modules/demux/mp4/libmp4.c +++ b/modules/demux/mp4/libmp4.c @@ -2,7 +2,7 @@ * libmp4.c : LibMP4 library for mp4 module for vlc ***************************************************************************** * Copyright (C) 2001 VideoLAN - * $Id: libmp4.c,v 1.17 2003/03/11 18:57:50 fenrir Exp $ + * $Id: libmp4.c,v 1.27 2003/05/10 11:05:52 hartman Exp $ * Authors: Laurent Aimar * * This program is free software; you can redistribute it and/or modify @@ -45,9 +45,6 @@ ( 8 + ( p_box->i_shortsize == 1 ? 8 : 0 ) \ + ( p_box->i_type == FOURCC_uuid ? 16 : 0 ) ) -#define MP4_BOX_DESCEND( p_box ) \ - MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) ) - #define MP4_GET1BYTE( dst ) \ dst = *p_peek; p_peek++; i_read-- @@ -94,7 +91,7 @@ { \ return( 0 ); \ } \ - if( !MP4_ReadStream( p_stream, p_peek, i_read ) )\ + if( MP4_ReadStream( p_stream, p_peek, i_read ) )\ { \ free( p_buff ); \ return( 0 ); \ @@ -227,7 +224,6 @@ off_t MP4_TellAbsolute( input_thread_t *p_input ) vlc_mutex_lock( &p_input->stream.stream_lock ); i_pos= p_input->stream.p_selected_area->i_tell; -// ( p_input->p_last_data - p_input->p_current_data ); vlc_mutex_unlock( &p_input->stream.stream_lock ); @@ -235,22 +231,69 @@ off_t MP4_TellAbsolute( input_thread_t *p_input ) } int MP4_SeekAbsolute( input_thread_t *p_input, - off_t i_pos) + off_t i_pos) { off_t i_filepos; - if( i_pos >= p_input->stream.p_selected_area->i_size ) + //msg_Warn( p_input, "seek to %lld/%lld", i_pos, p_input->stream.p_selected_area->i_size ); + + if( p_input->stream.p_selected_area->i_size > 0 && + i_pos >= p_input->stream.p_selected_area->i_size ) { - return( 0 ); + msg_Warn( p_input, "seek:after end of file" ); + return VLC_EGENERIC; } i_filepos = MP4_TellAbsolute( p_input ); - if( i_pos != i_filepos ) + + if( i_filepos == i_pos ) + { + return VLC_SUCCESS; + } + + if( p_input->stream.b_seekable && + ( p_input->stream.i_method == INPUT_METHOD_FILE || + i_pos - i_filepos < 0 || + i_pos - i_filepos > 1024 ) ) { input_AccessReinit( p_input ); p_input->pf_seek( p_input, i_pos ); + return VLC_SUCCESS; + } + else if( i_pos - i_filepos > 0 ) + { + data_packet_t *p_data; + int i_skip = i_pos - i_filepos; + + msg_Warn( p_input, "will skip %d bytes, slow", i_skip ); + + while (i_skip > 0 ) + { + int i_read; + + i_read = input_SplitBuffer( p_input, &p_data, + __MIN( 4096, i_skip ) ); + if( i_read < 0 ) + { + msg_Warn( p_input, "seek:cannot read" ); + return VLC_EGENERIC; + } + i_skip -= i_read; + + input_DeletePacket( p_input->p_method_data, p_data ); + if( i_read == 0 && i_skip > 0 ) + { + msg_Warn( p_input, "seek:cannot read" ); + return VLC_EGENERIC; + } + } + return VLC_SUCCESS; + } + else + { + msg_Warn( p_input, "seek:failed" ); + return VLC_EGENERIC; } - return( 1 ); } /* return 1 if success, 0 if fail */ @@ -263,7 +306,7 @@ int MP4_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size ) if( !i_size ) { - return( 1 ); + return( VLC_SUCCESS ); } do @@ -271,7 +314,7 @@ int MP4_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size ) i_read = input_SplitBuffer(p_input, &p_data, __MIN( i_size, 1024 ) ); if( i_read <= 0 ) { - return( 0 ); + return( VLC_EGENERIC ); } memcpy( p_buff, p_data->p_payload_start, i_read ); input_DeletePacket( p_input->p_method_data, p_data ); @@ -281,7 +324,7 @@ int MP4_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size ) } while( i_size ); - return( 1 ); + return( VLC_SUCCESS ); } /***************************************************************************** @@ -357,13 +400,13 @@ int MP4_ReadStream( MP4_Stream_t *p_stream, uint8_t *p_buff, int i_size ) { if( i_size > p_stream->i_stop - p_stream->i_start ) { - return( 0 ); + return( VLC_EGENERIC ); } memcpy( p_buff, p_stream->p_buffer + p_stream->i_start, i_size ); p_stream->i_start += i_size; - return( 1 ); + return( VLC_SUCCESS ); } else { @@ -385,6 +428,16 @@ int MP4_PeekStream( MP4_Stream_t *p_stream, uint8_t **pp_peek, int i_size ) } else { + + if( p_stream->p_input->stream.p_selected_area->i_size > 0 ) + { + int64_t i_max = + p_stream->p_input->stream.p_selected_area->i_size - MP4_TellAbsolute( p_stream->p_input ); + if( i_size > i_max ) + { + i_size = i_max; + } + } return( input_Peek( p_stream->p_input, pp_peek, i_size ) ); } } @@ -416,11 +469,11 @@ int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos) if( i_pos < p_stream->i_stop ) { p_stream->i_start = i_pos; - return( 1 ); + return( VLC_SUCCESS ); } else { - return( 0 ); + return( VLC_EGENERIC ); } } else @@ -441,7 +494,7 @@ int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos) *****************************************************************************/ int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) { - int i_read; + int i_read; uint8_t *p_peek; if( ( ( i_read = MP4_PeekStream( p_stream, &p_peek, 32 ) ) < 8 ) ) @@ -483,12 +536,11 @@ int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) 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 @@ -525,7 +577,7 @@ int MP4_NextBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) return( 0 ); /* out of bound */ } } - return( MP4_SeekStream( p_stream, p_box->i_size + p_box->i_pos ) ); + return( MP4_SeekStream( p_stream, p_box->i_size + p_box->i_pos ) ? 0 : 1 ); } /***************************************************************************** * MP4_MP4_GotoBox : Go to this particular box @@ -534,7 +586,7 @@ int MP4_NextBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) *****************************************************************************/ int MP4_GotoBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) { - return( MP4_SeekStream( p_stream, p_box->i_pos ) ); + return( MP4_SeekStream( p_stream, p_box->i_pos ) ? 0 : 1 ); } @@ -587,7 +639,6 @@ int MP4_ReadBoxContainerRaw( MP4_Stream_t *p_stream, MP4_Box_t *p_container ) int MP4_ReadBoxContainer( MP4_Stream_t *p_stream, MP4_Box_t *p_container ) { - if( p_container->i_size <= (size_t)MP4_BOX_HEADERSIZE(p_container ) + 8 ) { /* container is empty, 8 stand for the first header in this box */ @@ -595,7 +646,7 @@ int MP4_ReadBoxContainer( MP4_Stream_t *p_stream, MP4_Box_t *p_container ) } /* enter box */ - MP4_BOX_DESCEND( p_container ); + MP4_SeekStream( p_stream, p_container->i_pos + MP4_BOX_HEADERSIZE( p_container ) ); return( MP4_ReadBoxContainerRaw( p_stream, p_container ) ); } @@ -607,6 +658,32 @@ void MP4_FreeBox_Common( input_thread_t *p_input, MP4_Box_t *p_box ) int MP4_ReadBoxSkip( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) { + /* XXX sometime moov is hiden in a free box */ + if( p_box->p_father && p_box->p_father->i_type == VLC_FOURCC( 'r', 'o', 'o', 't' )&& + p_box->i_type == FOURCC_free ) + { + uint8_t *p_peek; + int i_read; + vlc_fourcc_t i_fcc; + + i_read = MP4_PeekStream( p_stream, &p_peek, 44 ); + + p_peek += MP4_BOX_HEADERSIZE( p_box ) + 4; + i_read -= MP4_BOX_HEADERSIZE( p_box ) + 4; + + if( i_read >= 8 ) + { + i_fcc = VLC_FOURCC( p_peek[0], p_peek[1], p_peek[2], p_peek[3] ); + + if( i_fcc == FOURCC_cmov || i_fcc == FOURCC_mvhd ) + { + msg_Warn( p_stream->p_input, "Detected moov hidden in a free box ..." ); + + p_box->i_type = FOURCC_foov; + return MP4_ReadBoxContainer( p_stream, p_box ); + } + } + } /* Nothing to do */ #ifdef MP4_VERBOSE msg_Dbg( p_stream->p_input, "Skip box: \"%4.4s\"", @@ -782,30 +859,6 @@ int MP4_ReadBox_tkhd( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) MP4_READBOX_EXIT( 1 ); } -int MP4_ReadBox_tref( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) -{ - - if( p_box->i_size < (size_t)MP4_BOX_HEADERSIZE(p_box ) + 8 ) - { - /* container is empty, 8 stand for the first header in this box */ - return( 1 ); - } - - if( !MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) ) ) - { - return( 0 ); - } - - MP4_ReadBoxContainerRaw( p_stream, p_box ); - -#ifdef MP4_VERBOSE - msg_Dbg( p_stream->p_input, "Read Box: \"tref\" " ); - -#endif - return( 1 ); -} - - int MP4_ReadBox_mdhd( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) { @@ -1209,17 +1262,27 @@ int MP4_ReadBox_sample_soun( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) MP4_GET2BYTES( p_box->data.p_sample_soun->i_data_reference_index ); + /* + * XXX hack -> produce a copy of the nearly complete chunk + */ + 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 ); + memcpy( p_box->data.p_sample_soun->p_qt_description, + p_peek, + i_read ); + } + else + { + p_box->data.p_sample_soun->i_qt_description = 0; + p_box->data.p_sample_soun->p_qt_description = NULL; + } + 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_predefined ); @@ -1237,12 +1300,10 @@ int MP4_ReadBox_sample_soun( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) MP4_GET4BYTES( p_box->data.p_sample_soun->i_bytes_per_sample ); #ifdef MP4_VERBOSE - msg_Dbg( p_stream->p_input, "" ); 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 ); - msg_Dbg( p_stream->p_input, "" ); #endif MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 44 ); } @@ -1253,9 +1314,7 @@ int MP4_ReadBox_sample_soun( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) 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, "" ); - msg_Dbg( p_stream->p_input, "Read Box: \"soun\" mp4 or qt1/2 (rest=%d)", i_read ); - msg_Dbg( p_stream->p_input, "" ); + 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 */ @@ -1271,46 +1330,6 @@ int MP4_ReadBox_sample_soun( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) MP4_READBOX_EXIT( 1 ); } -#if 0 -int MP4_ReadBox_sample_mp4a( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) -{ - unsigned int i; - - MP4_READBOX_ENTER( MP4_Box_data_sample_mp4a_t ); - - for( i = 0; i < 6 ; i++ ) - { - MP4_GET1BYTE( p_box->data.p_sample_mp4a->i_reserved1[i] ); - } - - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_data_reference_index ); - - for( i = 0; i < 2 ; i++ ) - { - MP4_GET4BYTES( p_box->data.p_sample_mp4a->i_reserved2[i] ); - } - - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_channelcount ); - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_samplesize ); - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_predefined ); - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_reserved3 ); - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_sampleratehi ); - MP4_GET2BYTES( p_box->data.p_sample_mp4a->i_sampleratelo ); - - 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: \"mp4a\" in stsd channel %d sample size %d sampl rate %f", - p_box->data.p_sample_mp4a->i_channelcount, - p_box->data.p_sample_mp4a->i_samplesize, - (float)p_box->data.p_sample_mp4a->i_sampleratehi + - (float)p_box->data.p_sample_mp4a->i_sampleratelo / 65536 ); - -#endif - MP4_READBOX_EXIT( 1 ); -} -#endif int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) { @@ -1325,28 +1344,44 @@ int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) MP4_GET2BYTES( p_box->data.p_sample_vide->i_data_reference_index ); - MP4_GET2BYTES( p_box->data.p_sample_vide->i_predefined1 ); - MP4_GET2BYTES( p_box->data.p_sample_vide->i_reserved2 ); - - for( i = 0; i < 3 ; i++ ) + /* + * XXX hack -> produce a copy of the nearly complete chunk + */ + 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 ); + memcpy( p_box->data.p_sample_vide->p_qt_image_description, + p_peek, + i_read ); + } + else { - MP4_GET4BYTES( p_box->data.p_sample_vide->i_predefined2[i] ); + p_box->data.p_sample_vide->i_qt_image_description = 0; + p_box->data.p_sample_vide->p_qt_image_description = NULL; } + MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_version ); + MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_revision_level ); + MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_vendor ); + + MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_temporal_quality ); + MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_spatial_quality ); + MP4_GET2BYTES( p_box->data.p_sample_vide->i_width ); MP4_GET2BYTES( p_box->data.p_sample_vide->i_height ); MP4_GET4BYTES( p_box->data.p_sample_vide->i_horizresolution ); MP4_GET4BYTES( p_box->data.p_sample_vide->i_vertresolution ); - MP4_GET4BYTES( p_box->data.p_sample_vide->i_reserved3 ); - MP4_GET2BYTES( p_box->data.p_sample_vide->i_predefined3 ); + MP4_GET4BYTES( p_box->data.p_sample_vide->i_qt_data_size ); + MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_frame_count ); memcpy( &p_box->data.p_sample_vide->i_compressorname, p_peek, 32 ); p_peek += 32; i_read -= 32; MP4_GET2BYTES( p_box->data.p_sample_vide->i_depth ); - MP4_GET2BYTES( p_box->data.p_sample_vide->i_predefined4 ); + MP4_GET2BYTES( p_box->data.p_sample_vide->i_qt_color_table ); MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 78); MP4_ReadBoxContainerRaw( p_stream, p_box ); @@ -1817,8 +1852,8 @@ int MP4_ReadBox_cmov( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) } memset( p_box->data.p_cmov, 0, sizeof( MP4_Box_data_cmov_t ) ); - if( !( p_box->p_father )|| - ( p_box->p_father->i_type != FOURCC_moov ) ) + if( !p_box->p_father || + ( p_box->p_father->i_type != FOURCC_moov && p_box->p_father->i_type != FOURCC_foov) ) { msg_Warn( p_stream->p_input, "Read box: \"cmov\" box alone" ); return( 1 ); @@ -1943,7 +1978,7 @@ int MP4_ReadBox_rdrf( MP4_Stream_t *p_stream, MP4_Box_t *p_box ) if( i_len > 0 ) { uint32_t i; - p_box->data.p_rdrf->psz_ref = malloc( i_len ); + p_box->data.p_rdrf->psz_ref = malloc( i_len + 1); for( i = 0; i < i_len; i++ ) { MP4_GET1BYTE( p_box->data.p_rdrf->psz_ref[i] ); @@ -2046,13 +2081,13 @@ static struct { FOURCC_hnti, MP4_ReadBoxContainer, MP4_FreeBox_Common }, { FOURCC_rmra, MP4_ReadBoxContainer, MP4_FreeBox_Common }, { FOURCC_rmda, MP4_ReadBoxContainer, MP4_FreeBox_Common }, + { FOURCC_tref, MP4_ReadBoxContainer, MP4_FreeBox_Common }, /* specific box */ { FOURCC_ftyp, MP4_ReadBox_ftyp, MP4_FreeBox_ftyp }, { FOURCC_cmov, MP4_ReadBox_cmov, MP4_FreeBox_Common }, { FOURCC_mvhd, MP4_ReadBox_mvhd, MP4_FreeBox_Common }, { FOURCC_tkhd, MP4_ReadBox_tkhd, MP4_FreeBox_Common }, - { FOURCC_tref, MP4_ReadBox_tref, MP4_FreeBox_Common }, { FOURCC_mdhd, MP4_ReadBox_mdhd, MP4_FreeBox_Common }, { FOURCC_hdlr, MP4_ReadBox_hdlr, MP4_FreeBox_hdlr }, { FOURCC_vmhd, MP4_ReadBox_vmhd, MP4_FreeBox_Common }, @@ -2103,22 +2138,34 @@ static struct { 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_Qclp, MP4_ReadBox_sample_soun, MP4_FreeBox_Common }, + { FOURCC_samr, 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_ZyGo, 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_s263, 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 */ { FOURCC_mjht, NULL, NULL }, { FOURCC_dvc, MP4_ReadBox_sample_vide, MP4_FreeBox_Common }, { FOURCC_dvp, MP4_ReadBox_sample_vide, MP4_FreeBox_Common }, + { FOURCC_VP31, MP4_ReadBox_sample_vide, MP4_FreeBox_Common }, + { FOURCC_vp31, MP4_ReadBox_sample_vide, MP4_FreeBox_Common }, { FOURCC_jpeg, MP4_ReadBox_sample_vide, MP4_FreeBox_Common }, @@ -2190,12 +2237,9 @@ int MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box, MP4_Box_t *p_father ) (MP4_Box_Function[i_index].MP4_ReadBox_function)( p_stream, p_box ); } - if( !MP4_GotoBox( p_stream, p_box ) ) - { - return( 0 ); - } return( i_result ); } + #if 0 /***************************************************************************** * MP4_CountBox: given a box, count how many child have the requested type @@ -2398,8 +2442,10 @@ int MP4_BoxGetRoot( input_thread_t *p_input, MP4_Box_t *p_root ) /* check if there is a cmov, if so replace compressed moov by uncompressed one */ - if( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&& - ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) + if( ( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&& + ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) || + ( ( p_moov = MP4_FindBox( p_root, FOURCC_foov ) )&& + ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) ) { /* rename the compressed moov as a box to skip */ p_moov->i_type = FOURCC_skip; @@ -2521,7 +2567,7 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result, MP4_Box_t *p_box, char *psz_fmt, va_list args) { char *psz_path; -#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) +#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) size_t i_size; #endif @@ -2531,7 +2577,7 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result, return; } -#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) +#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS) vasprintf( &psz_path, psz_fmt, args ); #else i_size = strlen( psz_fmt ) + 1024;