📄 demuxer.c
字号:
// check for the FLI file magic number if((id==0xAF11) || (id==0xAF12)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"FLI"); file_format=DEMUXER_TYPE_FLI; } else { free_demuxer(demuxer); demuxer = NULL; } }}//=============== Try to open as FILM file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_FILM){ demuxer=new_demuxer(stream,DEMUXER_TYPE_FILM,audio_id,video_id,dvdsub_id); { int signature=stream_read_fourcc(demuxer->stream); // check for the FLI file magic number if(signature==mmioFOURCC('F', 'I', 'L', 'M')){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"FILM"); file_format=DEMUXER_TYPE_FILM; } else { free_demuxer(demuxer); demuxer = NULL; } }}//=============== Try to open as RoQ file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_ROQ){ demuxer=new_demuxer(stream,DEMUXER_TYPE_ROQ,audio_id,video_id,dvdsub_id); if(roq_check_file(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"ROQ"); file_format=DEMUXER_TYPE_ROQ; } else { free_demuxer(demuxer); demuxer = NULL; }}#ifdef HAVE_GIF//=============== Try to open as GIF file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_GIF){ demuxer=new_demuxer(stream,DEMUXER_TYPE_GIF,audio_id,video_id,dvdsub_id); if(gif_check_file(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"GIF"); file_format=DEMUXER_TYPE_GIF; } else { free_demuxer(demuxer); demuxer = NULL; }}#endif#ifdef HAVE_OGGVORBIS//=============== Try to open as Ogg file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_OGG){ demuxer=new_demuxer(stream,DEMUXER_TYPE_OGG,audio_id,video_id,dvdsub_id); if(demux_ogg_open(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"Ogg"); file_format=DEMUXER_TYPE_OGG; } else { free_demuxer(demuxer); demuxer = NULL; }}#endif#ifdef USE_WIN32DLL//=============== Try to open as Avisynth file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AVS){ demuxer=new_demuxer(stream,DEMUXER_TYPE_AVS,audio_id,video_id,dvdsub_id); if (avs_check_file(demuxer, filename)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"AVS"); file_format=DEMUXER_TYPE_AVS; } else { free_demuxer(demuxer); demuxer = NULL; }}#endif//=============== Try to open as PVA file: =================if(file_format == DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_PVA){ demuxer=new_demuxer(stream,DEMUXER_TYPE_PVA,audio_id,video_id,dvdsub_id); if(pva_check_file(demuxer)) { mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"PVA"); file_format=DEMUXER_TYPE_PVA; } else { free_demuxer(demuxer); demuxer=NULL; }}//=============== Try to open as MPEG-TS file: =================if(file_format == DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_TS){ demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_TS,audio_id,video_id,dvdsub_id); if(ts_check_file(demuxer)) { mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"TS"); file_format=DEMUXER_TYPE_MPEG_TS; } else { free_demuxer(demuxer); demuxer=NULL; }}//=============== Try to open as LMLM4 file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_LMLM4){ demuxer=new_demuxer(stream,DEMUXER_TYPE_LMLM4,audio_id,video_id,dvdsub_id); if(lmlm4_check_file(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"RAW LMLM4"); file_format=DEMUXER_TYPE_LMLM4; } else { free_demuxer(demuxer); demuxer = NULL; }}//=============== Try to open as MPEG-PS file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){ int pes=1; int tmp; off_t tmppos; file_format=DEMUXER_TYPE_UNKNOWN; while(pes>=0){ demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id); // try to pre-detect PES: tmppos=stream_tell(demuxer->stream); tmp=stream_read_dword(demuxer->stream); if(tmp==0x1E0 || tmp==0x1C0){ tmp=stream_read_word(demuxer->stream); if(tmp>1 && tmp<=2048) pes=0; // demuxer->synced=3; // PES... } stream_seek(demuxer->stream,tmppos); if(!pes) demuxer->synced=3; // hack! num_elementary_packets100=0; num_elementary_packets101=0; num_elementary_packets1B6=0; num_elementary_packets12x=0; num_elementary_packetsPES=0; num_h264_slice=0; //combined slice num_h264_dpa=0; //DPA Slice num_h264_dpb=0; //DPB Slice num_h264_dpc=0; //DPC Slice num_h264_idr=0; //IDR Slice num_h264_sps=0; num_h264_pps=0; num_mp3audio_packets=0; if(demux_mpg_open(demuxer)){ if(!pes) mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PES"); else mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"MPEG-PS"); file_format=DEMUXER_TYPE_MPEG_PS; } else { 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", num_elementary_packets100,num_elementary_packets101, num_elementary_packets1B6,num_elementary_packets12x, num_h264_slice, num_h264_dpa, num_h264_dpb, num_h264_dpc=0, num_h264_idr, num_h264_sps=0, num_h264_pps, num_elementary_packetsPES,num_mp3audio_packets);//MPEG packet stats: p100: 458 p101: 458 PES: 0 MP3: 1103 (.m2v) if(num_mp3audio_packets>50 && num_mp3audio_packets>2*num_elementary_packets100 && abs(num_elementary_packets100-num_elementary_packets101)>2) break; // it's .MP3 // some hack to get meaningfull error messages to our unhappy users: if(num_elementary_packets100>=2 && num_elementary_packets101>=2 && abs(num_elementary_packets101+8-num_elementary_packets100)<16){ if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4){ --pes;continue; // tricky... } file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :) } else #if 1 // fuzzy mpeg4-es detection. do NOT enable without heavy testing of mpeg formats detection! if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 && num_elementary_packetsPES==0 && num_elementary_packets100<=num_elementary_packets12x && demuxer->synced<2){ file_format=DEMUXER_TYPE_MPEG4_ES; } else#endif#if 1 // fuzzy h264-es detection. do NOT enable without heavy testing of mpeg formats detection! if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) && /* FIXME num_h264_sps>=1 && */ num_h264_pps>=1 && num_h264_idr>=1 && num_elementary_packets1B6==0 && num_elementary_packetsPES==0 && demuxer->synced<2){ file_format=DEMUXER_TYPE_H264_ES; } else#endif { if(demuxer->synced==2) mp_msg(MSGT_DEMUXER,MSGL_ERR,"MPEG: " MSGTR_MissingVideoStreamBug); else mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_NotSystemStream); } if (demuxer && file_format != DEMUXER_TYPE_MPEG_PS) { free_demuxer(demuxer); demuxer = NULL; } } break; }}//=============== Try to open as MPEG-ES file: =================if(file_format==DEMUXER_TYPE_MPEG_ES || file_format==DEMUXER_TYPE_MPEG4_ES || file_format==DEMUXER_TYPE_H264_ES){ // little hack, see above! demuxer=new_demuxer(stream,file_format,audio_id,video_id,dvdsub_id); if(!ds_fill_buffer(demuxer->video)){ mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_InvalidMPEGES); file_format=DEMUXER_TYPE_UNKNOWN; free_demuxer(demuxer); demuxer = NULL; } else { switch(file_format){ case DEMUXER_TYPE_MPEG_ES: mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat, "MPEG-ES"); break; case DEMUXER_TYPE_MPEG4_ES: mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat, "MPEG4-ES"); break; case DEMUXER_TYPE_H264_ES: mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat, "H264-ES"); break; } }}#ifdef HAVE_LIBDV095//=============== Try to open raw DV file, as produced by dvgrab --format raw =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_RAWDV){ demuxer=new_demuxer(stream,DEMUXER_TYPE_RAWDV,audio_id,video_id,dvdsub_id); if(rawdv_check_file(demuxer)) { mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"RAWDV"); file_format=DEMUXER_TYPE_RAWDV; } else { free_demuxer(demuxer); demuxer=NULL; }}#endif//=============== Try to open as audio file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AUDIO){ demuxer=new_demuxer(stream,DEMUXER_TYPE_AUDIO,audio_id,video_id,dvdsub_id); if(demux_audio_open(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_DetectedAudiofile); file_format=DEMUXER_TYPE_AUDIO; } else { free_demuxer(demuxer); demuxer = NULL; }}#ifdef HAVE_XMMS//=============== Try to open as XMMS file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_XMMS){ demuxer=new_demuxer(stream,DEMUXER_TYPE_XMMS,audio_id,video_id,dvdsub_id); if(demux_xmms_open(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_DetectedAudiofile); file_format=DEMUXER_TYPE_XMMS; } else { free_demuxer(demuxer); demuxer = NULL; }}#endif/*//=============== Try to open as MPEG-TY file: =================if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_TY){ demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_TY,audio_id,video_id,dvdsub_id); if(ds_fill_buffer(demuxer->video)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"TiVo"); file_format=DEMUXER_TYPE_MPEG_TY; } else { free_demuxer(demuxer); demuxer = NULL; }}*///=============== Try to open as a RTP stream: =========== if(file_format==DEMUXER_TYPE_RTP) { demuxer=new_demuxer(stream,DEMUXER_TYPE_RTP,audio_id,video_id,dvdsub_id); }//=============== Try to open with LAVF: =================#ifdef USE_LIBAVFORMAT if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_LAVF){ demuxer=new_demuxer(stream,DEMUXER_TYPE_LAVF,audio_id,video_id,dvdsub_id); if(lavf_check_file(demuxer)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"libavformat"); //FIXME print format file_format=DEMUXER_TYPE_LAVF; } else { free_demuxer(demuxer); demuxer = NULL; }}#endif//=============== Unknown, exiting... ===========================if(file_format==DEMUXER_TYPE_UNKNOWN || demuxer == NULL){ //mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_FormatNotRecognized); // will be done by mplayer.c after fallback to playlist-parsing return NULL;}//====== File format recognized, set up these for compatibility: =========d_audio=demuxer->audio;d_video=demuxer->video;//d_dvdsub=demuxer->sub;demuxer->file_format=file_format;switch(file_format){#ifdef HAVE_LIBDV095 case DEMUXER_TYPE_RAWDV: { if (!demux_open_rawdv(demuxer)) return NULL; break; }#endif case DEMUXER_TYPE_RAWAUDIO: { demux_rawaudio_open(demuxer); break; } case DEMUXER_TYPE_RAWVIDEO: { demux_rawvideo_open(demuxer); break; } case DEMUXER_TYPE_MF: { if (!demux_open_mf(demuxer)) return NULL; break; } case DEMUXER_TYPE_FLI: { if (!demux_open_fli(demuxer)) return NULL; break; } case DEMUXER_TYPE_FILM: { if (!demux_open_film(demuxer)) return NULL; break; }#ifdef HAVE_GIF case DEMUXER_TYPE_GIF: { if (!demux_open_gif(demuxer)) return NULL; break; }#endif case DEMUXER_TYPE_ROQ: { if (!demux_open_roq(demuxer)) return NULL; break; } case DEMUXER_TYPE_SMJPEG: { if (!demux_open_smjpeg(demuxer)) return NULL; break; }// case DEMUXER_TYPE_MOV: {// if(!mov_read_header(demuxer)) return NULL;// sh_video=d_video->sh;if(sh_video) sh_video->ds=d_video;// sh_audio=d_audio->sh;if(sh_audio) sh_audio->ds=d_audio;// break;// } case DEMUXER_TYPE_AVI: { sh_audio_t* sh_a; demuxer = (demuxer_t*) demux_open_avi(demuxer); if(!demuxer) return NULL; // failed to open sh_a = (sh_audio_t*)demuxer->audio->sh; if(demuxer->audio->id != -2 && sh_a) {#ifdef HAVE_OGGVORBIS // support for Ogg-in-AVI: if(sh_a->format == 0xFFFE) demuxer = init_avi_with_ogg(demuxer); else if(sh_a->format == 0x674F) { stream_t* s; demuxer_t *od; s = new_ds_stream(demuxer->audio); od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2); if(!demux_ogg_open(od)) { mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer); free_stream(s); demuxer->audio->id = -2; } else demuxer = new_demuxers_demuxer(demuxer,od,demuxer); }#endif } return demuxer;// break; } case DEMUXER_TYPE_NSV: { demux_open_nsv(demuxer); break; } case DEMUXER_TYPE_NUV: { demux_open_nuv(demuxer); break; } case DEMUXER_TYPE_VIVO: { demux_open_vivo(demuxer); break; } case DEMUXER_TYPE_PVA: { demux_open_pva(demuxer); break; } case DEMUXER_TYPE_Y4M: { demux_open_y4m(demuxer); break; } case DEMUXER_TYPE_LMLM4: { demux_open_lmlm4(demuxer); if(!ds_fill_buffer(d_video)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,"LMLM4: " MSGTR_MissingVideoStream); sh_video=NULL; } else { sh_video=d_video->sh;sh_video->ds=d_video; } if(audio_id!=-2) { if(!ds_fill_buffer(d_audio)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,"LMLM4: " MSGTR_MissingAudioStream); sh_audio=NULL; } else { sh_audio=d_audio->sh;sh_audio->ds=d_audio; } } break; } case DEMUXER_TYPE_REAL: { demux_open_real(demuxer); break; } case DEMUXER_TYPE_ASF: { //---- ASF header: read_asf_header(demuxer); stream_reset(demuxer->stream); stream_seek(demuxer->stream,demuxer->movi_start);// demuxer->idx_pos=0;// demuxer->endpos=avi_header.movi_end; if(d_video->id != -2) { if(!ds_fill_buffer(d_video)){ mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream); sh_video=NULL; //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n"); } else { sh_video=d_video->sh;sh_video->ds=d_video; sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms // sh_video->i_bps=10*asf_packetsize; // FIXME! } } if(d_audio->id!=-2){ mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,d_audio->id); if(!ds_fill_buffer(d_audio)){ mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream); sh_audio=NULL; } else { sh_audio=d_audio->sh;sh_audio->ds=d_audio; sh_audio->format=sh_audio->wf->wFormatTag; } } break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -