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

📄 demuxer.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 4 页
字号:
 case DEMUXER_TYPE_H264_ES: case DEMUXER_TYPE_MPEG4_ES: case DEMUXER_TYPE_MPEG_ES: {   sh_audio=NULL;   // ES streams has no audio channel   d_video->sh=new_sh_video(demuxer,0); // create dummy video stream header, id=0   sh_video=d_video->sh;sh_video->ds=d_video;   break; }// case DEMUXER_TYPE_MPEG_TY:  case DEMUXER_TYPE_MPEG_PS: {  sh_video=d_video->sh;sh_video->ds=d_video;//  if(demuxer->stream->type!=STREAMTYPE_VCD) demuxer->movi_start=0; // for VCD  if(audio_id!=-2) {   if(!ds_fill_buffer(d_audio)){    mp_msg(MSGT_DEMUXER,MSGL_INFO,"MPEG: " MSGTR_MissingAudioStream);    sh_audio=NULL;   } else {    sh_audio=d_audio->sh;sh_audio->ds=d_audio;   }  }  break; }#ifdef USE_TV case DEMUXER_TYPE_TV: {    if (!demux_open_tv(demuxer)) return(NULL);    break; }#endif#ifdef STREAMING_LIVE_DOT_COM case DEMUXER_TYPE_RTP: {   if (!(demuxer = demux_open_rtp(demuxer))) return NULL;   break; }#endif case DEMUXER_TYPE_MPEG_TS: {  demux_open_ts(demuxer);  break; } case DEMUXER_TYPE_REALAUDIO: {  if (!demux_open_ra(demuxer)) return NULL;  break; }// case DEMUXER_TYPE_VQF: {//  if (!demux_open_vqf(demuxer)) return NULL;//  break;// }#ifdef USE_LIBAVFORMAT  case DEMUXER_TYPE_LAVF: {  if (!demux_open_lavf(demuxer)) return NULL;  break; }#endif#ifdef USE_WIN32DLL  case DEMUXER_TYPE_AVS: {  if (!demux_open_avs(demuxer)) return NULL;  break; }#endif} // switch(file_format)pts_from_bps=0; // !!!if ((sh_video=demuxer->video->sh) && sh_video->bih)  mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO:  [%.4s]  %ldx%ld  %dbpp  %5.3f fps  %5.1f kbps (%4.1f kbyte/s)\n",    (char *)&sh_video->bih->biCompression,    sh_video->bih->biWidth,    sh_video->bih->biHeight,    sh_video->bih->biBitCount,    sh_video->fps,    sh_video->i_bps*0.008f,    sh_video->i_bps/1024.0f );return demuxer;}char* audio_stream = NULL;char* sub_stream = NULL;int demuxer_type = 0, audio_demuxer_type = 0, sub_demuxer_type = 0;int audio_stream_cache = 0;extern int hr_mp3_seek;extern float stream_cache_min_percent;extern float stream_cache_prefill_percent;demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){  stream_t *as = NULL,*ss = NULL;  demuxer_t *vd,*ad = NULL,*sd = NULL;  int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ;  demux_aid_vid_mismatch = 0;  if(audio_stream) {    as = open_stream(audio_stream,0,&afmt);    if(!as) {      mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenAudioStream,audio_stream);      return NULL;    }    if(audio_stream_cache) {      if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024*(stream_cache_min_percent / 100.0),			      audio_stream_cache*1024*(stream_cache_prefill_percent / 100.0))) {	free_stream(as);	mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n");	return NULL;      }    }  }  if(sub_stream) {    ss = open_stream(sub_stream,0,&sfmt);    if(!ss) {      mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenSubtitlesStream,sub_stream);      return NULL;    }  }  vd = demux_open_stream(vs,demuxer_type ? demuxer_type : file_format,audio_stream ? -2 : audio_id,video_id, sub_stream ? -2 : dvdsub_id, filename);  if(!vd) {    if(as) free_stream(as);    if(ss) free_stream(ss);    return NULL;  }  if(as) {    ad = demux_open_stream(as,audio_demuxer_type ? audio_demuxer_type : afmt,audio_id,-2,-2, audio_stream);    if(!ad) {      mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream);      free_stream(as);    }    else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3      hr_mp3_seek=1; // Enable high res seeking  }  if(ss) {    sd = demux_open_stream(ss,sub_demuxer_type ? sub_demuxer_type : sfmt,-2,-2,dvdsub_id, sub_stream);    if(!sd) {      mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream);      free_stream(ss);    }  }  if(ad && sd)    return new_demuxers_demuxer(vd,ad,sd);  else if(ad)    return new_demuxers_demuxer(vd,ad,vd);  else if(sd)    return new_demuxers_demuxer(vd,vd,sd);  else    return vd;}int demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_ty(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_y4m(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_film(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_nuv(demuxer_t *demuxer,float rel_seek_secs,int flags);//void demux_seek_mov(demuxer_t *demuxer,float pts,int flags);int demux_seek_real(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_pva(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_ts(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek_lavf(demuxer_t *demuxer,float rel_seek_secs,int flags);#ifdef USE_WIN32DLLint demux_seek_avs(demuxer_t *demuxer,float rel_seek_secs,int flags);#endif#ifdef HAVE_LIBDV095int demux_seek_rawdv(demuxer_t *demuxer, float pts, int flags);#endifextern void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_xmms_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);extern void demux_mkv_seek(demuxer_t *demuxer,float rel_seek_secs,int flags);//extern void demux_seek_vqf(demuxer_t *demuxer,float rel_seek_secs,int flags);int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){    demux_stream_t *d_audio=demuxer->audio;    demux_stream_t *d_video=demuxer->video;    sh_audio_t *sh_audio=d_audio->sh;    sh_video_t *sh_video=d_video->sh;if(!demuxer->seekable){    if(demuxer->file_format==DEMUXER_TYPE_AVI)	mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI);#ifdef USE_TV    else if (demuxer->file_format==DEMUXER_TYPE_TV)	mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable);#endif    else	mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile);    return 0;}    // clear demux buffers:    if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;}    ds_free_packs(d_video);        demuxer->stream->eof=0; // clear eof flag    demuxer->video->eof=0;    demuxer->audio->eof=0;#if 0    if(sh_audio) sh_audio->timer=sh_video->timer;#else    if(sh_audio) sh_audio->delay=0;    if(sh_video) sh_video->timer=0; // !!!!!!#endifswitch(demuxer->file_format){#ifdef HAVE_LIBDV095  case DEMUXER_TYPE_RAWDV:      demux_seek_rawdv(demuxer,rel_seek_secs,flags);  break;#endif  case DEMUXER_TYPE_AVI:      demux_seek_avi(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_ASF:      demux_seek_asf(demuxer,rel_seek_secs,flags);  break;//  case DEMUXER_TYPE_MPEG_TY://      demux_seek_ty(demuxer,rel_seek_secs,flags);  break;    case DEMUXER_TYPE_H264_ES:  case DEMUXER_TYPE_MPEG4_ES:  case DEMUXER_TYPE_MPEG_ES:  case DEMUXER_TYPE_MPEG_PS:      demux_seek_mpg(demuxer,rel_seek_secs,flags);  break;//  case DEMUXER_TYPE_MOV://      demux_seek_mov(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_REAL:      demux_seek_real(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_Y4M:      demux_seek_y4m(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_MF:      demux_seek_mf(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_PVA:      demux_seek_pva(demuxer,rel_seek_secs,flags); break;        case DEMUXER_TYPE_FLI:      demux_seek_fli(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_FILM:      demux_seek_film(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_NUV:      demux_seek_nuv(demuxer,rel_seek_secs,flags);  break;  case DEMUXER_TYPE_AUDIO:      demux_audio_seek(demuxer,rel_seek_secs,flags);  break; case DEMUXER_TYPE_DEMUXERS:      demux_demuxers_seek(demuxer,rel_seek_secs,flags);  break;#ifdef HAVE_OGGVORBIS case DEMUXER_TYPE_OGG:      demux_ogg_seek(demuxer,rel_seek_secs,flags);  break;#endif case DEMUXER_TYPE_RAWAUDIO:      demux_rawaudio_seek(demuxer,rel_seek_secs,flags);  break; case DEMUXER_TYPE_RAWVIDEO:      demux_rawvideo_seek(demuxer,rel_seek_secs,flags);  break;#ifdef HAVE_XMMS case DEMUXER_TYPE_XMMS:      demux_xmms_seek(demuxer,rel_seek_secs,flags); break;#endif#ifdef HAVE_MATROSKA case DEMUXER_TYPE_MATROSKA:      demux_mkv_seek(demuxer,rel_seek_secs,flags);  break;#endif case DEMUXER_TYPE_MPEG_TS:      demux_seek_ts(demuxer,rel_seek_secs,flags); break; #ifdef USE_LIBAVFORMAT case DEMUXER_TYPE_LAVF:      demux_seek_lavf(demuxer,rel_seek_secs,flags); break; #endif// case DEMUXER_TYPE_VQF://      demux_seek_vqf(demuxer,rel_seek_secs,flags); break; #ifdef USE_WIN32DLL case DEMUXER_TYPE_AVS:      demux_seek_avs(demuxer,rel_seek_secs,flags); break; #endif} // switch(demuxer->file_format)return 1;}int demux_info_add(demuxer_t *demuxer, char *opt, char *param){    char **info = demuxer->info;    int n = 0;    for(n = 0; info && info[2*n] != NULL; n++)       {	if(!strcasecmp(opt,info[2*n]))	  {	    mp_msg(MSGT_DEMUX, MSGL_WARN,MSGTR_DemuxerInfoAlreadyPresent,opt);	    return 0;	  }      }        info = demuxer->info = (char**)realloc(info,(2*(n+2))*sizeof(char*));    info[2*n] = strdup(opt);    info[2*n+1] = strdup(param);    memset(&info[2*(n+1)],0,2*sizeof(char*));    return 1;}int demux_info_print(demuxer_t *demuxer){    char **info = demuxer->info;    int n;    if(!info)      return 0;    mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo);    for(n = 0; info[2*n] != NULL ; n++)      mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]);    return 0;}char* demux_info_get(demuxer_t *demuxer, char *opt) {  int i;  char **info = demuxer->info;  for(i = 0; info && info[2*i] != NULL; i++) {    if(!strcasecmp(opt,info[2*i]))      return info[2*i+1];  }  return NULL;}extern int demux_ty_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_mpg_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_asf_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_avi_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_xmms_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_audio_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_ogg_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_real_control(demuxer_t *demuxer, int cmd, void *arg);extern int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg);//extern int demux_mov_control(demuxer_t *demuxer, int cmd, void *arg);#ifdef USE_WIN32DLLextern int demux_avs_control(demuxer_t *demuxer, int cmd, void *arg);#endif#ifdef HAVE_LIBDV095extern int demux_rawdv_control(demuxer_t *demuxer,int cmd, void *arg);#endifint demux_control(demuxer_t *demuxer, int cmd, void *arg) {    switch(demuxer->type) {//	case DEMUXER_TYPE_MPEG_TY://	    return demux_ty_control(demuxer,cmd,arg);	case DEMUXER_TYPE_MPEG4_ES:	case DEMUXER_TYPE_MPEG_ES:	case DEMUXER_TYPE_MPEG_PS:	case DEMUXER_TYPE_MPEG_TS:	    return demux_mpg_control(demuxer,cmd,arg);	case DEMUXER_TYPE_ASF:	    return demux_asf_control(demuxer,cmd,arg);	case DEMUXER_TYPE_AVI:	case DEMUXER_TYPE_AVI_NI:	case DEMUXER_TYPE_AVI_NINI:	    return demux_avi_control(demuxer,cmd,arg);	case DEMUXER_TYPE_AUDIO:	    return demux_audio_control(demuxer,cmd,arg);#ifdef HAVE_OGGVORBIS	case DEMUXER_TYPE_OGG:	    return demux_ogg_control(demuxer,cmd,arg);#endif#ifdef HAVE_XMMS	case DEMUXER_TYPE_XMMS:	    return demux_xmms_control(demuxer,cmd,arg);#endif#ifdef HAVE_MATROSKA        case DEMUXER_TYPE_MATROSKA:	    return demux_mkv_control(demuxer,cmd,arg);#endif	case DEMUXER_TYPE_REAL:	    return demux_real_control(demuxer, cmd, arg);#ifdef USE_LIBAVFORMAT        case DEMUXER_TYPE_LAVF:	    return demux_lavf_control(demuxer, cmd, arg);#endif//        case DEMUXER_TYPE_MOV://   	    return demux_mov_control(demuxer, cmd, arg);#ifdef USE_WIN32DLL        case DEMUXER_TYPE_AVS:   	    return demux_avs_control(demuxer, cmd, arg);#endif #ifdef HAVE_LIBDV095        case DEMUXER_TYPE_RAWDV:            return demux_rawdv_control(demuxer,cmd, arg);#endif	default:	    return DEMUXER_CTRL_NOTIMPL;    }}unsigned long demuxer_get_time_length(demuxer_t *demuxer){         unsigned long get_time_ans;         sh_video_t *sh_video = demuxer->video->sh;    // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW    if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0)  {      if (sh_video && sh_video->i_bps)        get_time_ans = (demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps;      else        get_time_ans=0;         }    return get_time_ans;}int demuxer_get_percent_pos(demuxer_t *demuxer){         int ans = 0;    int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans);    int len = (demuxer->movi_end - demuxer->movi_start) / 100;    if (res <= 0) {      if (len > 0)      ans = (demuxer->filepos - demuxer->movi_start) / len;      else       ans = 0;    }    if (ans < 0) ans = 0;    if (ans > 100) ans = 100;    return ans;}int demuxer_switch_audio(demuxer_t *demuxer){         int ans = 0;    int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &ans);    return ans;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -