[vlc-commits] Added stream_BlockRemaining() helper.
Laurent Aimar
git at videolan.org
Sat Jan 7 01:22:23 CET 2012
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | 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
More information about the vlc-commits
mailing list