-static MP4_Box_t *MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_father );
-
-/*****************************************************************************
- * Some basic functions to manipulate MP4_Stream_t, an abstraction of stream_t
- * in the way that you can read from a memory buffer or from an input
- *
- *****************************************************************************/
-
-/**** ------- First some function to make abstract from input -------- */
-
-/****************************************************************************
- * MP4_InputStream create an stram with an input
- *
- ****************************************************************************/
-MP4_Stream_t *MP4_InputStream( stream_t *s )
-{
- MP4_Stream_t *p_stream;
-
- if( !( p_stream = malloc( sizeof( MP4_Stream_t ) ) ) )
- {
- return( NULL );
- }
- p_stream->b_memory = 0;
- p_stream->s = s;
- p_stream->i_start = 0;
- p_stream->i_stop = 0;
- p_stream->p_buffer = NULL;
- return( p_stream );
-}
-
-
-/****************************************************************************
- * MP4_MemoryStream create a memory stream
- * if p_buffer == NULL, will allocate a buffer of i_size, else
- * it uses p_buffer XXX you have to unallocate it yourself !
- *
- ****************************************************************************/
-MP4_Stream_t *MP4_MemoryStream( stream_t *s,
- int i_size, uint8_t *p_buffer )
-{
- MP4_Stream_t *p_stream;
-
- if( !( p_stream = malloc( sizeof( MP4_Stream_t ) ) ) )
- {
- return( NULL );
- }
- p_stream->b_memory = 1;
- p_stream->s = s;
- p_stream->i_start = 0;
- p_stream->i_stop = i_size;
- if( !p_buffer )
- {
- if( !( p_stream->p_buffer = malloc( i_size ) ) )
- {
- free( p_stream );
- return( NULL );
- }
- }
- else
- {
- p_stream->p_buffer = p_buffer;
- }
-
- return( p_stream );
-}
-/****************************************************************************
- * MP4_ReadStream read from a MP4_Stream_t
- *
- ****************************************************************************/
-int MP4_ReadStream( MP4_Stream_t *p_stream, uint8_t *p_buff, int i_size )
-{
- if( p_stream->b_memory )
- {
- if( i_size > p_stream->i_stop - p_stream->i_start )
- {
- return( VLC_EGENERIC );
- }
- memcpy( p_buff,
- p_stream->p_buffer + p_stream->i_start,
- i_size );
- p_stream->i_start += i_size;
- return( VLC_SUCCESS );
- }
- else
- {
- return( stream_Read( p_stream->s, p_buff, i_size ) < i_size ? VLC_EGENERIC : VLC_SUCCESS);
- }
-}
-
-/****************************************************************************
- * MP4_PeekStream peek from a MP4_Stream_t
- *
- ****************************************************************************/
-int MP4_PeekStream( MP4_Stream_t *p_stream, uint8_t **pp_peek, int i_size )
-{
- if( p_stream->b_memory )
- {
- *pp_peek = p_stream->p_buffer + p_stream->i_start;
-
- return( __MIN(i_size,p_stream->i_stop - p_stream->i_start ));
- }
- else
- {
-
- if( stream_Size( p_stream->s ) > 0 )
- {
- int64_t i_max = stream_Size( p_stream->s ) - stream_Tell( p_stream->s );
- if( i_size > i_max )
- {
- i_size = i_max;
- }
- }
- return( stream_Peek( p_stream->s, pp_peek, i_size ) );
- }
-}
-
-/****************************************************************************
- * MP4_TellStream give absolute position in the stream
- * XXX for a memory stream give position from begining of the buffer
- ****************************************************************************/
-off_t MP4_TellStream( MP4_Stream_t *p_stream )
-{
- if( p_stream->b_memory )
- {
- return( p_stream->i_start );
- }
- else
- {
- return( stream_Tell( p_stream->s ) );
- }
-}
-
-/****************************************************************************
- * MP4_SeekStream seek in a MP4_Stream_t
- *
- ****************************************************************************/
-int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos)
-{
- if( p_stream->b_memory )
- {
- if( i_pos < p_stream->i_stop )
- {
- p_stream->i_start = i_pos;
- return( VLC_SUCCESS );
- }
- else
- {
- return( VLC_EGENERIC );
- }
- }
- else
- {
- return( stream_Seek( p_stream->s, (int64_t)i_pos ) );
- }
-}
-