Mercurial > mplayer.hg
comparison libmpdemux/demux_avi.c @ 6056:f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
author | arpi |
---|---|
date | Sun, 12 May 2002 01:51:09 +0000 |
parents | 80256840ff29 |
children | 2d3d4c628ece |
comparison
equal
deleted
inserted
replaced
6055:3ca1f8cf7bfc | 6056:f980563afdbc |
---|---|
44 return demux->video; | 44 return demux->video; |
45 } | 45 } |
46 if(id!=mmioFOURCC('J','U','N','K')){ | 46 if(id!=mmioFOURCC('J','U','N','K')){ |
47 // unknown | 47 // unknown |
48 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Unknown chunk: %.4s (%X)\n",(char *) &id,id); | 48 mp_msg(MSGT_DEMUX,MSGL_DBG2,"Unknown chunk: %.4s (%X)\n",(char *) &id,id); |
49 //abort(); | |
49 } | 50 } |
50 return NULL; | 51 return NULL; |
51 } | 52 } |
52 | 53 |
53 static int valid_fourcc(unsigned int id){ | 54 static int valid_fourcc(unsigned int id){ |
171 return 0; | 172 return 0; |
172 } | 173 } |
173 if(stream_eof(demux->stream)) return 0; | 174 if(stream_eof(demux->stream)) return 0; |
174 #endif | 175 #endif |
175 if(priv->idx_size>0 && priv->idx_pos<priv->idx_size){ | 176 if(priv->idx_size>0 && priv->idx_pos<priv->idx_size){ |
176 unsigned int pos; | 177 off_t pos; |
177 | 178 |
178 //if(priv->idx_pos<0) printf("Fatal! idx_pos=%d\n",priv->idx_pos); | 179 //if(priv->idx_pos<0) printf("Fatal! idx_pos=%d\n",priv->idx_pos); |
179 | 180 |
180 idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; | 181 idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; |
181 | 182 |
191 if(!demux_avi_select_stream(demux,idx->ckid)){ | 192 if(!demux_avi_select_stream(demux,idx->ckid)){ |
192 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); | 193 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); |
193 continue; // skip this chunk | 194 continue; // skip this chunk |
194 } | 195 } |
195 | 196 |
196 pos=idx->dwChunkOffset+priv->idx_offset; | 197 pos = priv->idx_offset + (unsigned long)idx->dwChunkOffset; |
197 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ | 198 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ |
198 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%X \n",pos); | 199 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%X \n",pos); |
199 continue; | 200 continue; |
200 } | 201 } |
201 #if 0 | 202 #if 0 |
232 } | 233 } |
233 id=stream_read_dword_le(demux->stream); | 234 id=stream_read_dword_le(demux->stream); |
234 len=stream_read_dword_le(demux->stream); | 235 len=stream_read_dword_le(demux->stream); |
235 if(stream_eof(demux->stream)) return 0; // EOF! | 236 if(stream_eof(demux->stream)) return 0; // EOF! |
236 | 237 |
237 if(id==mmioFOURCC('L','I','S','T')){ | 238 if(id==mmioFOURCC('L','I','S','T') || id==mmioFOURCC('R', 'I', 'F', 'F')){ |
238 id=stream_read_dword_le(demux->stream); // list type | 239 id=stream_read_dword_le(demux->stream); // list or RIFF type |
239 continue; | 240 continue; |
240 } | 241 } |
241 } | 242 } |
242 ret=demux_avi_read_packet(demux,id,len,priv->idx_pos-1,flags); | 243 ret=demux_avi_read_packet(demux,id,len,priv->idx_pos-1,flags); |
243 // if(!ret && priv->skip_video_frames<=0) | 244 // if(!ret && priv->skip_video_frames<=0) |
270 if(ds==demux->video) idx_pos=priv->idx_pos_v++; else | 271 if(ds==demux->video) idx_pos=priv->idx_pos_v++; else |
271 if(ds==demux->audio) idx_pos=priv->idx_pos_a++; else | 272 if(ds==demux->audio) idx_pos=priv->idx_pos_a++; else |
272 idx_pos=priv->idx_pos++; | 273 idx_pos=priv->idx_pos++; |
273 | 274 |
274 if(priv->idx_size>0 && idx_pos<priv->idx_size){ | 275 if(priv->idx_size>0 && idx_pos<priv->idx_size){ |
275 unsigned int pos; | 276 off_t pos; |
276 idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; | 277 idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; |
277 // idx=&priv->idx[idx_pos]; | 278 // idx=&priv->idx[idx_pos]; |
278 | 279 |
279 if(idx->dwFlags&AVIIF_LIST){ | 280 if(idx->dwFlags&AVIIF_LIST){ |
280 // LIST | 281 // LIST |
283 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ | 284 if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ |
284 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); | 285 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); |
285 continue; // skip this chunk | 286 continue; // skip this chunk |
286 } | 287 } |
287 | 288 |
288 pos=idx->dwChunkOffset+priv->idx_offset; | 289 pos = priv->idx_offset+(unsigned long)idx->dwChunkOffset; |
289 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ | 290 if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start)){ |
290 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); | 291 mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos); |
291 continue; | 292 continue; |
292 } | 293 } |
293 #if 0 | 294 #if 0 |
336 int demux_avi_fill_buffer_nini(demuxer_t *demux,demux_stream_t* ds){ | 337 int demux_avi_fill_buffer_nini(demuxer_t *demux,demux_stream_t* ds){ |
337 avi_priv_t *priv=demux->priv; | 338 avi_priv_t *priv=demux->priv; |
338 unsigned int id=0; | 339 unsigned int id=0; |
339 unsigned int len; | 340 unsigned int len; |
340 int ret=0; | 341 int ret=0; |
341 int *fpos=NULL; | 342 off_t *fpos=NULL; |
342 | 343 |
343 if(ds==demux->video) fpos=&priv->idx_pos_v; else | 344 if(ds==demux->video) fpos=&priv->idx_pos_v; else |
344 if(ds==demux->audio) fpos=&priv->idx_pos_a; else | 345 if(ds==demux->audio) fpos=&priv->idx_pos_a; else |
345 return 0; | 346 return 0; |
346 | 347 |
357 | 358 |
358 id=stream_read_dword_le(demux->stream); | 359 id=stream_read_dword_le(demux->stream); |
359 len=stream_read_dword_le(demux->stream); | 360 len=stream_read_dword_le(demux->stream); |
360 if(id==mmioFOURCC('L','I','S','T')){ | 361 if(id==mmioFOURCC('L','I','S','T')){ |
361 id=stream_read_dword_le(demux->stream); // list type | 362 id=stream_read_dword_le(demux->stream); // list type |
363 continue; | |
364 } | |
365 | |
366 if(id==mmioFOURCC('R','I','F','F')){ | |
367 printf("additional RIFF header...\n"); | |
368 id=stream_read_dword_le(demux->stream); // "AVIX" | |
362 continue; | 369 continue; |
363 } | 370 } |
364 | 371 |
365 if(ds==demux_avi_select_stream(demux,id)){ | 372 if(ds==demux_avi_select_stream(demux,id)){ |
366 // read it! | 373 // read it! |
418 priv->idx_pos_a=0; | 425 priv->idx_pos_a=0; |
419 priv->idx_pos_v=0; | 426 priv->idx_pos_v=0; |
420 if(priv->idx_size>1){ | 427 if(priv->idx_size>1){ |
421 // decide index format: | 428 // decide index format: |
422 #if 1 | 429 #if 1 |
423 if(((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start || | 430 if((unsigned long)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start || |
424 ((AVIINDEXENTRY *)priv->idx)[1].dwChunkOffset<demuxer->movi_start) | 431 (unsigned long)((AVIINDEXENTRY *)priv->idx)[1].dwChunkOffset<demuxer->movi_start) |
425 priv->idx_offset=demuxer->movi_start-4; | 432 priv->idx_offset=demuxer->movi_start-4; |
426 else | 433 else |
427 priv->idx_offset=0; | 434 priv->idx_offset=0; |
428 #else | 435 #else |
429 if(((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start) | 436 if((unsigned long)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset<demuxer->movi_start) |
430 priv->idx_offset=demuxer->movi_start-4; | 437 priv->idx_offset=demuxer->movi_start-4; |
431 else | 438 else |
432 priv->idx_offset=0; | 439 priv->idx_offset=0; |
433 #endif | 440 #endif |
434 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", | 441 mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", |
439 // demuxer->endpos=avi_header.movi_end; | 446 // demuxer->endpos=avi_header.movi_end; |
440 | 447 |
441 if(priv->idx_size>0){ | 448 if(priv->idx_size>0){ |
442 // check that file is non-interleaved: | 449 // check that file is non-interleaved: |
443 int i; | 450 int i; |
444 int a_pos=-1; | 451 off_t a_pos=-1; |
445 int v_pos=-1; | 452 off_t v_pos=-1; |
446 for(i=0;i<priv->idx_size;i++){ | 453 for(i=0;i<priv->idx_size;i++){ |
447 AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)priv->idx)[i]; | 454 AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)priv->idx)[i]; |
448 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid); | 455 demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid); |
449 int pos=idx->dwChunkOffset+priv->idx_offset; | 456 off_t pos = priv->idx_offset + (unsigned long)idx->dwChunkOffset; |
450 if(a_pos==-1 && ds==demuxer->audio){ | 457 if(a_pos==-1 && ds==demuxer->audio){ |
451 a_pos=pos; | 458 a_pos=pos; |
452 if(v_pos!=-1) break; | 459 if(v_pos!=-1) break; |
453 } | 460 } |
454 if(v_pos==-1 && ds==demuxer->video){ | 461 if(v_pos==-1 && ds==demuxer->video){ |
502 sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; | 509 sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
503 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | 510 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
504 // calculating video bitrate: | 511 // calculating video bitrate: |
505 sh_video->i_bps=demuxer->movi_end-demuxer->movi_start-priv->idx_size*8; | 512 sh_video->i_bps=demuxer->movi_end-demuxer->movi_start-priv->idx_size*8; |
506 if(sh_audio) sh_video->i_bps-=sh_audio->audio.dwLength; | 513 if(sh_audio) sh_video->i_bps-=sh_audio->audio.dwLength; |
507 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video length=%d\n",sh_video->i_bps); | 514 mp_msg(MSGT_DEMUX,MSGL_V,"AVI video length=%lu\n",(unsigned long)sh_video->i_bps); |
508 sh_video->i_bps=((float)sh_video->i_bps/(float)sh_video->video.dwLength)*sh_video->fps; | 515 sh_video->i_bps=((float)sh_video->i_bps/(float)sh_video->video.dwLength)*sh_video->fps; |
509 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %ldx%ld %dbpp %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n", | 516 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %ldx%ld %dbpp %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n", |
510 (char *)&sh_video->bih->biCompression, | 517 (char *)&sh_video->bih->biCompression, |
511 sh_video->bih->biWidth, | 518 sh_video->bih->biWidth, |
512 sh_video->bih->biHeight, | 519 sh_video->bih->biHeight, |