⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demuxer.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 4 页
字号:
    // 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 + -