Commit 63af7c78 authored by Laurent Aimar's avatar Laurent Aimar

Added stream_BlockRemaining() helper.

It is usefull to load a whole file to memory.
parent ea6be118
......@@ -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 * );
/**
......
......@@ -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;
}
......@@ -405,6 +405,7 @@ spu_ClearChannel
sql_Create
sql_Destroy
stream_Block
stream_BlockRemaining
stream_Control
stream_Delete
stream_DemuxNew
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment