21
21
static MainAVIHeader avih;
23
extern void print_avih(MainAVIHeader *h);
24
extern void print_avih_flags(MainAVIHeader *h);
25
extern void print_strh(AVIStreamHeader *h);
26
extern void print_wave_header(WAVEFORMATEX *h);
27
extern void print_video_header(BITMAPINFOHEADER *h);
28
extern void print_index(AVIINDEXENTRY *idx,int idx_size);
29
extern void print_avistdindex_chunk(avistdindex_chunk *h);
30
extern void print_avisuperindex_chunk(avisuperindex_chunk *h);
31
extern void print_vprp(VideoPropHeader *vprp);
23
extern void print_avih(MainAVIHeader *h, int verbose_level);
24
extern void print_avih_flags(MainAVIHeader *h, int verbose_level);
25
extern void print_strh(AVIStreamHeader *h, int verbose_level);
26
extern void print_wave_header(WAVEFORMATEX *h, int verbose_level);
27
extern void print_video_header(BITMAPINFOHEADER *h, int verbose_level);
28
extern void print_index(AVIINDEXENTRY *idx,int idx_size, int verbose_level);
29
extern void print_avistdindex_chunk(avistdindex_chunk *h, int verbose_level);
30
extern void print_avisuperindex_chunk(avisuperindex_chunk *h, int verbose_level);
31
extern void print_vprp(VideoPropHeader *vprp, int verbose_level);
33
33
static int odml_get_vstream_id(int id, unsigned char res[])
185
185
stream_read(demuxer->stream,(char*) &avih,MIN(size2,sizeof(avih)));
186
186
le2me_MainAVIHeader(&avih); // swap to machine endian
187
187
chunksize-=MIN(size2,sizeof(avih));
188
if(verbose>0) print_avih(&avih); // else print_avih_flags(&avih);
188
if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_avih(&avih,MSGL_V); // else print_avih_flags(&avih,MSGL_V);
190
190
case ckidSTREAMHEADER: { // read 'strh'
191
191
AVIStreamHeader h;
202
202
memcpy(&sh_audio->audio,&h,sizeof(h));
204
204
last_fccType=h.fccType;
205
if(verbose>=1) print_strh(&h);
205
if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_strh(&h,MSGL_V);
207
207
case mmioFOURCC('i', 'n', 'd', 'x'): {
210
209
avisuperindex_chunk *s;
211
213
priv->suidx_size++;
212
priv->suidx = realloc(priv->suidx, priv->suidx_size * sizeof (avisuperindex_chunk));
214
priv->suidx = realloc_struct(priv->suidx, priv->suidx_size, sizeof (avisuperindex_chunk));
213
215
s = &priv->suidx[priv->suidx_size-1];
223
225
stream_read(demuxer->stream, (char *)s->dwReserved, 3*4);
224
226
memset(s->dwReserved, 0, 3*4);
226
print_avisuperindex_chunk(s);
228
print_avisuperindex_chunk(s,MSGL_V);
230
if( ((chunksize/4)/s->wLongsPerEntry) < s->nEntriesInUse){
231
mp_msg (MSGT_HEADER, MSGL_WARN, "Broken super index chunk\n");
232
s->nEntriesInUse = (chunksize/4)/s->wLongsPerEntry;
228
msize = sizeof (uint32_t) * s->wLongsPerEntry * s->nEntriesInUse;
229
s->aIndex = malloc(msize);
230
memset (s->aIndex, 0, msize);
231
s->stdidx = malloc (s->nEntriesInUse * sizeof (avistdindex_chunk));
232
memset (s->stdidx, 0, s->nEntriesInUse * sizeof (avistdindex_chunk));
235
// Check and fix this useless crap
236
if(s->wLongsPerEntry != sizeof (avisuperindex_entry)/4) {
237
mp_msg (MSGT_HEADER, MSGL_WARN, "Broken super index chunk size: %u\n",s->wLongsPerEntry);
238
s->wLongsPerEntry = sizeof(avisuperindex_entry)/4;
240
s->aIndex = calloc(s->nEntriesInUse, sizeof (avisuperindex_entry));
241
s->stdidx = calloc(s->nEntriesInUse, sizeof (avistdindex_chunk));
234
243
// now the real index of indices
235
244
for (i=0; i<s->nEntriesInUse; i++) {
254
263
// fixup MS-RLE header (seems to be broken for <256 color files)
255
264
if(sh_video->bih->biCompression<=1 && sh_video->bih->biSize==40)
256
265
sh_video->bih->biSize=chunksize;
257
if(verbose>=1) print_video_header(sh_video->bih);
266
if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_video->bih,MSGL_V);
259
268
// sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
260
269
// sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
309
318
sh_audio->wf=realloc(sh_audio->wf, sizeof(WAVEFORMATEX)+sh_audio->wf->cbSize);
312
if(verbose>=1) print_wave_header(sh_audio->wf);
321
if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V);
313
322
++priv->audio_streams;
314
323
// if(demuxer->audio->id==-1) demuxer->audio->id=stream_id;
368
377
entry->dwFlags&=0xffff;
370
379
chunksize-=priv->idx_size<<4;
371
if(verbose>=2) print_index(priv->idx,priv->idx_size);
380
if( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx,priv->idx_size,MSGL_DBG2);
374
383
/* added May 2002 */
467
476
le2me_AVISTDIDXCHUNK(&cx->stdidx[j]);
468
print_avistdindex_chunk(&cx->stdidx[j]);
477
print_avistdindex_chunk(&cx->stdidx[j],MSGL_V);
469
478
priv->idx_size += cx->stdidx[j].nEntriesInUse;
470
479
cx->stdidx[j].aIndex = malloc(cx->stdidx[j].nEntriesInUse*sizeof(avistdindex_entry));
471
480
stream_read(demuxer->stream, (char *)cx->stdidx[j].aIndex,
542
if (verbose>=2) print_index(priv->idx, priv->idx_size);
551
if ( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx, priv->idx_size,MSGL_DBG2);
544
553
demuxer->movi_end=demuxer->stream->end_pos;
678
689
priv->idx_size=priv->idx_pos;
679
690
mp_msg(MSGT_HEADER,MSGL_INFO,MSGTR_MPDEMUX_AVIHDR_IdxGeneratedForHowManyChunks,priv->idx_size);
680
if(verbose>=2) print_index(priv->idx,priv->idx_size);
691
if( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx,priv->idx_size,MSGL_DBG2);
682
693
/* Write generated index to a file */
683
694
if (index_file_save) {