/*
* 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;
}