📄 init.cxx
字号:
}/// Demuxer name (RO)static int mp_property_demuxer(m_option_t* prop,int action,void* arg) { if(!demuxer) return M_PROPERTY_UNAVAILABLE; return m_property_string_ro(prop,action,arg,(char*)demuxer->desc->name);}/// Position in the stream (RW)static int mp_property_stream_pos(m_option_t* prop,int action,void* arg) { if (!demuxer || !demuxer->stream) return M_PROPERTY_UNAVAILABLE; if (!arg) return M_PROPERTY_ERROR; switch (action) { case M_PROPERTY_GET: *(off_t*)arg = stream_tell(demuxer->stream); return M_PROPERTY_OK; case M_PROPERTY_SET: M_PROPERTY_CLAMP(prop,*(off_t*)arg); stream_seek(demuxer->stream, *(off_t*)arg); return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED;}/// Stream start offset (RO)static int mp_property_stream_start(m_option_t* prop,int action,void* arg) { if (!demuxer || !demuxer->stream) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_GET: *(off_t*)arg = demuxer->stream->start_pos; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED;}/// Stream end offset (RO)static int mp_property_stream_end(m_option_t* prop,int action,void* arg) { if (!demuxer || !demuxer->stream) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_GET: *(off_t*)arg = demuxer->stream->end_pos; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED;}/// Stream length (RO)static int mp_property_stream_length(m_option_t* prop,int action,void* arg) { if (!demuxer || !demuxer->stream) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_GET: *(off_t*)arg = demuxer->stream->end_pos - demuxer->stream->start_pos; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED;}/// Media length in seconds (RO)static int mp_property_length(m_option_t* prop,int action,void* arg) { double len; if(!demuxer || !(int)(len = demuxer_get_time_length(demuxer))) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_PRINT: if(!arg) return 0; else { int h, m, s = len; h = s/3600; s -= h*3600; m = s/60; s -= m*60; *(char**)arg = malloc(20); if(h > 0) sprintf(*(char**)arg,"%d:%02d:%02d",h,m,s); else if(m > 0) sprintf(*(char**)arg,"%d:%02d",m,s); else sprintf(*(char**)arg,"%d",s); return 1; } break; } return m_property_double_ro(prop,action,arg,len);}///@}/// \defgroup AudioProperties Audio properties/// \ingroup Properties///@{/// Volume (RW)static int mp_property_volume(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_GET: if(!arg) return 0; mixer_getbothvolume(&mixer,arg); return 1; case M_PROPERTY_PRINT:{ float vol; if(!arg) return 0; mixer_getbothvolume(&mixer,&vol); return m_property_float_range(prop,action,arg,&vol); } case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: case M_PROPERTY_SET: break; default: return M_PROPERTY_NOT_IMPLEMENTED; } if (edl_muted) return M_PROPERTY_DISABLED; user_muted = 0; switch(action) { case M_PROPERTY_SET: if(!arg) return 0; M_PROPERTY_CLAMP(prop,*(float*)arg); mixer_setvolume(&mixer,*(float*)arg,*(float*)arg); return 1; case M_PROPERTY_STEP_UP: if(arg && *(float*)arg <= 0) mixer_decvolume(&mixer); else mixer_incvolume(&mixer); return 1; case M_PROPERTY_STEP_DOWN: if(arg && *(float*)arg <= 0) mixer_incvolume(&mixer); else mixer_decvolume(&mixer); return 1; } return M_PROPERTY_NOT_IMPLEMENTED;}/// Mute (RW)static int mp_property_mute(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: if(edl_muted) return M_PROPERTY_DISABLED; if(!arg) return 0; if((!!*(int*)arg) != mixer.muted) mixer_mute(&mixer); return 1; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: if(edl_muted) return M_PROPERTY_DISABLED; mixer_mute(&mixer); return 1; case M_PROPERTY_PRINT: if(!arg) return 0; if(edl_muted) { *(char**)arg = strdup(MSGTR_EnabledEdl); return 1; } default: return m_property_flag(prop,action,arg,&mixer.muted); }}/// Audio delay (RW)static int mp_property_audio_delay(m_option_t* prop,int action,void* arg) { if(!(sh_audio && sh_video)) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: if(!arg) return 0; else { float delay = audio_delay; m_property_delay(prop,action,arg,&audio_delay); if(sh_audio) sh_audio->delay -= audio_delay-delay; } return 1; default: return m_property_delay(prop,action,arg,&audio_delay); }}/// Audio codec tag (RO)static int mp_property_audio_format(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_audio->format);}/// Audio bitrate (RO)static int mp_property_audio_bitrate(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_audio->i_bps);}/// Samplerate (RO)static int mp_property_samplerate(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_audio->samplerate);}/// Number of channels (RO)static int mp_property_channels(m_option_t* prop,int action,void* arg) { if(!sh_audio) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_PRINT: if(!arg) return 0; switch(sh_audio->channels) { case 1: *(char**)arg = strdup("mono"); break; case 2: *(char**)arg = strdup("stereo"); break; default: *(char**)arg = malloc(32); sprintf(*(char**)arg,"%d channels",sh_audio->channels); } return 1; } return m_property_int_ro(prop,action,arg,sh_audio->channels);}///@}/// \defgroup VideoProperties Video properties/// \ingroup Properties///@{/// Fullscreen state (RW)static int mp_property_fullscreen(m_option_t* prop,int action,void* arg) { if(!video_out) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: if(!arg) return 0; M_PROPERTY_CLAMP(prop,*(int*)arg); if(vo_fs == !!*(int*)arg) return 1; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN:#ifdef HAVE_NEW_GUI if(use_gui) guiGetEvent(guiIEvent,(char*)MP_CMD_GUI_FULLSCREEN); else#endif if(vo_config_count) video_out->control(VOCTRL_FULLSCREEN, 0); return 1; default: return m_property_flag(prop,action,arg,&vo_fs); }}/// Panscan (RW)static int mp_property_panscan(m_option_t* prop,int action,void* arg) { if(!video_out || video_out->control(VOCTRL_GET_PANSCAN,NULL ) != VO_TRUE) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: if(!arg) return 0; M_PROPERTY_CLAMP(prop,*(float*)arg); vo_panscan = *(float*)arg; video_out->control(VOCTRL_SET_PANSCAN,NULL); return 1; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: vo_panscan += (arg ? *(float*)arg : 0.1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); if(vo_panscan > 1) vo_panscan = 1; else if(vo_panscan < 0) vo_panscan = 0; video_out->control(VOCTRL_SET_PANSCAN,NULL); return 1; default: return m_property_float_range(prop,action,arg,&vo_panscan); }}/// Helper to set vo flags./** \ingroup PropertyImplHelper */static int mp_property_vo_flag(m_option_t* prop,int action,void* arg, int vo_ctrl,int* vo_var) { if(!video_out) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: if(!arg) return 0; M_PROPERTY_CLAMP(prop,*(int*)arg); if(*vo_var == !!*(int*)arg) return 1; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: if(vo_config_count) video_out->control(vo_ctrl, 0); return 1; default: return m_property_flag(prop,action,arg,vo_var); }}/// Window always on top (RW)static int mp_property_ontop(m_option_t* prop,int action,void* arg) { return mp_property_vo_flag(prop,action,arg,VOCTRL_ONTOP,&vo_ontop);}/// Display in the root window (RW)static int mp_property_rootwin(m_option_t* prop,int action,void* arg) { return mp_property_vo_flag(prop,action,arg,VOCTRL_ROOTWIN,&vo_rootwin);}/// Show window borders (RW)static int mp_property_border(m_option_t* prop,int action,void* arg) { return mp_property_vo_flag(prop,action,arg,VOCTRL_BORDER,&vo_border);}/// Framedropping state (RW)static int mp_property_framedropping(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_PRINT: if(!arg) return 0; *(char**)arg = strdup(frame_dropping == 1 ? MSGTR_Enabled : (frame_dropping == 2 ? MSGTR_HardFrameDrop : MSGTR_Disabled)); return 1; default: return m_property_choice(prop,action,arg,&frame_dropping); }}/// Color settings, try to use vf/vo then fall back on TV. (RW)static int mp_property_gamma(m_option_t* prop,int action,void* arg) { int* gamma = prop->priv, r; if(!sh_video) return M_PROPERTY_UNAVAILABLE; if(gamma[0] == 1000) { gamma[0] = 0; get_video_colors (sh_video, prop->name, gamma); } switch(action) { case M_PROPERTY_SET: if(!arg) return 0; M_PROPERTY_CLAMP(prop,*(int*)arg); *gamma = *(int*)arg; r = set_video_colors(sh_video, prop->name, *gamma); if(r <= 0) break; return r; case M_PROPERTY_GET: if(!arg) return 0; r = get_video_colors (sh_video, prop->name, arg); if(r <= 0) break; return r; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: *gamma += (arg ? *(int*)arg : 1) * (action == M_PROPERTY_STEP_DOWN ? -1 : 1); M_PROPERTY_CLAMP(prop,*gamma); r = set_video_colors(sh_video, prop->name, *gamma); if(r <= 0) break; return r; default: return M_PROPERTY_NOT_IMPLEMENTED; } #ifdef USE_TV if(demuxer->type == DEMUXER_TYPE_TV) { int l = strlen(prop->name); char tv_prop[3+l+1]; sprintf(tv_prop,"tv_%s",prop->name); return mp_property_do(tv_prop,action,arg); }#endif return M_PROPERTY_UNAVAILABLE;}/// VSync (RW)static int mp_property_vsync(m_option_t* prop,int action,void* arg) { return m_property_flag(prop,action,arg,&vo_vsync);}/// Video codec tag (RO)static int mp_property_video_format(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_video->format);}/// Video bitrate (RO)static int mp_property_video_bitrate(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_video->i_bps);}/// Video display width (RO)static int mp_property_width(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_video->disp_w);}/// Video display height (RO)static int mp_property_height(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_int_ro(prop,action,arg,sh_video->disp_h);}/// Video fps (RO)static int mp_property_fps(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_float_ro(prop,action,arg,sh_video->fps);}/// Video aspect (RO)static int mp_property_aspect(m_option_t* prop,int action,void* arg) { if(!sh_video) return M_PROPERTY_UNAVAILABLE; return m_property_float_ro(prop,action,arg,sh_video->aspect);}///@}/// \defgroup SubProprties Subtitles properties/// \ingroup Properties///@{/// Text subtitle position (RW)static int mp_property_sub_pos(m_option_t* prop,int action,void* arg) {#ifdef USE_SUB if(!sh_video) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_SET: if(!arg) return 0; case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_DOWN: vo_osd_changed(OSDTYPE_SUBTITLE); default: return m_property_int_range(prop,action,arg,&sub_pos); }#else return M_PROPERTY_UNAVAILABLE;#endif}/// Selected subtitles (RW)static int mp_property_sub(m_option_t* prop,int action,void* arg) { int source = -1, reset_spu = 0; if(global_sub_size <= 0) return M_PROPERTY_UNAVAILABLE; switch(action) { case M_PROPERTY_GET: if(!arg) return 0; *(int*)arg = global_sub_pos;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -