summaryrefslogtreecommitdiff
path: root/src/input/libreal/rmff.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/libreal/rmff.c')
-rw-r--r--src/input/libreal/rmff.c417
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