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.
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
) {
64 free(((uint8_t*)buf
)-XBUFFER_HEADER_SIZE
);
71 void *xbuffer_copyin(void *buf
, int index
, const void *data
, int len
) {
76 buf
= xbuffer_ensure_size(buf
, index
+len
);
77 memcpy(((uint8_t*)buf
)+index
, data
, len
);
84 void *xbuffer_ensure_size(void *buf
, int size
) {
85 xbuffer_header_t
*xbuf
;
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
;
106 void *xbuffer_strcat(void *buf
, char *data
) {
112 buf
= xbuffer_ensure_size(buf
, strlen(buf
)+strlen(data
)+1);