in src/compositor/compositor.c [1102:1423]
void gf_sc_reload_config(GF_Compositor *compositor)
{
const char *sOpt;
/*changing drivers needs exclusive access*/
gf_sc_lock(compositor, 1);
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FrameRate");
if (!sOpt) {
sOpt = "30.0";
gf_cfg_set_key(compositor->user->config, "Compositor", "FrameRate", "30.0");
}
gf_sc_set_fps(compositor, atof(sOpt));
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ForceSceneSize");
if (sOpt && ! stricmp(sOpt, "yes")) {
compositor->override_size_flags = 1;
} else {
compositor->override_size_flags = 0;
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "AntiAlias");
if (sOpt) {
if (! stricmp(sOpt, "None")) gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_NONE);
else if (! stricmp(sOpt, "Text")) gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_TEXT);
else gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_FULL);
} else {
gf_cfg_set_key(compositor->user->config, "Compositor", "AntiAlias", "All");
gf_sc_set_option(compositor, GF_OPT_ANTIALIAS, GF_ANTIALIAS_FULL);
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightFill");
if (sOpt) sscanf(sOpt, "%x", &compositor->highlight_fill);
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightStroke");
if (sOpt) sscanf(sOpt, "%x", &compositor->highlight_stroke);
else compositor->highlight_stroke = 0xFF000000;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusHighlightStrokeWidth");
if (sOpt) {
Float v;
sscanf(sOpt, "%f", &v);
compositor->highlight_stroke_width = FLT2FIX(v);
}
else compositor->highlight_stroke_width = FIX_ONE;
compositor->text_sel_color = 0xFFAAAAFF;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextSelectHighlight");
if (sOpt) sscanf(sOpt, "%x", &compositor->text_sel_color);
if (!compositor->text_sel_color) compositor->text_sel_color = 0xFFAAAAFF;
/*load options*/
if (compositor->video_out->hw_caps & GF_VIDEO_HW_DIRECT_ONLY) {
compositor->traverse_state->immediate_draw = 1;
} else {
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DrawMode");
if (!sOpt) {
sOpt = "defer";
gf_cfg_set_key(compositor->user->config, "Compositor", "DrawMode", sOpt);
}
if (!strcmp(sOpt, "immediate")) compositor->traverse_state->immediate_draw = 1;
else if (!strcmp(sOpt, "defer-debug")) {
compositor->traverse_state->immediate_draw = 0;
compositor->debug_defer = 1;
}
else compositor->traverse_state->immediate_draw = 0;
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ScalableZoom");
compositor->scalable_zoom = (!sOpt || !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableYUV");
compositor->enable_yuv_hw = (sOpt && !stricmp(sOpt, "yes") ) ? 0 : 1;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisablePartialHardwareBlit");
compositor->disable_partial_hw_blit = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "StressMode");
gf_sc_set_option(compositor, GF_OPT_STRESS_MODE, (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0);
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "HighSpeed");
gf_sc_set_option(compositor, GF_OPT_HIGHSPEED, (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0);
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "BoundingVolume");
if (sOpt) {
if (! stricmp(sOpt, "Box")) gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_BOX);
else if (! stricmp(sOpt, "AABB")) gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_AABB);
else gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_NONE);
} else {
gf_cfg_set_key(compositor->user->config, "Compositor", "BoundingVolume", "None");
gf_sc_set_option(compositor, GF_OPT_DRAW_BOUNDS, GF_BOUNDS_NONE);
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextureTextMode");
if (sOpt && !stricmp(sOpt, "Always")) compositor->texture_text_mode = GF_TEXTURE_TEXT_ALWAYS;
else if (sOpt && !stricmp(sOpt, "Never")) compositor->texture_text_mode = GF_TEXTURE_TEXT_NEVER;
else compositor->texture_text_mode = GF_TEXTURE_TEXT_DEFAULT;
if (compositor->audio_renderer) {
sOpt = gf_cfg_get_key(compositor->user->config, "Audio", "NoResync");
compositor->audio_renderer->disable_resync = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Audio", "DisableMultiChannel");
compositor->audio_renderer->disable_multichannel = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
}
#ifdef GF_SR_USE_VIDEO_CACHE
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "VideoCacheSize");
compositor->video_cache_max_size = sOpt ? atoi(sOpt) : 0;
compositor->video_cache_max_size *= 1024;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CacheScale");
compositor->cache_scale = sOpt ? atoi(sOpt) : 100;
if (!compositor->cache_scale) compositor->cache_scale = 100;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CacheTolerance");
compositor->cache_tolerance = sOpt ? atoi(sOpt) : 30;
#endif
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "TextureFromDecoderMemory");
compositor->texture_from_decoder_memory = (sOpt && !strcmp(sOpt, "yes")) ? GF_TRUE : GF_FALSE;
if (!sOpt)
gf_cfg_set_key(compositor->user->config, "Compositor", "TextureFromDecoderMemory", "no");
#ifndef GPAC_DISABLE_3D
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "OpenGLMode");
if (! (compositor->video_out->hw_caps & GF_VIDEO_HW_OPENGL)) {
if (sOpt && strcmp(sOpt, "disable")) {
GF_LOG(GF_LOG_WARNING, GF_LOG_COMPOSE, ("[Compositor] OpenGL mode %s requested but no opengl-capable output - disabling openGL\n", sOpt));
}
compositor->force_opengl_2d = 0;
compositor->autoconfig_opengl = 0;
compositor->hybrid_opengl = 0;
} else {
compositor->force_opengl_2d = (sOpt && !strcmp(sOpt, "always")) ? 1 : 0;
if (!sOpt) {
compositor->recompute_ar = 1;
compositor->autoconfig_opengl = 1;
} else {
compositor->hybrid_opengl = !strcmp(sOpt, "hybrid") ? 1 : 0;
#ifdef OPENGL_RASTER
compositor->opengl_raster = !strcmp(sOpt, "raster") ? 1 : 0;
if (compositor->opengl_raster) compositor->traverse_state->immediate_draw = GF_TRUE;
#endif
}
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EnablePBO");
if (!sOpt) gf_cfg_set_key(compositor->user->config, "Compositor", "EnablePBO", "no");
compositor->enable_pbo = (sOpt && !strcmp(sOpt, "yes")) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DefaultNavigationMode");
if (sOpt && !strcmp(sOpt, "Walk")) compositor->default_navigation_mode = GF_NAVIGATE_WALK;
else if (sOpt && !strcmp(sOpt, "Examine")) compositor->default_navigation_mode = GF_NAVIGATE_EXAMINE;
else if (sOpt && !strcmp(sOpt, "Fly")) compositor->default_navigation_mode = GF_NAVIGATE_FLY;
#ifdef GPAC_HAS_GLU
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "RasterOutlines");
compositor->raster_outlines = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
#endif
/*currently:
- no support for npow2 textures, and no support for DrawPixels
*/
#ifndef GPAC_USE_GLES1X
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EmulatePOW2");
compositor->emul_pow2 = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
#else
compositor->raster_outlines = 1;
compositor->emul_pow2 = 1;
#endif
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "PolygonAA");
compositor->poly_aa = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "BackFaceCulling");
if (sOpt && !stricmp(sOpt, "Off")) compositor->backcull = GF_BACK_CULL_OFF;
else if (sOpt && !stricmp(sOpt, "Alpha")) compositor->backcull = GF_BACK_CULL_ALPHA;
else compositor->backcull = GF_BACK_CULL_ON;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "Wireframe");
if (sOpt && !stricmp(sOpt, "WireOnly")) compositor->wiremode = GF_WIREFRAME_ONLY;
else if (sOpt && !stricmp(sOpt, "WireOnSolid")) compositor->wiremode = GF_WIREFRAME_SOLID;
else compositor->wiremode = GF_WIREFRAME_NONE;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DrawNormals");
if (sOpt && !stricmp(sOpt, "PerFace")) compositor->draw_normals = GF_NORMALS_FACE;
else if (sOpt && !stricmp(sOpt, "PerVertex")) compositor->draw_normals = GF_NORMALS_VERTEX;
else compositor->draw_normals = GF_NORMALS_NONE;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableGLUScale");
compositor->disable_glu_scale = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableRectExt");
compositor->disable_rect_ext = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableGLCulling");
compositor->disable_gl_cull = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisableYUVGL");
compositor->disable_yuvgl = (sOpt && !stricmp(sOpt, "yes") ) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DepthScale");
if (!sOpt) {
sOpt = "100";
gf_cfg_set_key(compositor->user->config, "Compositor", "DepthScale", sOpt);
}
compositor->depth_gl_scale = FLT2FIX( (Float) atof(sOpt) );
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DepthType");
if (!sOpt) {
sOpt = "VertexArray";
gf_cfg_set_key(compositor->user->config, "Compositor", "DepthType", sOpt);
}
if (sOpt && !strcmp(sOpt, "Points")) compositor->depth_gl_type = GF_SC_DEPTH_GL_POINTS;
else if (sOpt && !strnicmp(sOpt, "Strips", 6)) {
compositor->depth_gl_type = GF_SC_DEPTH_GL_STRIPS;
compositor->depth_gl_strips_filter = 0;
if (strlen(sOpt)>7) compositor->depth_gl_strips_filter = FLT2FIX( (Float) atof(sOpt+7) );
}
else if (sOpt && !strcmp(sOpt, "VertexArray")) compositor->depth_gl_type = GF_SC_DEPTH_GL_VBO;
else compositor->depth_gl_type = GF_SC_DEPTH_GL_NONE;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "NumViews");
if (!sOpt) {
sOpt = "1";
gf_cfg_set_key(compositor->user->config, "Compositor", "NumViews", "1");
}
compositor->visual->nb_views = atoi(sOpt);
if (!compositor->visual->nb_views) compositor->visual->nb_views = 1;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "StereoType");
if (!sOpt) {
sOpt = "none";
gf_cfg_set_key(compositor->user->config, "Compositor", "StereoType", "none");
}
if (!strcmp(sOpt, "SideBySide")) compositor->visual->autostereo_type = GF_3D_STEREO_SIDE;
else if (!strcmp(sOpt, "TopToBottom")) compositor->visual->autostereo_type = GF_3D_STEREO_TOP;
else if (!strcmp(sOpt, "Custom")) compositor->visual->autostereo_type = GF_3D_STEREO_CUSTOM;
/*built-in interleavers*/
else if (!strcmp(sOpt, "Anaglyph")) compositor->visual->autostereo_type = GF_3D_STEREO_ANAGLYPH;
else if (!strcmp(sOpt, "Columns")) compositor->visual->autostereo_type = GF_3D_STEREO_COLUMNS;
else if (!strcmp(sOpt, "Rows")) compositor->visual->autostereo_type = GF_3D_STEREO_ROWS;
else if (!strcmp(sOpt, "SPV19")) compositor->visual->autostereo_type = GF_3D_STEREO_5VSP19;
else {
compositor->visual->autostereo_type = GF_3D_STEREO_NONE;
compositor->visual->nb_views = 1;
}
if (compositor->visual->autostereo_type)
compositor->force_opengl_2d = 1;
switch (compositor->visual->autostereo_type) {
case GF_3D_STEREO_ANAGLYPH:
case GF_3D_STEREO_COLUMNS:
case GF_3D_STEREO_ROWS:
if (compositor->visual->nb_views != 2) {
compositor->visual->nb_views = 2;
gf_cfg_set_key(compositor->user->config, "Compositor", "NumViews", "2");
}
break;
}
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "CameraLayout");
if (!sOpt) {
sOpt = "Straight";
gf_cfg_set_key(compositor->user->config, "Compositor", "CameraLayout", "Straight");
}
if (!strcmp(sOpt, "Linear")) compositor->visual->camera_layout = GF_3D_CAMERA_LINEAR;
else if (!strcmp(sOpt, "Circular")) compositor->visual->camera_layout = GF_3D_CAMERA_CIRCULAR;
else if (!strcmp(sOpt, "OffAxis")) compositor->visual->camera_layout = GF_3D_CAMERA_OFFAXIS;
else compositor->visual->camera_layout = GF_3D_CAMERA_STRAIGHT;
compositor->interoccular_distance = FLT2FIX(6.3f);
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "EyeSeparation");
if (sOpt) compositor->interoccular_distance = FLT2FIX( atof(sOpt)) ;
else gf_cfg_set_key(compositor->user->config, "Compositor", "EyeSeparation", "6.3");
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ReverseViews");
if (sOpt && !strcmp(sOpt, "yes")) compositor->visual->reverse_views = 1;
#endif //GPAC_DISABLE_3D
#ifdef GF_SR_USE_DEPTH
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "AutoStereoCalibration");
compositor->auto_calibration = (sOpt && !strcmp(sOpt, "yes")) ? 1 : 0;
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "DisplayDepth");
compositor->display_depth = sOpt ? (!strcmp(sOpt, "auto") ? -1 : atoi(sOpt)) : 0;
#ifndef GPAC_DISABLE_3D
/*if auto-stereo mode, turn on display depth by default*/
if (compositor->visual->autostereo_type && !compositor->display_depth) {
compositor->display_depth = -1;
}
#endif
if (!compositor->video_out->view_distance) {
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "ViewDistance");
compositor->video_out->view_distance = FLT2FIX( sOpt ? (Float) atof(sOpt) : 50.0f );
}
#ifndef GPAC_DISABLE_3D
sOpt = gf_cfg_get_key(compositor->user->config, "Compositor", "FocusDistance");
compositor->focus_distance = 0;
if (sOpt)
compositor->focus_distance = FLT2FIX( atof(sOpt) );
else
gf_cfg_set_key(compositor->user->config, "Compositor", "FocusDistance", "0");
#endif
#endif
gf_sc_reset_graphics(compositor);
gf_sc_next_frame_state(compositor, GF_SC_DRAW_FRAME);
gf_sc_lock(compositor, 0);
}