/* * Copyright (C) 2000-2002 the xine project * All this code is stolen from xine and is therefore covered by the GNU Licence This file contains the minimum necessary stuff from xine for the rtsp/real stuff to work. */ #include #include #include #include #include #include "xineutils.h" #include "xine_buffer.h" void *xine_xmalloc(size_t size) { void *ptr; /* prevent xine_xmalloc(0) of possibly returning NULL */ if( !size ) size++; if((ptr = calloc(1, size)) == NULL) { fprintf(stderr, "malloc() failed: %s.\n", strerror(errno)); return NULL; } return ptr; } typedef struct { uint32_t size; uint32_t chunk_size; uint8_t magic; } xine_buffer_header_t; #define XINE_BUFFER_HEADER_SIZE 9 #define XINE_BUFFER_MAGIC 42 #define GET_HEADER(x) ((xine_buffer_header_t*)(((uint8_t*)x)-XINE_BUFFER_HEADER_SIZE)) #define GROW_TO(buf, to_size) \ if (GET_HEADER(buf)->size < (to_size)) { \ int new_size = (to_size) + GET_HEADER(buf)->chunk_size - \ ((to_size) % GET_HEADER(buf)->chunk_size);\ \ buf = ((uint8_t*)realloc(((uint8_t*)buf)-XINE_BUFFER_HEADER_SIZE, new_size+XINE_BUFFER_HEADER_SIZE)) + XINE_BUFFER_HEADER_SIZE;\ GET_HEADER(buf)->size=new_size; } void *xine_buffer_init(int chunk_size) { uint8_t *data=xine_xmalloc(chunk_size+XINE_BUFFER_HEADER_SIZE); xine_buffer_header_t *header=(xine_buffer_header_t*)data; header->size=chunk_size; header->chunk_size=chunk_size; header->magic=XINE_BUFFER_MAGIC; return data+XINE_BUFFER_HEADER_SIZE; } void *_xine_buffer_ensure_size(void *buf, int size) { if (!buf) return 0; GROW_TO(buf, size); return buf; } void *_xine_buffer_free(void *buf) { if (buf) free(((uint8_t*)buf)-XINE_BUFFER_HEADER_SIZE); return NULL; } void *_xine_buffer_copyin(void *buf, int index, const void *data, int len) { if (!buf || !data) return NULL; GROW_TO(buf, index+len); memcpy(((uint8_t*)buf)+index, data, len); return buf; }