Mercurial > mplayer.hg
comparison libmpdemux/demuxer.c @ 15670:081bee8052cf
moved mpeg-ps/es probing code to demux_mpg.c
author | nicodvb |
---|---|
date | Mon, 06 Jun 2005 21:30:53 +0000 |
parents | 82fe45e7ca77 |
children | e999d58f94fd |
comparison
equal
deleted
inserted
replaced
15669:d283a96c0ecb | 15670:081bee8052cf |
---|---|
582 return ds->first->pts; | 582 return ds->first->pts; |
583 } | 583 } |
584 | 584 |
585 // ==================================================================== | 585 // ==================================================================== |
586 | 586 |
587 // feed-back from demuxers: | |
588 extern int num_elementary_packets100; // for MPEG-ES fileformat detection | |
589 extern int num_elementary_packets101; | |
590 extern int num_elementary_packetsPES; | |
591 extern int num_elementary_packets1B6; | |
592 extern int num_elementary_packets12x; | |
593 extern int num_h264_slice; //combined slice | |
594 extern int num_h264_dpa; //DPA Slice | |
595 extern int num_h264_dpb; //DPB Slice | |
596 extern int num_h264_dpc; //DPC Slice | |
597 extern int num_h264_idr; //IDR Slice | |
598 extern int num_h264_sps; | |
599 extern int num_h264_pps; | |
600 extern int num_mp3audio_packets; | |
601 | |
602 // commandline options, flags: | 587 // commandline options, flags: |
603 extern int force_ni; | 588 extern int force_ni; |
604 extern int pts_from_bps; | 589 extern int pts_from_bps; |
605 | 590 |
606 //extern int audio_id; | 591 //extern int audio_id; |
615 int mov_read_header(demuxer_t* demuxer); | 600 int mov_read_header(demuxer_t* demuxer); |
616 int demux_open_fli(demuxer_t* demuxer); | 601 int demux_open_fli(demuxer_t* demuxer); |
617 int demux_open_mf(demuxer_t* demuxer); | 602 int demux_open_mf(demuxer_t* demuxer); |
618 int demux_open_film(demuxer_t* demuxer); | 603 int demux_open_film(demuxer_t* demuxer); |
619 int demux_open_roq(demuxer_t* demuxer); | 604 int demux_open_roq(demuxer_t* demuxer); |
605 int demux_mpg_probe(demuxer_t *demuxer); | |
620 #ifdef HAVE_LIBDV095 | 606 #ifdef HAVE_LIBDV095 |
621 int demux_open_rawdv(demuxer_t* demuxer); | 607 int demux_open_rawdv(demuxer_t* demuxer); |
622 extern int rawdv_check_file(demuxer_t *demuxer); | 608 extern int rawdv_check_file(demuxer_t *demuxer); |
623 #endif | 609 #endif |
624 | 610 |
998 } else { | 984 } else { |
999 free_demuxer(demuxer); | 985 free_demuxer(demuxer); |
1000 demuxer = NULL; | 986 demuxer = NULL; |
1001 } | 987 } |
1002 } | 988 } |
1003 //=============== Try to open as MPEG-PS file: ================= | 989 |
1004 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){ | 990 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){ |
1005 int pes=1; | 991 demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id); |
1006 int tmp; | 992 file_format = demux_mpg_probe(demuxer); |
1007 off_t tmppos; | 993 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_mpg_probe returned file_format %d\n", file_format); |
1008 file_format=DEMUXER_TYPE_UNKNOWN; | 994 if(file_format==DEMUXER_TYPE_UNKNOWN) { |
1009 while(pes>=0){ | 995 free_demuxer(demuxer); |
1010 demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id); | 996 demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id); |
997 demuxer->synced = 3; | |
998 file_format = demux_mpg_probe(demuxer); | |
999 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_mpg_probe returned file_format %d\n", file_format); | |
1000 if(file_format==DEMUXER_TYPE_MPEG_PS) | |
1001 mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PES"); | |
1002 } else if(file_format==DEMUXER_TYPE_MPEG_PS) | |
1003 mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PS"); | |
1011 | 1004 |
1012 // try to pre-detect PES: | 1005 if(file_format != DEMUXER_TYPE_MPEG_PS) { |
1013 tmppos=stream_tell(demuxer->stream); | 1006 free_demuxer(demuxer); |
1014 tmp=stream_read_dword(demuxer->stream); | 1007 demuxer = NULL; |
1015 if(tmp==0x1E0 || tmp==0x1C0){ | |
1016 tmp=stream_read_word(demuxer->stream); | |
1017 if(tmp>1 && tmp<=2048) pes=0; // demuxer->synced=3; // PES... | |
1018 } | |
1019 stream_seek(demuxer->stream,tmppos); | |
1020 | |
1021 if(!pes) demuxer->synced=3; // hack! | |
1022 | |
1023 num_elementary_packets100=0; | |
1024 num_elementary_packets101=0; | |
1025 num_elementary_packets1B6=0; | |
1026 num_elementary_packets12x=0; | |
1027 num_elementary_packetsPES=0; | |
1028 num_h264_slice=0; //combined slice | |
1029 num_h264_dpa=0; //DPA Slice | |
1030 num_h264_dpb=0; //DPB Slice | |
1031 num_h264_dpc=0; //DPC Slice | |
1032 num_h264_idr=0; //IDR Slice | |
1033 num_h264_sps=0; | |
1034 num_h264_pps=0; | |
1035 num_mp3audio_packets=0; | |
1036 | |
1037 if(demux_mpg_open(demuxer)){ | |
1038 if(!pes) | |
1039 mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PES"); | |
1040 else | |
1041 mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PS"); | |
1042 file_format=DEMUXER_TYPE_MPEG_PS; | |
1043 } else { | |
1044 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG packet stats: p100: %d p101: %d p1B6: %d p12x: %d sli: %d a: %d b: %d c: %d idr: %d sps: %d pps: %d PES: %d MP3: %d \n", | |
1045 num_elementary_packets100,num_elementary_packets101, | |
1046 num_elementary_packets1B6,num_elementary_packets12x, | |
1047 num_h264_slice, num_h264_dpa, | |
1048 num_h264_dpb, num_h264_dpc=0, | |
1049 num_h264_idr, num_h264_sps=0, | |
1050 num_h264_pps, | |
1051 num_elementary_packetsPES,num_mp3audio_packets); | |
1052 //MPEG packet stats: p100: 458 p101: 458 PES: 0 MP3: 1103 (.m2v) | |
1053 if(num_mp3audio_packets>50 && num_mp3audio_packets>2*num_elementary_packets100 | |
1054 && abs(num_elementary_packets100-num_elementary_packets101)>2) | |
1055 break; // it's .MP3 | |
1056 // some hack to get meaningfull error messages to our unhappy users: | |
1057 if(num_elementary_packets100>=2 && num_elementary_packets101>=2 && | |
1058 abs(num_elementary_packets101+8-num_elementary_packets100)<16){ | |
1059 if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4){ | |
1060 --pes;continue; // tricky... | |
1061 } | |
1062 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :) | |
1063 } else | |
1064 #if 1 | |
1065 // fuzzy mpeg4-es detection. do NOT enable without heavy testing of mpeg formats detection! | |
1066 if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 && | |
1067 num_elementary_packetsPES==0 && num_elementary_packets100<=num_elementary_packets12x && | |
1068 demuxer->synced<2){ | |
1069 file_format=DEMUXER_TYPE_MPEG4_ES; | |
1070 } else | |
1071 #endif | |
1072 #if 1 | |
1073 // fuzzy h264-es detection. do NOT enable without heavy testing of mpeg formats detection! | |
1074 if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) && | |
1075 /* FIXME num_h264_sps>=1 && */ num_h264_pps>=1 && num_h264_idr>=1 && | |
1076 num_elementary_packets1B6==0 && num_elementary_packetsPES==0 && | |
1077 demuxer->synced<2){ | |
1078 file_format=DEMUXER_TYPE_H264_ES; | |
1079 } else | |
1080 #endif | |
1081 { | |
1082 if(demuxer->synced==2) | |
1083 mp_msg(MSGT_DEMUXER,MSGL_ERR,"MPEG: " MSGTR_MissingVideoStreamBug); | |
1084 else | |
1085 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_NotSystemStream); | |
1086 } | |
1087 if (demuxer && file_format != DEMUXER_TYPE_MPEG_PS) { | |
1088 free_demuxer(demuxer); | |
1089 demuxer = NULL; | |
1090 } | |
1091 } | |
1092 break; | |
1093 } | 1008 } |
1094 } | 1009 } |
1095 //=============== Try to open as MPEG-ES file: ================= | 1010 //=============== Try to open as MPEG-ES file: ================= |
1096 if(file_format==DEMUXER_TYPE_MPEG_ES || file_format==DEMUXER_TYPE_MPEG4_ES || file_format==DEMUXER_TYPE_H264_ES){ // little hack, see above! | 1011 if(file_format==DEMUXER_TYPE_MPEG_ES || file_format==DEMUXER_TYPE_MPEG4_ES || file_format==DEMUXER_TYPE_H264_ES){ // little hack, see above! |
1097 demuxer=new_demuxer(stream,file_format,audio_id,video_id,dvdsub_id); | 1012 demuxer=new_demuxer(stream,file_format,audio_id,video_id,dvdsub_id); |