diff options
Diffstat (limited to 'src/input/libreal/rmff.c')
-rw-r--r-- | src/input/libreal/rmff.c | 417 |
1 files changed, 220 insertions, 197 deletions
diff --git a/src/input/libreal/rmff.c b/src/input/libreal/rmff.c index 0c4ee2ccd..1600e967a 100644 --- a/src/input/libreal/rmff.c +++ b/src/input/libreal/rmff.c @@ -15,9 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - * - * $Id: rmff.c,v 1.8 2006/06/20 01:07:58 dgp85 Exp $ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * functions for real media file format * adopted from joschkas real tools @@ -29,56 +27,61 @@ #define LOG */ -#include "xineutils.h" +#include <xine/xineutils.h> +#include "bswap.h" #include "rmff.h" -#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) -#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \ - (((uint8_t*)(x))[1] << 16) | \ - (((uint8_t*)(x))[2] << 8) | \ - ((uint8_t*)(x))[3]) - /* * writes header data to a buffer */ -static void rmff_dump_fileheader(rmff_fileheader_t *fileheader, char *buffer) { +static int rmff_dump_fileheader(rmff_fileheader_t *fileheader, uint8_t *buffer, int bufsize) { + + if (!fileheader) return 0; - if (!fileheader) return; - fileheader->object_id=BE_32(&fileheader->object_id); - fileheader->size=BE_32(&fileheader->size); - fileheader->object_version=BE_16(&fileheader->object_version); - fileheader->file_version=BE_32(&fileheader->file_version); - fileheader->num_headers=BE_32(&fileheader->num_headers); + if (bufsize < RMFF_FILEHEADER_SIZE) + return -1; + + fileheader->object_id=_X_BE_32(&fileheader->object_id); + fileheader->size=_X_BE_32(&fileheader->size); + fileheader->object_version=_X_BE_16(&fileheader->object_version); + fileheader->file_version=_X_BE_32(&fileheader->file_version); + fileheader->num_headers=_X_BE_32(&fileheader->num_headers); memcpy(buffer, fileheader, 8); memcpy(&buffer[8], &fileheader->object_version, 2); memcpy(&buffer[10], &fileheader->file_version, 8); - fileheader->size=BE_32(&fileheader->size); - fileheader->object_version=BE_16(&fileheader->object_version); - fileheader->file_version=BE_32(&fileheader->file_version); - fileheader->num_headers=BE_32(&fileheader->num_headers); - fileheader->object_id=BE_32(&fileheader->object_id); + fileheader->size=_X_BE_32(&fileheader->size); + fileheader->object_version=_X_BE_16(&fileheader->object_version); + fileheader->file_version=_X_BE_32(&fileheader->file_version); + fileheader->num_headers=_X_BE_32(&fileheader->num_headers); + fileheader->object_id=_X_BE_32(&fileheader->object_id); + + return RMFF_FILEHEADER_SIZE; } -static void rmff_dump_prop(rmff_prop_t *prop, char *buffer) { - - if (!prop) return; - prop->object_id=BE_32(&prop->object_id); - prop->size=BE_32(&prop->size); - prop->object_version=BE_16(&prop->object_version); - prop->max_bit_rate=BE_32(&prop->max_bit_rate); - prop->avg_bit_rate=BE_32(&prop->avg_bit_rate); - prop->max_packet_size=BE_32(&prop->max_packet_size); - prop->avg_packet_size=BE_32(&prop->avg_packet_size); - prop->num_packets=BE_32(&prop->num_packets); - prop->duration=BE_32(&prop->duration); - prop->preroll=BE_32(&prop->preroll); - prop->index_offset=BE_32(&prop->index_offset); - prop->data_offset=BE_32(&prop->data_offset); - prop->num_streams=BE_16(&prop->num_streams); - prop->flags=BE_16(&prop->flags); +static int rmff_dump_prop(rmff_prop_t *prop, uint8_t *buffer, int bufsize) { + + if (!prop) return 0; + + if (bufsize < RMFF_PROPHEADER_SIZE) + return -1; + + prop->object_id=_X_BE_32(&prop->object_id); + prop->size=_X_BE_32(&prop->size); + prop->object_version=_X_BE_16(&prop->object_version); + prop->max_bit_rate=_X_BE_32(&prop->max_bit_rate); + prop->avg_bit_rate=_X_BE_32(&prop->avg_bit_rate); + prop->max_packet_size=_X_BE_32(&prop->max_packet_size); + prop->avg_packet_size=_X_BE_32(&prop->avg_packet_size); + prop->num_packets=_X_BE_32(&prop->num_packets); + prop->duration=_X_BE_32(&prop->duration); + prop->preroll=_X_BE_32(&prop->preroll); + prop->index_offset=_X_BE_32(&prop->index_offset); + prop->data_offset=_X_BE_32(&prop->data_offset); + prop->num_streams=_X_BE_16(&prop->num_streams); + prop->flags=_X_BE_16(&prop->flags); memcpy(buffer, prop, 8); memcpy(&buffer[8], &prop->object_version, 2); @@ -86,38 +89,44 @@ static void rmff_dump_prop(rmff_prop_t *prop, char *buffer) { memcpy(&buffer[46], &prop->num_streams, 2); memcpy(&buffer[48], &prop->flags, 2); - prop->size=BE_32(&prop->size); - prop->object_version=BE_16(&prop->object_version); - prop->max_bit_rate=BE_32(&prop->max_bit_rate); - prop->avg_bit_rate=BE_32(&prop->avg_bit_rate); - prop->max_packet_size=BE_32(&prop->max_packet_size); - prop->avg_packet_size=BE_32(&prop->avg_packet_size); - prop->num_packets=BE_32(&prop->num_packets); - prop->duration=BE_32(&prop->duration); - prop->preroll=BE_32(&prop->preroll); - prop->index_offset=BE_32(&prop->index_offset); - prop->data_offset=BE_32(&prop->data_offset); - prop->num_streams=BE_16(&prop->num_streams); - prop->flags=BE_16(&prop->flags); - prop->object_id=BE_32(&prop->object_id); + prop->size=_X_BE_32(&prop->size); + prop->object_version=_X_BE_16(&prop->object_version); + prop->max_bit_rate=_X_BE_32(&prop->max_bit_rate); + prop->avg_bit_rate=_X_BE_32(&prop->avg_bit_rate); + prop->max_packet_size=_X_BE_32(&prop->max_packet_size); + prop->avg_packet_size=_X_BE_32(&prop->avg_packet_size); + prop->num_packets=_X_BE_32(&prop->num_packets); + prop->duration=_X_BE_32(&prop->duration); + prop->preroll=_X_BE_32(&prop->preroll); + prop->index_offset=_X_BE_32(&prop->index_offset); + prop->data_offset=_X_BE_32(&prop->data_offset); + prop->num_streams=_X_BE_16(&prop->num_streams); + prop->flags=_X_BE_16(&prop->flags); + prop->object_id=_X_BE_32(&prop->object_id); + + return RMFF_PROPHEADER_SIZE; } -static void rmff_dump_mdpr(rmff_mdpr_t *mdpr, char *buffer) { +static int rmff_dump_mdpr(rmff_mdpr_t *mdpr, uint8_t *buffer, int bufsize) { int s1, s2, s3; - if (!mdpr) return; - mdpr->object_id=BE_32(&mdpr->object_id); - mdpr->size=BE_32(&mdpr->size); - mdpr->object_version=BE_16(&mdpr->object_version); - mdpr->stream_number=BE_16(&mdpr->stream_number); - mdpr->max_bit_rate=BE_32(&mdpr->max_bit_rate); - mdpr->avg_bit_rate=BE_32(&mdpr->avg_bit_rate); - mdpr->max_packet_size=BE_32(&mdpr->max_packet_size); - mdpr->avg_packet_size=BE_32(&mdpr->avg_packet_size); - mdpr->start_time=BE_32(&mdpr->start_time); - mdpr->preroll=BE_32(&mdpr->preroll); - mdpr->duration=BE_32(&mdpr->duration); + if (!mdpr) return 0; + + if (bufsize < RMFF_MDPRHEADER_SIZE + mdpr->type_specific_len + mdpr->stream_name_size + mdpr->mime_type_size) + return -1; + + mdpr->object_id=_X_BE_32(&mdpr->object_id); + mdpr->size=_X_BE_32(&mdpr->size); + mdpr->object_version=_X_BE_16(&mdpr->object_version); + mdpr->stream_number=_X_BE_16(&mdpr->stream_number); + mdpr->max_bit_rate=_X_BE_32(&mdpr->max_bit_rate); + mdpr->avg_bit_rate=_X_BE_32(&mdpr->avg_bit_rate); + mdpr->max_packet_size=_X_BE_32(&mdpr->max_packet_size); + mdpr->avg_packet_size=_X_BE_32(&mdpr->avg_packet_size); + mdpr->start_time=_X_BE_32(&mdpr->start_time); + mdpr->preroll=_X_BE_32(&mdpr->preroll); + mdpr->duration=_X_BE_32(&mdpr->duration); memcpy(buffer, mdpr, 8); memcpy(&buffer[8], &mdpr->object_version, 2); @@ -131,113 +140,138 @@ static void rmff_dump_mdpr(rmff_mdpr_t *mdpr, char *buffer) { s2=mdpr->mime_type_size; memcpy(&buffer[42+s1], mdpr->mime_type, s2); - mdpr->type_specific_len=BE_32(&mdpr->type_specific_len); + mdpr->type_specific_len=_X_BE_32(&mdpr->type_specific_len); memcpy(&buffer[42+s1+s2], &mdpr->type_specific_len, 4); - mdpr->type_specific_len=BE_32(&mdpr->type_specific_len); + mdpr->type_specific_len=_X_BE_32(&mdpr->type_specific_len); s3=mdpr->type_specific_len; memcpy(&buffer[46+s1+s2], mdpr->type_specific_data, s3); - mdpr->size=BE_32(&mdpr->size); - mdpr->stream_number=BE_16(&mdpr->stream_number); - mdpr->max_bit_rate=BE_32(&mdpr->max_bit_rate); - mdpr->avg_bit_rate=BE_32(&mdpr->avg_bit_rate); - mdpr->max_packet_size=BE_32(&mdpr->max_packet_size); - mdpr->avg_packet_size=BE_32(&mdpr->avg_packet_size); - mdpr->start_time=BE_32(&mdpr->start_time); - mdpr->preroll=BE_32(&mdpr->preroll); - mdpr->duration=BE_32(&mdpr->duration); - mdpr->object_id=BE_32(&mdpr->object_id); - + mdpr->size=_X_BE_32(&mdpr->size); + mdpr->stream_number=_X_BE_16(&mdpr->stream_number); + mdpr->max_bit_rate=_X_BE_32(&mdpr->max_bit_rate); + mdpr->avg_bit_rate=_X_BE_32(&mdpr->avg_bit_rate); + mdpr->max_packet_size=_X_BE_32(&mdpr->max_packet_size); + mdpr->avg_packet_size=_X_BE_32(&mdpr->avg_packet_size); + mdpr->start_time=_X_BE_32(&mdpr->start_time); + mdpr->preroll=_X_BE_32(&mdpr->preroll); + mdpr->duration=_X_BE_32(&mdpr->duration); + mdpr->object_id=_X_BE_32(&mdpr->object_id); + + return RMFF_MDPRHEADER_SIZE + s1 + s2 + s3; } -static void rmff_dump_cont(rmff_cont_t *cont, char *buffer) { +static int rmff_dump_cont(rmff_cont_t *cont, uint8_t *buffer, int bufsize) { int p; - if (!cont) return; - cont->object_id=BE_32(&cont->object_id); - cont->size=BE_32(&cont->size); - cont->object_version=BE_16(&cont->object_version); + if (!cont) return 0; + + if (bufsize < RMFF_CONTHEADER_SIZE + cont->title_len + cont->author_len + + cont->copyright_len + cont->comment_len) + return -1; + + cont->object_id=_X_BE_32(&cont->object_id); + cont->size=_X_BE_32(&cont->size); + cont->object_version=_X_BE_16(&cont->object_version); memcpy(buffer, cont, 8); memcpy(&buffer[8], &cont->object_version, 2); - cont->title_len=BE_16(&cont->title_len); + cont->title_len=_X_BE_16(&cont->title_len); memcpy(&buffer[10], &cont->title_len, 2); - cont->title_len=BE_16(&cont->title_len); + cont->title_len=_X_BE_16(&cont->title_len); memcpy(&buffer[12], cont->title, cont->title_len); p=12+cont->title_len; - cont->author_len=BE_16(&cont->author_len); + cont->author_len=_X_BE_16(&cont->author_len); memcpy(&buffer[p], &cont->author_len, 2); - cont->author_len=BE_16(&cont->author_len); + cont->author_len=_X_BE_16(&cont->author_len); memcpy(&buffer[p+2], cont->author, cont->author_len); p+=2+cont->author_len; - cont->copyright_len=BE_16(&cont->copyright_len); + cont->copyright_len=_X_BE_16(&cont->copyright_len); memcpy(&buffer[p], &cont->copyright_len, 2); - cont->copyright_len=BE_16(&cont->copyright_len); + cont->copyright_len=_X_BE_16(&cont->copyright_len); memcpy(&buffer[p+2], cont->copyright, cont->copyright_len); p+=2+cont->copyright_len; - cont->comment_len=BE_16(&cont->comment_len); + cont->comment_len=_X_BE_16(&cont->comment_len); memcpy(&buffer[p], &cont->comment_len, 2); - cont->comment_len=BE_16(&cont->comment_len); + cont->comment_len=_X_BE_16(&cont->comment_len); memcpy(&buffer[p+2], cont->comment, cont->comment_len); - cont->size=BE_32(&cont->size); - cont->object_version=BE_16(&cont->object_version); - cont->object_id=BE_32(&cont->object_id); + cont->size=_X_BE_32(&cont->size); + cont->object_version=_X_BE_16(&cont->object_version); + cont->object_id=_X_BE_32(&cont->object_id); + + return RMFF_CONTHEADER_SIZE + cont->title_len + cont->author_len + + cont->copyright_len + cont->comment_len; } -static void rmff_dump_dataheader(rmff_data_t *data, char *buffer) { +static int rmff_dump_dataheader(rmff_data_t *data, uint8_t *buffer, int bufsize) { + + if (!data) return 0; + + if (bufsize < RMFF_DATAHEADER_SIZE) + return -1; - if (!data) return; - data->object_id=BE_32(&data->object_id); - data->size=BE_32(&data->size); - data->object_version=BE_16(&data->object_version); - data->num_packets=BE_32(&data->num_packets); - data->next_data_header=BE_32(&data->next_data_header); + data->object_id=_X_BE_32(&data->object_id); + data->size=_X_BE_32(&data->size); + data->object_version=_X_BE_16(&data->object_version); + data->num_packets=_X_BE_32(&data->num_packets); + data->next_data_header=_X_BE_32(&data->next_data_header); memcpy(buffer, data, 8); memcpy(&buffer[8], &data->object_version, 2); memcpy(&buffer[10], &data->num_packets, 8); - data->num_packets=BE_32(&data->num_packets); - data->next_data_header=BE_32(&data->next_data_header); - data->size=BE_32(&data->size); - data->object_version=BE_16(&data->object_version); - data->object_id=BE_32(&data->object_id); + data->num_packets=_X_BE_32(&data->num_packets); + data->next_data_header=_X_BE_32(&data->next_data_header); + data->size=_X_BE_32(&data->size); + data->object_version=_X_BE_16(&data->object_version); + data->object_id=_X_BE_32(&data->object_id); + + return RMFF_DATAHEADER_SIZE; } -int rmff_dump_header(rmff_header_t *h, char *buffer, int max) { +int rmff_dump_header(rmff_header_t *h, void *buf_gen, int max) { + uint8_t *buffer = buf_gen; - int written=0; + int written=0, size; rmff_mdpr_t **stream=h->streams; - rmff_dump_fileheader(h->fileheader, &buffer[written]); - written+=h->fileheader->size; - rmff_dump_prop(h->prop, &buffer[written]); - written+=h->prop->size; - rmff_dump_cont(h->cont, &buffer[written]); - written+=h->cont->size; + if ((size=rmff_dump_fileheader(h->fileheader, &buffer[written], max)) < 0) + return -1; + written+=size; + max -= size; + if ((size=rmff_dump_prop(h->prop, &buffer[written], max)) < 0) + return -1; + written+=size; + max -= size; + if ((size=rmff_dump_cont(h->cont, &buffer[written], max)) < 0) + return -1; + written+=size; + max -= size; if (stream) { while(*stream) { - rmff_dump_mdpr(*stream, &buffer[written]); - written+=(*stream)->size; + if ((size=rmff_dump_mdpr(*stream, &buffer[written], max)) < 0) + return -1; + written+=size; + max -= size; stream++; } } - rmff_dump_dataheader(h->data, &buffer[written]); - written+=18; + if ((size=rmff_dump_dataheader(h->data, &buffer[written], max)) < 0) + return -1; + written+=size; return written; } -void rmff_dump_pheader(rmff_pheader_t *h, char *data) { +void rmff_dump_pheader(rmff_pheader_t *h, uint8_t *data) { data[0]=(h->object_version>>8) & 0xff; data[1]=h->object_version & 0xff; @@ -257,15 +291,15 @@ static rmff_fileheader_t *rmff_scan_fileheader(const char *data) { rmff_fileheader_t *fileheader = malloc(sizeof(rmff_fileheader_t)); - fileheader->object_id=BE_32(data); - fileheader->size=BE_32(&data[4]); - fileheader->object_version=BE_16(&data[8]); + fileheader->object_id=_X_BE_32(data); + fileheader->size=_X_BE_32(&data[4]); + fileheader->object_version=_X_BE_16(&data[8]); if (fileheader->object_version != 0) { lprintf("warning: unknown object version in .RMF: 0x%04x\n", fileheader->object_version); } - fileheader->file_version=BE_32(&data[10]); - fileheader->num_headers=BE_32(&data[14]); + fileheader->file_version=_X_BE_32(&data[10]); + fileheader->num_headers=_X_BE_32(&data[14]); return fileheader; } @@ -274,24 +308,24 @@ static rmff_prop_t *rmff_scan_prop(const char *data) { rmff_prop_t *prop = malloc(sizeof(rmff_prop_t)); - prop->object_id=BE_32(data); - prop->size=BE_32(&data[4]); - prop->object_version=BE_16(&data[8]); + prop->object_id=_X_BE_32(data); + prop->size=_X_BE_32(&data[4]); + prop->object_version=_X_BE_16(&data[8]); if (prop->object_version != 0) { lprintf("warning: unknown object version in PROP: 0x%04x\n", prop->object_version); } - prop->max_bit_rate=BE_32(&data[10]); - prop->avg_bit_rate=BE_32(&data[14]); - prop->max_packet_size=BE_32(&data[18]); - prop->avg_packet_size=BE_32(&data[22]); - prop->num_packets=BE_32(&data[26]); - prop->duration=BE_32(&data[30]); - prop->preroll=BE_32(&data[34]); - prop->index_offset=BE_32(&data[38]); - prop->data_offset=BE_32(&data[42]); - prop->num_streams=BE_16(&data[46]); - prop->flags=BE_16(&data[48]); + prop->max_bit_rate=_X_BE_32(&data[10]); + prop->avg_bit_rate=_X_BE_32(&data[14]); + prop->max_packet_size=_X_BE_32(&data[18]); + prop->avg_packet_size=_X_BE_32(&data[22]); + prop->num_packets=_X_BE_32(&data[26]); + prop->duration=_X_BE_32(&data[30]); + prop->preroll=_X_BE_32(&data[34]); + prop->index_offset=_X_BE_32(&data[38]); + prop->data_offset=_X_BE_32(&data[42]); + prop->num_streams=_X_BE_16(&data[46]); + prop->flags=_X_BE_16(&data[48]); return prop; } @@ -300,36 +334,30 @@ static rmff_mdpr_t *rmff_scan_mdpr(const char *data) { rmff_mdpr_t *mdpr = malloc(sizeof(rmff_mdpr_t)); - mdpr->object_id=BE_32(data); - mdpr->size=BE_32(&data[4]); - mdpr->object_version=BE_16(&data[8]); + mdpr->object_id=_X_BE_32(data); + mdpr->size=_X_BE_32(&data[4]); + mdpr->object_version=_X_BE_16(&data[8]); if (mdpr->object_version != 0) { lprintf("warning: unknown object version in MDPR: 0x%04x\n", mdpr->object_version); } - mdpr->stream_number=BE_16(&data[10]); - mdpr->max_bit_rate=BE_32(&data[12]); - mdpr->avg_bit_rate=BE_32(&data[16]); - mdpr->max_packet_size=BE_32(&data[20]); - mdpr->avg_packet_size=BE_32(&data[24]); - mdpr->start_time=BE_32(&data[28]); - mdpr->preroll=BE_32(&data[32]); - mdpr->duration=BE_32(&data[36]); + mdpr->stream_number=_X_BE_16(&data[10]); + mdpr->max_bit_rate=_X_BE_32(&data[12]); + mdpr->avg_bit_rate=_X_BE_32(&data[16]); + mdpr->max_packet_size=_X_BE_32(&data[20]); + mdpr->avg_packet_size=_X_BE_32(&data[24]); + mdpr->start_time=_X_BE_32(&data[28]); + mdpr->preroll=_X_BE_32(&data[32]); + mdpr->duration=_X_BE_32(&data[36]); mdpr->stream_name_size=data[40]; - mdpr->stream_name = malloc(sizeof(char)*(mdpr->stream_name_size+1)); - memcpy(mdpr->stream_name, &data[41], mdpr->stream_name_size); - mdpr->stream_name[mdpr->stream_name_size]=0; + mdpr->stream_name = xine_memdup0(&data[41], mdpr->stream_name_size); mdpr->mime_type_size=data[41+mdpr->stream_name_size]; - mdpr->mime_type = malloc(sizeof(char)*(mdpr->mime_type_size+1)); - memcpy(mdpr->mime_type, &data[42+mdpr->stream_name_size], mdpr->mime_type_size); - mdpr->mime_type[mdpr->mime_type_size]=0; + mdpr->mime_type = xine_memdup0(&data[42+mdpr->stream_name_size], mdpr->mime_type_size); - mdpr->type_specific_len=BE_32(&data[42+mdpr->stream_name_size+mdpr->mime_type_size]); - mdpr->type_specific_data = malloc(sizeof(char)*(mdpr->type_specific_len)); - memcpy(mdpr->type_specific_data, - &data[46+mdpr->stream_name_size+mdpr->mime_type_size], mdpr->type_specific_len); + mdpr->type_specific_len=_X_BE_32(&data[42+mdpr->stream_name_size+mdpr->mime_type_size]); + mdpr->type_specific_data = xine_memdup(&data[46+mdpr->stream_name_size+mdpr->mime_type_size], mdpr->type_specific_len); return mdpr; } @@ -339,32 +367,25 @@ static rmff_cont_t *rmff_scan_cont(const char *data) { rmff_cont_t *cont = malloc(sizeof(rmff_cont_t)); int pos; - cont->object_id=BE_32(data); - cont->size=BE_32(&data[4]); - cont->object_version=BE_16(&data[8]); + cont->object_id=_X_BE_32(data); + cont->size=_X_BE_32(&data[4]); + cont->object_version=_X_BE_16(&data[8]); if (cont->object_version != 0) { lprintf("warning: unknown object version in CONT: 0x%04x\n", cont->object_version); } - cont->title_len=BE_16(&data[10]); - cont->title = malloc(sizeof(char)*(cont->title_len+1)); - memcpy(cont->title, &data[12], cont->title_len); - cont->title[cont->title_len]=0; + cont->title_len=_X_BE_16(&data[10]); + cont->title = xine_memdup0(&data[12], cont->title_len); pos=cont->title_len+12; - cont->author_len=BE_16(&data[pos]); - cont->author = malloc(sizeof(char)*(cont->author_len+1)); - memcpy(cont->author, &data[pos+2], cont->author_len); - cont->author[cont->author_len]=0; + cont->author_len=_X_BE_16(&data[pos]); + cont->author = xine_memdup0(&data[pos+2], cont->author_len); pos=pos+2+cont->author_len; - cont->copyright_len=BE_16(&data[pos]); - cont->copyright = malloc(sizeof(char)*(cont->copyright_len+1)); - memcpy(cont->copyright, &data[pos+2], cont->copyright_len); + cont->copyright_len=_X_BE_16(&data[pos]); + cont->copyright = xine_memdup0(&data[pos+2], cont->copyright_len); cont->copyright[cont->copyright_len]=0; pos=pos+2+cont->copyright_len; - cont->comment_len=BE_16(&data[pos]); - cont->comment = malloc(sizeof(char)*(cont->comment_len+1)); - memcpy(cont->comment, &data[pos+2], cont->comment_len); - cont->comment[cont->comment_len]=0; + cont->comment_len=_X_BE_16(&data[pos]); + cont->comment = xine_memdup0(&data[pos+2], cont->comment_len); return cont; } @@ -373,15 +394,15 @@ static rmff_data_t *rmff_scan_dataheader(const char *data) { rmff_data_t *dh = malloc(sizeof(rmff_data_t)); - dh->object_id=BE_32(data); - dh->size=BE_32(&data[4]); - dh->object_version=BE_16(&data[8]); + dh->object_id=_X_BE_32(data); + dh->size=_X_BE_32(&data[4]); + dh->object_version=_X_BE_16(&data[8]); if (dh->object_version != 0) { lprintf("warning: unknown object version in DATA: 0x%04x\n", dh->object_version); } - dh->num_packets=BE_32(&data[10]); - dh->next_data_header=BE_32(&data[14]); + dh->num_packets=_X_BE_32(&data[10]); + dh->next_data_header=_X_BE_32(&data[14]); return dh; } @@ -400,7 +421,7 @@ rmff_header_t *rmff_scan_header(const char *data) { header->cont=NULL; header->data=NULL; - chunk_type = BE_32(ptr); + chunk_type = _X_BE_32(ptr); if (chunk_type != RMF_TAG) { lprintf("rmff: not an real media file header (.RMF tag not found).\n"); @@ -410,13 +431,10 @@ rmff_header_t *rmff_scan_header(const char *data) { header->fileheader=rmff_scan_fileheader(ptr); ptr += header->fileheader->size; - header->streams = malloc(sizeof(rmff_mdpr_t*)*(header->fileheader->num_headers)); - for (i=0; i<header->fileheader->num_headers; i++) { - header->streams[i]=NULL; - } + header->streams = calloc(header->fileheader->num_headers, sizeof(rmff_mdpr_t*)); for (i=1; i<header->fileheader->num_headers; i++) { - chunk_type = BE_32(ptr); + chunk_type = _X_BE_32(ptr); if (ptr[0] == 0) { @@ -457,6 +475,7 @@ rmff_header_t *rmff_scan_header(const char *data) { return header; } +#if 0 rmff_header_t *rmff_scan_header_stream(int fd) { rmff_header_t *header; @@ -468,8 +487,8 @@ rmff_header_t *rmff_scan_header_stream(int fd) { do { xine_buffer_ensure_size(buf, index+8); read(fd, buf+index, 8); - chunk_type=BE_32(buf+index); index+=4; - chunk_size=BE_32(buf+index); index+=4; + chunk_type=_X_BE_32(buf+index); index+=4; + chunk_size=_X_BE_32(buf+index); index+=4; switch (chunk_type) { case DATA_TAG: @@ -500,13 +519,14 @@ rmff_header_t *rmff_scan_header_stream(int fd) { void rmff_scan_pheader(rmff_pheader_t *h, char *data) { - h->object_version=BE_16(data); - h->length=BE_16(data+2); - h->stream_number=BE_16(data+4); - h->timestamp=BE_32(data+6); + h->object_version=_X_BE_16(data); + h->length=_X_BE_16(data+2); + h->stream_number=_X_BE_16(data+4); + h->timestamp=_X_BE_32(data+6); h->reserved=(uint8_t)data[10]; h->flags=(uint8_t)data[11]; } +#endif rmff_fileheader_t *rmff_new_fileheader(uint32_t num_headers) { @@ -593,8 +613,7 @@ rmff_mdpr_t *rmff_new_mdpr( mdpr->mime_type_size=strlen(mime_type); } mdpr->type_specific_len=type_specific_len; - mdpr->type_specific_data = malloc(sizeof(char)*type_specific_len); - memcpy(mdpr->type_specific_data,type_specific_data,type_specific_len); + mdpr->type_specific_data = xine_memdup(type_specific_data,type_specific_len); mdpr->mlti_data=NULL; mdpr->size=mdpr->stream_name_size+mdpr->mime_type_size+mdpr->type_specific_len+46; @@ -653,6 +672,7 @@ rmff_data_t *rmff_new_dataheader(uint32_t num_packets, uint32_t next_data_header return data; } +#if 0 void rmff_print_header(rmff_header_t *h) { rmff_mdpr_t **stream; @@ -719,6 +739,7 @@ void rmff_print_header(rmff_header_t *h) { printf("next DATA : 0x%08x\n", h->data->next_data_header); } } +#endif void rmff_fix_header(rmff_header_t *h) { @@ -827,6 +848,7 @@ void rmff_fix_header(rmff_header_t *h) { } } +#if 0 int rmff_get_header_size(rmff_header_t *h) { if (!h) return 0; @@ -866,3 +888,4 @@ void rmff_free_header(rmff_header_t *h) { } free(h); } +#endif |