|
|
|
@@ -88,7 +88,7 @@ static int vmd_read_header(AVFormatContext *s) |
|
|
|
unsigned char *raw_frame_table; |
|
|
|
int raw_frame_table_size; |
|
|
|
int64_t current_offset; |
|
|
|
int i, j; |
|
|
|
int i, j, ret; |
|
|
|
unsigned int total_frames; |
|
|
|
int64_t current_audio_pts = 0; |
|
|
|
unsigned char chunk[BYTES_PER_FRAME_RECORD]; |
|
|
|
@@ -175,15 +175,13 @@ static int vmd_read_header(AVFormatContext *s) |
|
|
|
raw_frame_table = av_malloc(raw_frame_table_size); |
|
|
|
vmd->frame_table = av_malloc((vmd->frame_count * vmd->frames_per_block + sound_buffers) * sizeof(vmd_frame)); |
|
|
|
if (!raw_frame_table || !vmd->frame_table) { |
|
|
|
av_free(raw_frame_table); |
|
|
|
av_free(vmd->frame_table); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
ret = AVERROR(ENOMEM); |
|
|
|
goto error; |
|
|
|
} |
|
|
|
if (avio_read(pb, raw_frame_table, raw_frame_table_size) != |
|
|
|
raw_frame_table_size) { |
|
|
|
av_free(raw_frame_table); |
|
|
|
av_free(vmd->frame_table); |
|
|
|
return AVERROR(EIO); |
|
|
|
ret = AVERROR(EIO); |
|
|
|
goto error; |
|
|
|
} |
|
|
|
|
|
|
|
total_frames = 0; |
|
|
|
@@ -199,6 +197,11 @@ static int vmd_read_header(AVFormatContext *s) |
|
|
|
avio_read(pb, chunk, BYTES_PER_FRAME_RECORD); |
|
|
|
type = chunk[0]; |
|
|
|
size = AV_RL32(&chunk[2]); |
|
|
|
if (size > INT_MAX / 2) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Invalid frame size\n"); |
|
|
|
ret = AVERROR_INVALIDDATA; |
|
|
|
goto error; |
|
|
|
} |
|
|
|
if(!size && type != 1) |
|
|
|
continue; |
|
|
|
switch(type) { |
|
|
|
@@ -235,6 +238,11 @@ static int vmd_read_header(AVFormatContext *s) |
|
|
|
vmd->frame_count = total_frames; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
error: |
|
|
|
av_free(raw_frame_table); |
|
|
|
av_free(vmd->frame_table); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static int vmd_read_packet(AVFormatContext *s, |
|
|
|
|