- current_offset = LE_32(&vmd->vmd_header[20]);
- current_frame_record = raw_frame_table;
- total_frames = vmd->frame_count;
- i = 0;
- while (total_frames--) {
-
- /* if the frame size is 0, do not count the frame and bring the
- * total frame count down */
- // note, we limit the size to 1Gb to ensure that we dont end up overflowing the size integer used to allocate the memory
- vmd->frame_table[i].frame_size = LE_32(¤t_frame_record[2]) & 0x3FFFFFFF;
-
- /* this logic is present so that 0-length audio chunks are not
- * accounted */
- if (!vmd->frame_table[i].frame_size) {
- vmd->frame_count--; /* one less frame to count */
- current_frame_record += BYTES_PER_FRAME_RECORD;
- continue;
+ total_frames = 0;
+ for (i = 0; i < vmd->frame_count; i++) {
+
+ current_offset = AV_RL32(&raw_frame_table[6 * i + 2]);
+
+ /* handle each entry in index block */
+ for (j = 0; j < vmd->frames_per_block; j++) {
+ int type;
+ uint32_t size;
+
+ avio_read(pb, chunk, BYTES_PER_FRAME_RECORD);
+ type = chunk[0];
+ size = AV_RL32(&chunk[2]);
+ if(!size && type != 1)
+ continue;
+ switch(type) {
+ case 1: /* Audio Chunk */
+ if (!st) break;
+ /* first audio chunk contains several audio buffers */
+ vmd->frame_table[total_frames].frame_offset = current_offset;
+ vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index;
+ vmd->frame_table[total_frames].frame_size = size;
+ memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD);
+ vmd->frame_table[total_frames].pts = current_audio_pts;
+ total_frames++;
+ if(!current_audio_pts)
+ current_audio_pts += sound_buffers - 1;
+ else
+ current_audio_pts++;
+ break;
+ case 2: /* Video Chunk */
+ 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;
+ memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD);
+ vmd->frame_table[total_frames].pts = i;
+ total_frames++;
+ break;
+ }
+ current_offset += size;