📄 demuxer.c
字号:
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 + -