Mercurial > mplayer.hg
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 } |