static Bool osd_process(GF_TermExt *termext, u32 action, void *param) { const char *opt; GF_OSD *osd = termext->udta; switch (action) { case GF_TERM_EXT_START: osd->term = (GF_Terminal *) param; opt = gf_modules_get_option((GF_BaseInterface*)termext, "OSD", "Enabled"); if (opt && strcmp(opt, "yes")) return 0; /*load scene*/ if (! osd_load_scene(osd)) return 0; /*attach scene to compositor*/ gf_sc_register_extra_graph(osd->term->compositor, osd->odm->subscene->graph, 0); /*we are not threaded*/ termext->caps |= GF_TERM_EXTENSION_NOT_THREADED; osd->refresh_time_ms = 500; osd->evt_filter.on_event = osd_on_event_play; osd->evt_filter.udta = osd; gf_term_add_event_filter(osd->term, &osd->evt_filter); return 1; case GF_TERM_EXT_STOP: osd->text->string.vals[0] = NULL; /*remove scene to compositor*/ gf_sc_register_extra_graph(osd->term->compositor, osd->odm->subscene->graph, 1); gf_odm_disconnect(osd->odm, 1); osd->odm = NULL; gf_term_remove_event_filter(osd->term, &osd->evt_filter); osd->term = NULL; break; case GF_TERM_EXT_PROCESS: /*flush all events until current time if reached*/ if ((osd->visible->whichChoice==0) && gf_sys_get_rti(osd->refresh_time_ms, &osd->rti, 0)) { sprintf(osd->statBuffer, "CPU %02d - FPS %02.2f - MEM "LLU" KB", osd->rti.process_cpu_usage, gf_sc_get_fps(osd->term->compositor, 0), osd->rti.process_memory/1000); gf_node_dirty_set((GF_Node *) osd->text, GF_SG_NODE_DIRTY, 1); } break; } return 0; }
void evaluate_term_cap(GF_Node *node, GF_Route *route) { GF_SystemRTInfo rti; Double fps; u32 height; Bool b_on; u32 b_charge, b_level; M_TermCap *tc = (M_TermCap *)node; GF_Scene *scene = gf_node_get_private(node); tc->value = 0; switch (tc->capability) { case 0: /*framerate*/ fps = gf_sc_get_fps(scene->root_od->term->compositor, 1); if (fps<=5.0) tc->value = 1; else if (fps<=10.0) tc->value = 2; else if (fps<=20.0) tc->value = 3; else if (fps<=40.0) tc->value = 4; else tc->value = 5; break; case 1: /*colordepth*/ return; case 2: /*screensize*/ height = scene->root_od->term->compositor->display_height; if (height<200) tc->value = 1; else if (height<400) tc->value = 2; else if (height<800) tc->value = 3; else if (height<1600) tc->value = 4; else tc->value = 4; break; case 3: /*graphics hardware*/ return; case 32:/*audio out format*/ return; case 33:/*audio out format*/ return; case 34:/*spatial audio cap*/ return; case 64:/*CPU load*/ if (!gf_sys_get_rti(200, &rti, 0) ) return; if (rti.total_cpu_usage<20) tc->value = 1; else if (rti.total_cpu_usage<40) tc->value = 2; else if (rti.total_cpu_usage<60) tc->value = 3; else if (rti.total_cpu_usage<80) tc->value = 4; else tc->value = 5; break; case 65:/*mem load*/ if (!gf_sys_get_rti(200, &rti, GF_RTI_SYSTEM_MEMORY_ONLY) ) return; rti.physical_memory_avail /= 1024; if (rti.physical_memory_avail < 100) tc->value = 1; else if (rti.physical_memory_avail < 512) tc->value = 2; else if (rti.physical_memory_avail < 2048) tc->value = 3; else if (rti.physical_memory_avail < 8192) tc->value = 4; else if (rti.physical_memory_avail < 32768) tc->value = 5; else if (rti.physical_memory_avail < 204800) tc->value = 6; else tc->value = 7; break; /*GPAC extensions*/ case 100: /*display width*/ tc->value = scene->root_od->term->compositor->display_width; break; case 101: /*display height*/ tc->value = scene->root_od->term->compositor->display_height; break; case 102: /*frame rate*/ tc->value = (u32) gf_sc_get_fps(scene->root_od->term->compositor, 1); break; case 103: /*total CPU*/ if (!gf_sys_get_rti(200, &rti, 0) ) return; tc->value = rti.total_cpu_usage; break; case 104: /*process CPU*/ if (!gf_sys_get_rti(200, &rti, 0) ) return; tc->value = rti.process_cpu_usage; break; case 106: /*total memory in kB*/ if (!gf_sys_get_rti(200, &rti, GF_RTI_SYSTEM_MEMORY_ONLY) ) return; tc->value = (u32) (rti.physical_memory/1024); break; case 107: /*total memory available in kB*/ if (!gf_sys_get_rti(200, &rti, GF_RTI_SYSTEM_MEMORY_ONLY) ) return; tc->value = (u32) (rti.physical_memory_avail/1024); break; case 108: /*process memory in kB*/ if (!gf_sys_get_rti(200, &rti, 0) ) return; tc->value = (u32) (rti.process_memory/1024); break; case 109: /*battery on/off*/ gf_sys_get_battery_state(&b_on, &b_charge, &b_level, NULL, NULL); tc->value = b_on; break; case 110: /*battery charging*/ gf_sys_get_battery_state(&b_on, &b_charge, &b_level, NULL, NULL); tc->value = b_charge; break; case 111: /*battery level*/ gf_sys_get_battery_state(&b_on, &b_charge, &b_level, NULL, NULL); tc->value = b_level; break; case 112: /*audio vol*/ tc->value = gf_sc_get_option(scene->root_od->term->compositor, GF_OPT_AUDIO_VOLUME); break; case 113: /*audio pan*/ tc->value = gf_sc_get_option(scene->root_od->term->compositor, GF_OPT_AUDIO_PAN); break; default: return; } gf_node_event_out(node, 2); }