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,