typedef struct vmd_frame {
int stream_index;
- int64_t frame_offset;
unsigned int frame_size;
+ int64_t frame_offset;
int64_t pts;
- int keyframe;
unsigned char frame_record[BYTES_PER_FRAME_RECORD];
} vmd_frame;
avpriv_set_pts_info(vst, 33, num, den);
avpriv_set_pts_info(st, 33, num, den);
}
+ if (!s->nb_streams)
+ return AVERROR_INVALIDDATA;
toc_offset = AV_RL32(&vmd->vmd_header[812]);
vmd->frame_count = AV_RL16(&vmd->vmd_header[6]);
vmd->frame_table = NULL;
sound_buffers = AV_RL16(&vmd->vmd_header[808]);
raw_frame_table_size = vmd->frame_count * 6;
- if(vmd->frame_count * vmd->frames_per_block >= UINT_MAX / sizeof(vmd_frame) - sound_buffers){
- av_log(s, AV_LOG_ERROR, "vmd->frame_count * vmd->frames_per_block too large\n");
- return -1;
- }
raw_frame_table = av_malloc(raw_frame_table_size);
vmd->frame_table = av_malloc_array(vmd->frame_count * vmd->frames_per_block + sound_buffers, sizeof(vmd_frame));
if (!raw_frame_table || !vmd->frame_table) {
current_audio_pts++;
break;
case 2: /* Video Chunk */
+ if (!vst)
+ break;
vmd->frame_table[total_frames].frame_offset = current_offset;
vmd->frame_table[total_frames].stream_index = vmd->video_stream_index;
vmd->frame_table[total_frames].frame_size = size;
return 0;
}
-AVInputFormat ff_vmd_demuxer = {
+const AVInputFormat ff_vmd_demuxer = {
.name = "vmd",
.long_name = NULL_IF_CONFIG_SMALL("Sierra VMD"),
.priv_data_size = sizeof(VmdDemuxContext),