|
|
|
@@ -317,7 +317,9 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap) |
|
|
|
char *token, *value; |
|
|
|
char quote; |
|
|
|
|
|
|
|
p = strings = av_mallocz(strings_size + 1); |
|
|
|
p = strings = av_mallocz((size_t)strings_size + 1); |
|
|
|
if (!p) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
endp = strings + strings_size; |
|
|
|
get_buffer(pb, strings, strings_size); |
|
|
|
while (p < endp) { |
|
|
|
@@ -351,6 +353,8 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap) |
|
|
|
if((unsigned)table_entries >= UINT_MAX / sizeof(uint32_t)) |
|
|
|
return -1; |
|
|
|
nsv->nsvf_index_data = av_malloc(table_entries * sizeof(uint32_t)); |
|
|
|
if (!nsv->nsvf_index_data) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
#warning "FIXME: Byteswap buffer as needed" |
|
|
|
get_buffer(pb, (unsigned char *)nsv->nsvf_index_data, table_entries * sizeof(uint32_t)); |
|
|
|
} |
|
|
|
@@ -507,11 +511,16 @@ static int nsv_read_header(AVFormatContext *s, AVFormatParameters *ap) |
|
|
|
for (i = 0; i < NSV_MAX_RESYNC_TRIES; i++) { |
|
|
|
if (nsv_resync(s) < 0) |
|
|
|
return -1; |
|
|
|
if (nsv->state == NSV_FOUND_NSVF) |
|
|
|
if (nsv->state == NSV_FOUND_NSVF) { |
|
|
|
err = nsv_parse_NSVf_header(s, ap); |
|
|
|
if (err < 0) |
|
|
|
return err; |
|
|
|
} |
|
|
|
/* we need the first NSVs also... */ |
|
|
|
if (nsv->state == NSV_FOUND_NSVS) { |
|
|
|
err = nsv_parse_NSVs_header(s, ap); |
|
|
|
if (err < 0) |
|
|
|
return err; |
|
|
|
break; /* we just want the first one */ |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -586,12 +595,12 @@ null_chunk_retry: |
|
|
|
} |
|
|
|
|
|
|
|
/* map back streams to v,a */ |
|
|
|
if (s->streams[0]) |
|
|
|
if (s->nb_streams > 0) |
|
|
|
st[s->streams[0]->id] = s->streams[0]; |
|
|
|
if (s->streams[1]) |
|
|
|
if (s->nb_streams > 1) |
|
|
|
st[s->streams[1]->id] = s->streams[1]; |
|
|
|
|
|
|
|
if (vsize/* && st[NSV_ST_VIDEO]*/) { |
|
|
|
if (vsize && st[NSV_ST_VIDEO]) { |
|
|
|
nst = st[NSV_ST_VIDEO]->priv_data; |
|
|
|
pkt = &nsv->ahead[NSV_ST_VIDEO]; |
|
|
|
av_get_packet(pb, pkt, vsize); |
|
|
|
@@ -606,7 +615,7 @@ null_chunk_retry: |
|
|
|
if(st[NSV_ST_VIDEO]) |
|
|
|
((NSVStream*)st[NSV_ST_VIDEO]->priv_data)->frame_offset++; |
|
|
|
|
|
|
|
if (asize/*st[NSV_ST_AUDIO]*/) { |
|
|
|
if (asize && st[NSV_ST_AUDIO]) { |
|
|
|
nst = st[NSV_ST_AUDIO]->priv_data; |
|
|
|
pkt = &nsv->ahead[NSV_ST_AUDIO]; |
|
|
|
/* read raw audio specific header on the first audio chunk... */ |
|
|
|
|