comparison mplayer.c @ 1296:32f5d26baf86

mpeg2 timing & fps fix for ffmpeg12 codec
author arpi
date Sun, 08 Jul 2001 13:11:01 +0000
parents f1199bd41d81
children fa50e6bc6091
comparison
equal deleted inserted replaced
1295:f1199bd41d81 1296:32f5d26baf86
460 #endif 460 #endif
461 char* title="MPlayer"; 461 char* title="MPlayer";
462 462
463 // movie info: 463 // movie info:
464 int out_fmt=0; 464 int out_fmt=0;
465 //int user_bpp=0;
466 465
467 int osd_visible=100; 466 int osd_visible=100;
468 int osd_function=OSD_PLAY; 467 int osd_function=OSD_PLAY;
469 int osd_last_pts=-303; 468 int osd_last_pts=-303;
470 469
581 } 580 }
582 /*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/ 581 /*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/
583 582
584 // check codec.conf 583 // check codec.conf
585 if(!parse_codec_cfg(get_path("codecs.conf"))){ 584 if(!parse_codec_cfg(get_path("codecs.conf"))){
586 printf("(copy/link DOCS/codecs.conf to ~/.mplayer/codecs.conf)\n"); 585 fprintf(stderr,"(copy/link DOCS/codecs.conf to ~/.mplayer/codecs.conf)\n");
587 GUI_MSG( mplCodecConfNotFound ) 586 GUI_MSG( mplCodecConfNotFound )
588 exit(1); 587 exit(1);
589 } 588 }
590 589
591 // check font 590 // check font
616 int ret,ret2; 615 int ret,ret2;
617 f=open(filename,O_RDONLY); 616 f=open(filename,O_RDONLY);
618 if(f<0){ fprintf(stderr,"CD-ROM Device '%s' not found!\n",filename);return 1; } 617 if(f<0){ fprintf(stderr,"CD-ROM Device '%s' not found!\n",filename);return 1; }
619 vcd_read_toc(f); 618 vcd_read_toc(f);
620 ret2=vcd_get_track_end(f,vcd_track); 619 ret2=vcd_get_track_end(f,vcd_track);
621 if(ret2<0){ fprintf(stderr,"Error selecting VCD track!\n");return 1;} 620 if(ret2<0){ fprintf(stderr,"Error selecting VCD track! (get)\n");return 1;}
622 ret=vcd_seek_to_track(f,vcd_track); 621 ret=vcd_seek_to_track(f,vcd_track);
623 if(ret<0){ fprintf(stderr,"Error selecting VCD track!\n");return 1;} 622 if(ret<0){ fprintf(stderr,"Error selecting VCD track! (seek)\n");return 1;}
624 seek_to_byte+=ret; 623 seek_to_byte+=ret;
625 if(verbose) printf("VCD start byte position: 0x%X end: 0x%X\n",seek_to_byte,ret2); 624 if(verbose) printf("VCD start byte position: 0x%X end: 0x%X\n",seek_to_byte,ret2);
626 #ifdef VCD_CACHE 625 #ifdef VCD_CACHE
627 vcd_cache_init(vcd_cache_size); 626 vcd_cache_init(vcd_cache_size);
628 #endif 627 #endif
697 //=============== Try to open as AVI file: ================= 696 //=============== Try to open as AVI file: =================
698 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AVI){ 697 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AVI){
699 stream_reset(stream); 698 stream_reset(stream);
700 demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id,dvdsub_id); 699 demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id,dvdsub_id);
701 stream_seek(demuxer->stream,seek_to_byte); 700 stream_seek(demuxer->stream,seek_to_byte);
702 //printf("stream3=0x%X vs. 0x%X\n",demuxer->stream,stream);
703 { //---- RIFF header: 701 { //---- RIFF header:
704 int id=stream_read_dword_le(demuxer->stream); // "RIFF" 702 int id=stream_read_dword_le(demuxer->stream); // "RIFF"
705 if(id==mmioFOURCC('R','I','F','F')){ 703 if(id==mmioFOURCC('R','I','F','F')){
706 stream_read_dword_le(demuxer->stream); //filesize 704 stream_read_dword_le(demuxer->stream); //filesize
707 id=stream_read_dword_le(demuxer->stream); // "AVI " 705 id=stream_read_dword_le(demuxer->stream); // "AVI "
726 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){ 724 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){
727 stream_reset(stream); 725 stream_reset(stream);
728 demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id); 726 demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id);
729 stream_seek(demuxer->stream,seek_to_byte); 727 stream_seek(demuxer->stream,seek_to_byte);
730 // Arpi? why is this extra and not in codec selection? - atmos :: 728 // Arpi? why is this extra and not in codec selection? - atmos ::
729 // Hmm. This should be fixed somehow... I'll check diz later. - arpi
731 if(audio_format) demuxer->audio->type=audio_format; // override audio format 730 if(audio_format) demuxer->audio->type=audio_format; // override audio format
732 if(ds_fill_buffer(demuxer->video)){ 731 if(ds_fill_buffer(demuxer->video)){
733 printf("Detected MPEG-PS file format!\n"); 732 printf("Detected MPEG-PS file format!\n");
734 file_format=DEMUXER_TYPE_MPEG_PS; 733 file_format=DEMUXER_TYPE_MPEG_PS;
735 } else { 734 } else {
736 // some hack to get meaningfull error messages to our unhappy users: 735 // some hack to get meaningfull error messages to our unhappy users:
737 // if(num_elementary_packets100>16 &&
738 // abs(num_elementary_packets101-num_elementary_packets100)<8){
739 if(num_elementary_packets100>=2 && num_elementary_packets101>=2 && 736 if(num_elementary_packets100>=2 && num_elementary_packets101>=2 &&
740 abs(num_elementary_packets101-num_elementary_packets100)<8){ 737 abs(num_elementary_packets101-num_elementary_packets100)<8){
741 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :) 738 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :)
742 } else { 739 } else {
743 if(demuxer->synced==2) 740 if(demuxer->synced==2)
831 if(a_pos==-1){ 828 if(a_pos==-1){
832 printf("AVI_NI: No audio stream found -> nosound\n"); 829 printf("AVI_NI: No audio stream found -> nosound\n");
833 has_audio=0;sh_audio=NULL; 830 has_audio=0;sh_audio=NULL;
834 } else { 831 } else {
835 if(force_ni || abs(a_pos-v_pos)>0x100000){ // distance > 1MB 832 if(force_ni || abs(a_pos-v_pos)>0x100000){ // distance > 1MB
836 printf("Detected NON-INTERLEAVED AVI file-format!\n"); 833 printf("%s NON-INTERLEAVED AVI file-format!\n",force_ni?"Forced":"Detected");
837 demuxer->type=DEMUXER_TYPE_AVI_NI; // HACK!!!! 834 demuxer->type=DEMUXER_TYPE_AVI_NI; // HACK!!!!
838 pts_from_bps=1; // force BPS sync! 835 pts_from_bps=1; // force BPS sync!
839 } 836 }
840 } 837 }
841 } else { 838 } else {
1245 ); 1242 );
1246 if(strlen(info->comment) > 0) 1243 if(strlen(info->comment) > 0)
1247 printf("VO: Comment: %s\n", info->comment); 1244 printf("VO: Comment: %s\n", info->comment);
1248 } 1245 }
1249 1246
1250 // if(verbose) printf("Destination size: %d x %d out_fmt=%0X\n",
1251 // screen_size_x,screen_size_y,out_fmt);
1252
1253 if(verbose) printf("video_out->init(%dx%d->%dx%d,flags=%d,'%s',0x%X)\n", 1247 if(verbose) printf("video_out->init(%dx%d->%dx%d,flags=%d,'%s',0x%X)\n",
1254 sh_video->disp_w,sh_video->disp_h, 1248 sh_video->disp_w,sh_video->disp_h,
1255 screen_size_x,screen_size_y, 1249 screen_size_x,screen_size_y,
1256 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3), 1250 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3),
1257 title,out_fmt); 1251 title,out_fmt);
1279 1273
1280 fflush(stdout); 1274 fflush(stdout);
1281 1275
1282 //================== MAIN: ========================== 1276 //================== MAIN: ==========================
1283 { 1277 {
1284 //float audio_buffer_delay=0; 1278
1285
1286 //float buffer_delay=0;
1287 float frame_correction=0; // A-V timestamp kulonbseg atlagolas 1279 float frame_correction=0; // A-V timestamp kulonbseg atlagolas
1288 int frame_corr_num=0; // 1280 int frame_corr_num=0; //
1289 float v_frame=0; // Video 1281 float v_frame=0; // Video
1290 float time_frame=0; // Timer 1282 float time_frame=0; // Timer
1291 float c_total=0; 1283 float c_total=0;
1431 --play_n_frames; 1423 --play_n_frames;
1432 if(play_n_frames<0) exit_player("Requested number of frames played"); 1424 if(play_n_frames<0) exit_player("Requested number of frames played");
1433 } 1425 }
1434 1426
1435 /*========================== PLAY AUDIO ============================*/ 1427 /*========================== PLAY AUDIO ============================*/
1436 //if(!has_audio){
1437 // int playsize=512;
1438 // a_frame+=playsize/(float)(sh_audio->o_bps);
1439 // a_pts+=playsize/(float)(sh_audio->o_bps);
1440 //time_frame+=playsize/(float)(sh_audio->o_bps);
1441 //} else
1442 while(has_audio){ 1428 while(has_audio){
1443 unsigned int t; 1429 unsigned int t;
1444 int playsize=audio_out->get_space(); 1430 int playsize=audio_out->get_space();
1445 1431
1446 if(!playsize) break; // buffer is full, do not block here!!! 1432 if(!playsize) break; // buffer is full, do not block here!!!
1538 } 1524 }
1539 if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1; 1525 if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1;
1540 if(!read_video_packet(d_video)){ eof=1; break;} // EOF 1526 if(!read_video_packet(d_video)){ eof=1; break;} // EOF
1541 //printf("read packet 0x%X, len=%d\n",i,videobuf_len); 1527 //printf("read packet 0x%X, len=%d\n",i,videobuf_len);
1542 if(sh_video->codec->driver!=1){ 1528 if(sh_video->codec->driver!=1){
1543 // not libmpeg2: 1529 // if not libmpeg2:
1544 switch(i){ 1530 switch(i){
1545 case 0x1B3: header_process_sequence_header (picture, buffer);break; 1531 case 0x1B3: header_process_sequence_header (picture, buffer);break;
1546 case 0x1B5: header_process_extension (picture, buffer);break; 1532 case 0x1B5: header_process_extension (picture, buffer);break;
1547 } 1533 }
1548 } 1534 }