diff options
author | ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-07-31 17:39:17 +0000 |
---|---|---|
committer | ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-07-31 17:39:17 +0000 |
commit | 49867bd432352d19172ab26cf873bd5651e69e25 (patch) | |
tree | c2d419bb4f81564036baa12832a44b8aac27c6d1 /stream/realrtsp/xbuffer.c | |
parent | d3b998da64927403879ad588287c178f86b7c849 (diff) | |
download | mpv-49867bd432352d19172ab26cf873bd5651e69e25.tar.bz2 mpv-49867bd432352d19172ab26cf873bd5651e69e25.tar.xz |
introduce new 'stream' directory for all stream layer related components and split them from libmpdemux
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19277 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream/realrtsp/xbuffer.c')
-rw-r--r-- | stream/realrtsp/xbuffer.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/stream/realrtsp/xbuffer.c b/stream/realrtsp/xbuffer.c new file mode 100644 index 0000000000..de68125ef1 --- /dev/null +++ b/stream/realrtsp/xbuffer.c @@ -0,0 +1,102 @@ +/* + * xbuffer code + * + * Includes a minimalistic replacement for xine_buffer functions used in + * Real streaming code. Only function needed by this code are implemented. + * + * Most code comes from xine_buffer.c Copyright (C) 2002 the xine project + * + * WARNING: do not mix original xine_buffer functions with this code! + * xbuffers behave like xine_buffers, but are not byte-compatible with them. + * You must take care of pointers returned by xbuffers functions (no macro to + * do it automatically) + * + */ + +#include <stdlib.h> +#include <string.h> +#include <inttypes.h> +#include "xbuffer.h" + + +typedef struct { + uint32_t size; + uint32_t chunk_size; +} xbuffer_header_t; + +#define XBUFFER_HEADER_SIZE sizeof (xbuffer_header_t) + + + +void *xbuffer_init(int chunk_size) { + uint8_t *data=calloc(1,chunk_size+XBUFFER_HEADER_SIZE); + + xbuffer_header_t *header=(xbuffer_header_t*)data; + + header->size=chunk_size; + header->chunk_size=chunk_size; + + return data+XBUFFER_HEADER_SIZE; +} + + + +void *xbuffer_free(void *buf) { + if (!buf) { + return NULL; + } + + free(((uint8_t*)buf)-XBUFFER_HEADER_SIZE); + + return NULL; +} + + + +void *xbuffer_copyin(void *buf, int index, const void *data, int len) { + if (!buf || !data) { + return NULL; + } + + buf = xbuffer_ensure_size(buf, index+len); + memcpy(((uint8_t*)buf)+index, data, len); + + return buf; +} + + + +void *xbuffer_ensure_size(void *buf, int size) { + xbuffer_header_t *xbuf; + int new_size; + + if (!buf) { + return 0; + } + + xbuf = ((xbuffer_header_t*)(((uint8_t*)buf)-XBUFFER_HEADER_SIZE)); + + if (xbuf->size < size) { + new_size = size + xbuf->chunk_size - (size % xbuf->chunk_size); + xbuf->size = new_size; + buf = ((uint8_t*)realloc(((uint8_t*)buf)-XBUFFER_HEADER_SIZE, + new_size+XBUFFER_HEADER_SIZE)) + XBUFFER_HEADER_SIZE; + } + + return buf; +} + + + +void *xbuffer_strcat(void *buf, char *data) { + + if (!buf || !data) { + return NULL; + } + + buf = xbuffer_ensure_size(buf, strlen(buf)+strlen(data)+1); + + strcat(buf, data); + + return buf; +} |