Commit 66f1e9dd authored by Jean-Paul Saman's avatar Jean-Paul Saman

Fix several memory leaks and do a bit of coding style cleanup.

parent 3143ebce
This diff is collapsed.
......@@ -183,9 +183,10 @@ static void rmff_dump_cont(rmff_cont_t *cont, char *buffer) {
cont->object_id=BE_32(&cont->object_id);
}
static void rmff_dump_dataheader(rmff_data_t *data, char *buffer) {
static void rmff_dump_dataheader(rmff_data_t *data, char *buffer)
{
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);
......@@ -246,11 +247,12 @@ void rmff_dump_pheader(rmff_pheader_t *h, char *data) {
data[11]=h->flags;
}
rmff_fileheader_t *rmff_new_fileheader(uint32_t num_headers) {
rmff_fileheader_t *rmff_new_fileheader(uint32_t num_headers)
{
rmff_fileheader_t *fileheader = malloc(sizeof(rmff_fileheader_t));
memset(fileheader, 0, sizeof(rmff_fileheader_t));
if( !filehandler ) return NULL;
memset(fileheader, 0, sizeof(rmff_fileheader_t));
fileheader->object_id=RMF_TAG;
fileheader->size=18;
fileheader->object_version=0;
......@@ -271,15 +273,15 @@ rmff_prop_t *rmff_new_prop (
uint32_t index_offset,
uint32_t data_offset,
uint16_t num_streams,
uint16_t flags ) {
uint16_t flags )
{
rmff_prop_t *prop = malloc(sizeof(rmff_prop_t));
memset(prop, 0, sizeof(rmff_prop_t));
if( !prop ) return NULL;
memset(prop, 0, sizeof(rmff_prop_t));
prop->object_id=PROP_TAG;
prop->size=50;
prop->object_version=0;
prop->max_bit_rate=max_bit_rate;
prop->avg_bit_rate=avg_bit_rate;
prop->max_packet_size=max_packet_size;
......@@ -307,14 +309,14 @@ rmff_mdpr_t *rmff_new_mdpr(
const char *stream_name,
const char *mime_type,
uint32_t type_specific_len,
const char *type_specific_data ) {
const char *type_specific_data )
{
rmff_mdpr_t *mdpr = malloc(sizeof(rmff_mdpr_t));
memset(mdpr, 0, sizeof(rmff_mdpr_t));
if( !mdpr ) return NULL;
memset(mdpr, 0, sizeof(rmff_mdpr_t));
mdpr->object_id=MDPR_TAG;
mdpr->object_version=0;
mdpr->stream_number=stream_number;
mdpr->max_bit_rate=max_bit_rate;
mdpr->avg_bit_rate=avg_bit_rate;
......@@ -324,69 +326,79 @@ rmff_mdpr_t *rmff_new_mdpr(
mdpr->preroll=preroll;
mdpr->duration=duration;
mdpr->stream_name_size=0;
if (stream_name) {
if (stream_name)
{
mdpr->stream_name=strdup(stream_name);
mdpr->stream_name_size=strlen(stream_name);
}
mdpr->mime_type_size=0;
if (mime_type) {
if (mime_type)
{
mdpr->mime_type=strdup(mime_type);
mdpr->mime_type_size=strlen(mime_type);
}
mdpr->type_specific_len=type_specific_len;
mdpr->type_specific_data = malloc(sizeof(char)*type_specific_len);
if( !mdpr->type_specific_data )
{
if( mdpr->stream_name ) free( mdpr->stream_name );
free( mdpr );
return NULL;
}
memcpy(mdpr->type_specific_data,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;
return mdpr;
}
rmff_cont_t *rmff_new_cont(const char *title, const char *author, const char *copyright, const char *comment) {
rmff_cont_t *rmff_new_cont(const char *title, const char *author, const char *copyright, const char *comment)
{
rmff_cont_t *cont = malloc(sizeof(rmff_cont_t));
memset(cont, 0, sizeof(rmff_cont_t));
if( !cont ) return NULL;
memset(cont, 0, sizeof(rmff_cont_t));
cont->object_id=CONT_TAG;
cont->object_version=0;
cont->title=NULL;
cont->author=NULL;
cont->copyright=NULL;
cont->comment=NULL;
cont->title_len=0;
cont->author_len=0;
cont->copyright_len=0;
cont->comment_len=0;
if (title) {
if (title)
{
cont->title_len=strlen(title);
cont->title=strdup(title);
}
if (author) {
if (author)
{
cont->author_len=strlen(author);
cont->author=strdup(author);
}
if (copyright) {
if (copyright)
{
cont->copyright_len=strlen(copyright);
cont->copyright=strdup(copyright);
}
if (comment) {
if (comment)
{
cont->comment_len=strlen(comment);
cont->comment=strdup(comment);
}
cont->size=cont->title_len+cont->author_len+cont->copyright_len+cont->comment_len+18;
return cont;
}
rmff_data_t *rmff_new_dataheader(uint32_t num_packets, uint32_t next_data_header) {
rmff_data_t *rmff_new_dataheader(uint32_t num_packets, uint32_t next_data_header)
{
rmff_data_t *data = malloc(sizeof(rmff_data_t));
memset(data, 0, sizeof(rmff_data_t));
if( !data ) return NULL;
memset(data, 0, sizeof(rmff_data_t));
data->object_id=DATA_TAG;
data->size=18;
data->object_version=0;
......@@ -396,11 +408,12 @@ rmff_data_t *rmff_new_dataheader(uint32_t num_packets, uint32_t next_data_header
return data;
}
void rmff_print_header(rmff_header_t *h) {
void rmff_print_header(rmff_header_t *h)
{
rmff_mdpr_t **stream;
if(!h) {
if(!h)
{
printf("rmff_print_header: NULL given\n");
return;
}
......@@ -460,21 +473,23 @@ void rmff_print_header(rmff_header_t *h) {
}
}
void rmff_fix_header(rmff_header_t *h) {
void rmff_fix_header(rmff_header_t *h)
{
int num_headers=0;
int header_size=0;
rmff_mdpr_t **streams;
int num_streams=0;
if (!h) {
if (!h)
{
lprintf("rmff_fix_header: fatal: no header given.\n");
return;
}
if (!h->streams) {
if (!h->streams)
{
lprintf("rmff_fix_header: warning: no MDPR chunks\n");
} else
}
else
{
streams=h->streams;
while (*streams)
......@@ -485,35 +500,36 @@ void rmff_fix_header(rmff_header_t *h) {
streams++;
}
}
if (h->prop) {
if (h->prop)
{
if (h->prop->size != 50)
{
lprintf("rmff_fix_header: correcting prop.size from %i to %i\n", h->prop->size, 50);
h->prop->size=50;
}
if (h->prop->num_streams != num_streams)
{
lprintf("rmff_fix_header: correcting prop.num_streams from %i to %i\n", h->prop->num_streams, num_streams);
h->prop->num_streams=num_streams;
}
num_headers++;
header_size+=50;
} else
lprintf("rmff_fix_header: warning: no PROP chunk.\n");
}
else lprintf("rmff_fix_header: warning: no PROP chunk.\n");
if (h->cont) {
if (h->cont)
{
num_headers++;
header_size+=h->cont->size;
} else
lprintf("rmff_fix_header: warning: no CONT chunk.\n");
}
else lprintf("rmff_fix_header: warning: no CONT chunk.\n");
if (!h->data) {
if (!h->data)
{
lprintf("rmff_fix_header: no DATA chunk, creating one\n");
h->data = malloc(sizeof(rmff_data_t));
if( h->data )
{
memset(h->data, 0, sizeof(rmff_data_t));
h->data->object_id=DATA_TAG;
h->data->object_version=0;
......@@ -521,13 +537,15 @@ void rmff_fix_header(rmff_header_t *h) {
h->data->num_packets=0;
h->data->next_data_header=0;
}
}
num_headers++;
if (!h->fileheader) {
if (!h->fileheader)
{
lprintf("rmff_fix_header: no fileheader, creating one");
h->fileheader = malloc(sizeof(rmff_fileheader_t));
if( h->fileheader )
{
memset(h->fileheader, 0, sizeof(rmff_fileheader_t));
h->fileheader->object_id=RMF_TAG;
h->fileheader->size=34;
......@@ -535,51 +553,47 @@ void rmff_fix_header(rmff_header_t *h) {
h->fileheader->file_version=0;
h->fileheader->num_headers=num_headers+1;
}
}
header_size+=h->fileheader->size;
num_headers++;
if(h->fileheader->num_headers != num_headers) {
if(h->fileheader->num_headers != num_headers)
{
lprintf("rmff_fix_header: setting num_headers from %i to %i\n", h->fileheader->num_headers, num_headers);
h->fileheader->num_headers=num_headers;
}
if(h->prop) {
if (h->prop->data_offset != header_size) {
if(h->prop)
{
if (h->prop->data_offset != header_size)
{
lprintf("rmff_fix_header: setting prop.data_offset from %i to %i\n", h->prop->data_offset, header_size);
h->prop->data_offset=header_size;
}
if (h->prop->num_packets == 0) {
if (h->prop->num_packets == 0)
{
int p=(int)(h->prop->avg_bit_rate/8.0*(h->prop->duration/1000.0)/h->prop->avg_packet_size);
lprintf("rmff_fix_header: assuming prop.num_packets=%i\n", p);
h->prop->num_packets=p;
}
if (h->data->num_packets == 0) {
if (h->data->num_packets == 0)
{
lprintf("rmff_fix_header: assuming data.num_packets=%i\n", h->prop->num_packets);
h->data->num_packets=h->prop->num_packets;
}
lprintf("rmff_fix_header: assuming data.size=%i\n", h->prop->num_packets*h->prop->avg_packet_size);
h->data->size=h->prop->num_packets*h->prop->avg_packet_size;
}
}
int rmff_get_header_size(rmff_header_t *h) {
int rmff_get_header_size(rmff_header_t *h)
{
if (!h) return 0;
if (!h->prop) return -1;
return h->prop->data_offset+18;
}
void rmff_free_header(rmff_header_t *h) {
void rmff_free_header(rmff_header_t *h)
{
if (!h) return;
if (h->fileheader) free(h->fileheader);
......@@ -597,7 +611,8 @@ void rmff_free_header(rmff_header_t *h) {
{
rmff_mdpr_t **s=h->streams;
while(*s) {
while(*s)
{
free((*s)->stream_name);
free((*s)->mime_type);
free((*s)->type_specific_data);
......
......@@ -82,7 +82,6 @@ typedef struct {
uint32_t data_offset;
uint16_t num_streams;
uint16_t flags;
} rmff_prop_t;
typedef struct {
......
......@@ -51,16 +51,17 @@ static char *b64_decode(const char *in, char *out, int *size)
dtable['='] = 0;
k=0;
/*CONSTANTCONDITION*/
for (j=0; j<strlen(in); j+=4)
{
char a[4], b[4];
for (i = 0; i < 4; i++) {
for (i = 0; i < 4; i++)
{
int c = in[i+j];
if (dtable[c] & 0x80) {
if (dtable[c] & 0x80)
{
printf("Illegal character '%c' in input.\n", c);
exit(1);
}
......@@ -72,7 +73,8 @@ static char *b64_decode(const char *in, char *out, int *size)
out[k++] = (b[1] << 4) | (b[2] >> 2);
out[k++] = (b[2] << 6) | b[3];
i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
if (i < 3) {
if (i < 3)
{
out[k]=0;
*size=k;
return out;
......@@ -83,14 +85,14 @@ static char *b64_decode(const char *in, char *out, int *size)
return out;
}
static char *nl(char *data) {
static char *nl(char *data)
{
char *nlptr = (data) ? strchr(data,'\n') : NULL;
return (nlptr) ? nlptr + 1 : NULL;
}
static int filter(const char *in, const char *filter, char **out) {
static int filter(const char *in, const char *filter, char **out)
{
int flen=strlen(filter);
int len;
......@@ -98,7 +100,6 @@ static int filter(const char *in, const char *filter, char **out) {
return 0;
len = (strchr(in,'\n')) ? strchr(in,'\n')-in : strlen(in);
if (!strncmp(in,filter,flen))
{
if(in[flen]=='"') flen++;
......@@ -106,91 +107,96 @@ static int filter(const char *in, const char *filter, char **out) {
if(in[len-1]=='"') len--;
memcpy(*out, in+flen, len-flen+1);
(*out)[len-flen]=0;
return len-flen;
}
return 0;
}
static sdpplin_stream_t *sdpplin_parse_stream(char **data) {
static sdpplin_stream_t *sdpplin_parse_stream(char **data)
{
sdpplin_stream_t *desc = malloc(sizeof(sdpplin_stream_t));
char *buf=malloc(32000);
char *decoded=malloc(32000);
char *buf = malloc(32000);
char *decoded = malloc(32000);
int handled;
if( !desc ) goto error;
memset(desc, 0, sizeof(sdpplin_stream_t));
if (filter(*data, "m=", &buf)) {
if (filter(*data, "m=", &buf))
{
desc->id = strdup(buf);
} else
}
else
{
lprintf("sdpplin: no m= found.\n");
free(desc);
free(buf);
if( decoded ) free(decoded);
if( desc ) free( desc );
if( buf ) free( buf );
return NULL;
}
*data=nl(*data);
while (*data && **data && *data[0]!='m') {
while (*data && **data && *data[0]!='m')
{
handled=0;
if(filter(*data,"a=control:streamid=",&buf)) {
if(filter(*data,"a=control:streamid=",&buf))
{
desc->stream_id=atoi(buf);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=MaxBitRate:integer;",&buf)) {
if(filter(*data,"a=MaxBitRate:integer;",&buf))
{
desc->max_bit_rate=atoi(buf);
if (!desc->avg_bit_rate)
desc->avg_bit_rate=desc->max_bit_rate;
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=MaxPacketSize:integer;",&buf)) {
if(filter(*data,"a=MaxPacketSize:integer;",&buf))
{
desc->max_packet_size=atoi(buf);
if (!desc->avg_packet_size)
desc->avg_packet_size=desc->max_packet_size;
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=StartTime:integer;",&buf)) {
if(filter(*data,"a=StartTime:integer;",&buf))
{
desc->start_time=atoi(buf);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=Preroll:integer;",&buf)) {
if(filter(*data,"a=Preroll:integer;",&buf))
{
desc->preroll=atoi(buf);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=length:npt=",&buf)) {
if(filter(*data,"a=length:npt=",&buf))
{
desc->duration=(uint32_t)(atof(buf)*1000);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=StreamName:string;",&buf)) {
if(filter(*data,"a=StreamName:string;",&buf))
{
desc->stream_name=strdup(buf);
desc->stream_name_size=strlen(desc->stream_name);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=mimetype:string;",&buf)) {
if(filter(*data,"a=mimetype:string;",&buf))
{
desc->mime_type=strdup(buf);
desc->mime_type_size=strlen(desc->mime_type);
handled=1;
*data=nl(*data);
}
if(filter(*data,"a=OpaqueData:buffer;",&buf)) {
if(filter(*data,"a=OpaqueData:buffer;",&buf))
{
decoded = b64_decode(buf, decoded, &(desc->mlti_data_size));
desc->mlti_data = malloc(sizeof(char)*desc->mlti_data_size);
memcpy(desc->mlti_data, decoded, desc->mlti_data_size);
......@@ -198,14 +204,15 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) {
*data=nl(*data);
lprintf("mlti_data_size: %i\n", desc->mlti_data_size);
}
if(filter(*data,"a=ASMRuleBook:string;",&buf)) {
if(filter(*data,"a=ASMRuleBook:string;",&buf))
{
desc->asm_rule_book=strdup(buf);
handled=1;
*data=nl(*data);
}
if(!handled) {
if(!handled)
{
#ifdef LOG
int len=strchr(*data,'\n')-(*data);
memcpy(buf, *data, len+1);
......@@ -215,15 +222,13 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) {
*data=nl(*data);
}
}
free(buf);
free(decoded);
if( buf ) free(buf);
if( decoded )free(decoded);
return desc;
}
sdpplin_t *sdpplin_parse(char *data) {
sdpplin_t *sdpplin_parse(char *data)
{
sdpplin_t *desc = malloc(sizeof(sdpplin_t));
sdpplin_stream_t *stream;
char *buf=malloc(3200);
......@@ -231,61 +236,75 @@ sdpplin_t *sdpplin_parse(char *data) {
int handled;
int len;
if( !desc ) return NULL;
if( !buf )
{
free( desc );
return NULL;
}
if( !decoded )
{
free( buf );
free( desc );
return NULL;
}
memset(desc, 0, sizeof(sdpplin_t));
while (data && *data) {
while (data && *data)
{
handled=0;
if (filter(data, "m=", &buf)) {
if (filter(data, "m=", &buf))
{
stream=sdpplin_parse_stream(&data);
lprintf("got data for stream id %u\n", stream->stream_id);
desc->stream[stream->stream_id]=stream;
continue;
}
if(filter(data,"a=Title:buffer;",&buf)) {
if(filter(data,"a=Title:buffer;",&buf))
{
decoded=b64_decode(buf, decoded, &len);
desc->title=strdup(decoded);
handled=1;
data=nl(data);
}
if(filter(data,"a=Author:buffer;",&buf)) {
if(filter(data,"a=Author:buffer;",&buf))
{
decoded=b64_decode(buf, decoded, &len);
desc->author=strdup(decoded);
handled=1;
data=nl(data);
}
if(filter(data,"a=Copyright:buffer;",&buf)) {
if(filter(data,"a=Copyright:buffer;",&buf))
{
decoded=b64_decode(buf, decoded, &len);
desc->copyright=strdup(decoded);
handled=1;
data=nl(data);
}
if(filter(data,"a=Abstract:buffer;",&buf)) {
if(filter(data,"a=Abstract:buffer;",&buf))
{
decoded=b64_decode(buf, decoded, &len);
desc->abstract=strdup(decoded);
handled=1;
data=nl(data);
}
if(filter(data,"a=StreamCount:integer;",&buf)) {
if(filter(data,"a=StreamCount:integer;",&buf))
{
desc->stream_count=atoi(buf);
desc->stream = malloc(sizeof(sdpplin_stream_t*)*desc->stream_count);
handled=1;
data=nl(data);
}
if(filter(data,"a=Flags:integer;",&buf)) {
if(filter(data,"a=Flags:integer;",&buf))
{
desc->flags=atoi(buf);
handled=1;
data=nl(data);
}
if(!handled) {
if(!handled)
{
#ifdef LOG
int len=strchr(data,'\n')-data;
memcpy(buf, data, len+1);
......@@ -296,15 +315,13 @@ sdpplin_t *sdpplin_parse(char *data) {
}
}
free(buf);
free(decoded);
free(buf);
return desc;
}
void sdpplin_free(sdpplin_t *description) {
void sdpplin_free(sdpplin_t *description)
{
/* TODO: free strings */
free(description);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment