vlc | branch: master | Laurent Aimar <[email protected]> | Sat Jan 7 01:14:03 2012 +0100| [63af7c781fe9c3cf07babb8befacd1d87b2182ca] | committer: Laurent Aimar
Added stream_BlockRemaining() helper. It is usefull to load a whole file to memory. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=63af7c781fe9c3cf07babb8befacd1d87b2182ca --- include/vlc_stream.h | 1 + src/input/stream.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/libvlccore.sym | 1 + 3 files changed, 47 insertions(+), 0 deletions(-) diff --git a/include/vlc_stream.h b/include/vlc_stream.h index 61b1726..c929836 100644 --- a/include/vlc_stream.h +++ b/include/vlc_stream.h @@ -119,6 +119,7 @@ VLC_API int stream_vaControl( stream_t *s, int i_query, va_list args ); VLC_API void stream_Delete( stream_t *s ); VLC_API int stream_Control( stream_t *s, int i_query, ... ); VLC_API block_t * stream_Block( stream_t *s, int i_size ); +VLC_API block_t * stream_BlockRemaining( stream_t *s, int i_max_size ); VLC_API char * stream_ReadLine( stream_t * ); /** diff --git a/src/input/stream.c b/src/input/stream.c index 7ac3994..0c938fb 100644 --- a/src/input/stream.c +++ b/src/input/stream.c @@ -1942,3 +1942,48 @@ block_t *stream_Block( stream_t *s, int i_size ) } return NULL; } + +/** + * Read the remaining of the data if there is less than i_max_size bytes, otherwise + * return NULL. + * + * The stream position is unknown after the call. + */ +block_t *stream_BlockRemaining( stream_t *s, int i_max_size ) +{ + int i_allocate = __MIN(1000000, i_max_size); + int64_t i_size = stream_Size( s ); + if( i_size > 0 ) + { + int64_t i_position = stream_Tell( s ); + if( i_position + i_max_size < i_size ) + { + msg_Err( s, "Remaining stream size is greater than %d bytes", + i_max_size ); + return NULL; + } + i_allocate = i_size - i_position; + } + if( i_allocate <= 0 ) + return NULL; + + block_t *p_block = block_New( s, i_allocate ); + int i_index = 0; + while( p_block ) + { + int i_read = stream_Read( s, &p_block->p_buffer[i_index], + p_block->i_buffer - i_index); + if( i_read <= 0 ) + break; + i_index += i_read; + i_max_size -= i_read; + if( i_max_size <= 0 ) + break; + p_block = block_Realloc( p_block, 0, p_block->i_buffer + + __MIN(1000000, i_max_size) ); + } + if( p_block ) + p_block->i_buffer = i_index; + return p_block; +} + diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 2a876f3..a2ea017 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -405,6 +405,7 @@ spu_ClearChannel sql_Create sql_Destroy stream_Block +stream_BlockRemaining stream_Control stream_Delete stream_DemuxNew _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
