vf_stereo3d: Add stereo3d filter
[mplayer/glamo.git] / stream / realrtsp / xbuffer.c
blob5db88b4b416b3816c822c08b681a820521ef3c80
1 /*
2 * xbuffer code
4 * Includes a minimalistic replacement for xine_buffer functions used in
5 * Real streaming code. Only function needed by this code are implemented.
7 * Most code comes from xine_buffer.c Copyright (C) 2002 the xine project
9 * WARNING: do not mix original xine_buffer functions with this code!
10 * xbuffers behave like xine_buffers, but are not byte-compatible with them.
11 * You must take care of pointers returned by xbuffers functions (no macro to
12 * do it automatically)
14 * This file is part of MPlayer.
16 * MPlayer is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
21 * MPlayer is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
26 * You should have received a copy of the GNU General Public License along
27 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
28 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31 #include <stdlib.h>
32 #include <string.h>
33 #include <inttypes.h>
34 #include "xbuffer.h"
37 typedef struct {
38 uint32_t size;
39 uint32_t chunk_size;
40 } xbuffer_header_t;
42 #define XBUFFER_HEADER_SIZE sizeof (xbuffer_header_t)
46 void *xbuffer_init(int chunk_size) {
47 uint8_t *data=calloc(1,chunk_size+XBUFFER_HEADER_SIZE);
49 xbuffer_header_t *header=(xbuffer_header_t*)data;
51 header->size=chunk_size;
52 header->chunk_size=chunk_size;
54 return data+XBUFFER_HEADER_SIZE;
59 void *xbuffer_free(void *buf) {
60 if (!buf) {
61 return NULL;
64 free(((uint8_t*)buf)-XBUFFER_HEADER_SIZE);
66 return NULL;
71 void *xbuffer_copyin(void *buf, int index, const void *data, int len) {
72 if (!buf || !data) {
73 return NULL;
76 buf = xbuffer_ensure_size(buf, index+len);
77 memcpy(((uint8_t*)buf)+index, data, len);
79 return buf;
84 void *xbuffer_ensure_size(void *buf, int size) {
85 xbuffer_header_t *xbuf;
86 int new_size;
88 if (!buf) {
89 return 0;
92 xbuf = ((xbuffer_header_t*)(((uint8_t*)buf)-XBUFFER_HEADER_SIZE));
94 if (xbuf->size < size) {
95 new_size = size + xbuf->chunk_size - (size % xbuf->chunk_size);
96 xbuf->size = new_size;
97 buf = ((uint8_t*)realloc(((uint8_t*)buf)-XBUFFER_HEADER_SIZE,
98 new_size+XBUFFER_HEADER_SIZE)) + XBUFFER_HEADER_SIZE;
101 return buf;
106 void *xbuffer_strcat(void *buf, char *data) {
108 if (!buf || !data) {
109 return NULL;
112 buf = xbuffer_ensure_size(buf, strlen(buf)+strlen(data)+1);
114 strcat(buf, data);
116 return buf;