void update_state_info() { TCHAR wstate[1024]; Double FPS; u32 time, m, s; if (!show_status) return; if (last_state_time) { if (GetTickCount() > last_state_time + 200) { last_state_time = 0; reset_status = 1; } else return; } if (!term) return; if (!is_connected && reset_status) { SendMessage(g_hwnd_status, WM_SETTEXT, 0, (LPARAM) TEXT("Ready") ); reset_status = 0; return; } FPS = gf_term_get_framerate(term, 0); time = gf_term_get_time_in_ms(term) / 1000; m = time/60; s = time - m*60; if (view_cpu) { GF_SystemRTInfo rti; if (!gf_sys_get_rti(STATE_TIMER_DUR, &rti, 0)) return; wsprintf(wstate, TEXT("T %02d:%02d : FPS %02.2f : CPU %02d"), m, s, FPS, rti.total_cpu_usage); } else { wsprintf(wstate, TEXT("T %02d:%02d : FPS %02.2f"), m, s, FPS); } SendMessage(g_hwnd_status, WM_SETTEXT, 0, (LPARAM) wstate); }
static GF_Err HEVC_AttachStream(GF_BaseDecoder *ifcg, GF_ESD *esd) { GF_SystemRTInfo rti; const char *sOpt; u32 nb_threads = 1; HEVCDec *ctx = (HEVCDec*) ifcg->privateStack; if (gf_sys_get_rti(0, &rti, 0) ) { nb_threads = (rti.nb_cores>1) ? rti.nb_cores-1 : 1; } sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "OpenHEVC", "NumThreads"); if (!sOpt) { char szO[100]; sprintf(szO, "%d", nb_threads); gf_modules_set_option((GF_BaseInterface *)ifcg, "OpenHEVC", "NumThreads", szO); ctx->nb_threads = nb_threads; GF_LOG(GF_LOG_INFO, GF_LOG_CODEC, ("[OpenHEVC] Initializing with %d threads\n", ctx->nb_threads)); } else { ctx->nb_threads = atoi(sOpt); if (ctx->nb_threads > nb_threads) { GF_LOG(GF_LOG_WARNING, GF_LOG_CODEC, ("[OpenHEVC] Initializing with %d threads but only %d available cores detected on the system\n", ctx->nb_threads, rti.nb_cores)); } } sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "OpenHEVC", "ThreadingType"); if (sOpt && !strcmp(sOpt, "wpp")) ctx->threading_type = 2; else if (sOpt && !strcmp(sOpt, "frame+wpp")) ctx->threading_type = 4; else { ctx->threading_type = 1; if (!sOpt) gf_modules_set_option((GF_BaseInterface *)ifcg, "OpenHEVC", "ThreadingType", "frame"); } sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "Systems", "Output8bit"); if (!sOpt) gf_modules_set_option((GF_BaseInterface *)ifcg, "Systems", "Output8bit", (ctx->display_bpp>8) ? "no" : "yes"); if (sOpt && !strcmp(sOpt, "yes")) ctx->output_as_8bit = GF_TRUE; sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "OpenHEVC", "CBUnits"); if (!sOpt) gf_modules_set_option((GF_BaseInterface *)ifcg, "OpenHEVC", "CBUnits", "4"); if (sOpt) ctx->output_cb_size = atoi(sOpt); if (!ctx->output_cb_size) ctx->output_cb_size = 4; sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "OpenHEVC", "PackHFR"); if (sOpt && !strcmp(sOpt, "yes") ) ctx->pack_mode = GF_TRUE; else if (!sOpt) gf_modules_set_option((GF_BaseInterface *)ifcg, "OpenHEVC", "PackHFR", "no"); if (!ctx->raw_out) { sOpt = gf_modules_get_option((GF_BaseInterface *)ifcg, "OpenHEVC", "InputRipFile"); if (sOpt) ctx->raw_out = fopen(sOpt, "wb"); } /*RTP case: configure enhancement now*/ if (esd->dependsOnESID) { HEVC_ConfigurationScalableStream(ctx, esd); return GF_OK; } ctx->esd = esd; return HEVC_ConfigureStream(ctx, esd); }
TInt COsmo4AppView::OnTick() { #ifndef GPAC_GUI_ONLY if (m_term) gf_term_process_step(m_term); /*check RTI display*/ if (show_rti && gf_sys_get_rti(500, &m_rti, 0)) DisplayRTI(); #endif /*never stop...*/ return 1; }
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; }
static void on_gpac_rti_log(void *cbk, u32 ll, u32 lm, const char *fmt, va_list list) { if (!log_file) return; if (lm & GF_LOG_RTI) { GF_SystemRTInfo rti; if (fmt) vfprintf(log_file, fmt, list); gf_sys_get_rti(rti_update_time_ms, &rti, 0); fprintf(log_file, "% 8d\t% 8d\t% 8d\t% 4d\t% 8d\t\t", gf_sys_clock(), gf_term_get_time_in_ms(term), rti.total_cpu_usage, (u32) gf_term_get_framerate(term, 0), (u32) ( rti.gpac_memory / 1024) ); } else if (fmt && (ll>=GF_LOG_INFO)) { vfprintf(log_file, fmt, list); } }
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); }
void gf_sr_simulation_tick(GF_Renderer *sr) { u32 in_time, end_time, i, count; /*lock renderer for the whole render cycle*/ gf_sr_lock(sr, 1); /*first thing to do, let the video output handle user event if it is not threaded*/ sr->video_out->ProcessEvent(sr->video_out, NULL); if (sr->freeze_display) { gf_sr_lock(sr, 0); gf_sleep(sr->frame_duration); return; } gf_sr_reconfig_task(sr); /* if there is no scene, we draw a black screen to flush the screen */ if (!sr->scene) { sr->visual_renderer->DrawScene(sr->visual_renderer); gf_sr_lock(sr, 0); gf_sleep(sr->frame_duration); return; } // GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[General] Time %f - Composing new frame #%d\n", gf_node_get_scene_time(gf_sg_get_root_node(sr->scene)), sr->frame_number)); in_time = gf_sys_clock(); if (sr->reset_graphics) sr->draw_next_frame = 1; #ifdef GF_SR_EVENT_QUEUE /*process pending user events*/ gf_mx_p(sr->ev_mx); while (gf_list_count(sr->events)) { GF_Event *ev = (GF_Event*)gf_list_get(sr->events, 0); gf_list_rem(sr->events, 0); if (!sr->visual_renderer->ExecuteEvent(sr->visual_renderer, ev)) { SR_ForwardUserEvent(sr, ev); } free(ev); } gf_mx_v(sr->ev_mx); #endif #if 0 if (sr->frame_number == 0 && sr->user->EventProc) { GF_Event evt; evt.type = GF_EVENT_UPDATE_RTI; evt.caption.caption = "UPDATE - Before first call to draw scene"; sr->user->EventProc(sr->user->opaque, &evt); } #endif /*execute all routes before updating textures, otherwise nodes inside composite texture may never see their dirty flag set*/ gf_sg_activate_routes(sr->scene); #ifndef GPAC_DISABLE_SVG #if SVG_FIXME { /* Experimental (Not SVG compliant system events (i.e. battery, cpu ...) triggered to the root node)*/ GF_Node *root = gf_sg_get_root_node(sr->scene); GF_DOM_Event evt; if (gf_dom_listener_count(root)) { u32 i, count; count = gf_dom_listener_count(root); for (i=0;i<count; i++) { SVG_SA_listenerElement *l = gf_dom_listener_get(root, i); if (l->event.type == GF_EVENT_CPU) { GF_SystemRTInfo sys_rti; if (gf_sys_get_rti(500, &sys_rti, GF_RTI_ALL_PROCESSES_TIMES)) { evt.type = GF_EVENT_CPU; evt.cpu_percentage = sys_rti.total_cpu_usage; //printf("%d\n",sys_rti.total_cpu_usage); gf_dom_event_fire(root, NULL, &evt); } } else if (l->event.type == GF_EVENT_BATTERY) { //&& l->observer.target == (SVG_SA_Element *)node) { evt.type = GF_EVENT_BATTERY; gf_sys_get_battery_state(&evt.onBattery, &evt.batteryState, &evt.batteryLevel); gf_dom_event_fire(root, NULL, &evt); } } } } #endif if (gf_smil_notify_timed_elements(sr->scene)) { sr->draw_next_frame = 1; } #if 0 for (i=0; i<gf_list_count(sr->secondary_scenes); i++) { if (gf_smil_notify_timed_elements(gf_list_get(sr->secondary_scenes, i))) { sr->draw_next_frame = 1; } } #endif #endif /*update all textures*/ count = gf_list_count(sr->textures); for (i=0; i<count; i++) { GF_TextureHandler *st = (GF_TextureHandler *)gf_list_get(sr->textures, i); /*signal graphics reset before updating*/ if (sr->reset_graphics && st->hwtx) sr->visual_renderer->TextureHWReset(st); st->update_texture_fcnt(st); } /*if invalidated, draw*/ if (sr->draw_next_frame) { /*video flush only*/ if (sr->draw_next_frame==2) { GF_Window rc; rc.x = rc.y = 0; rc.w = sr->width; rc.h = sr->height; sr->draw_next_frame = 0; sr->video_out->Flush(sr->video_out, &rc); } else { sr->draw_next_frame = 0; GF_LOG(GF_LOG_DEBUG, GF_LOG_RENDER, ("[Render] Redrawing scene\n")); sr->visual_renderer->DrawScene(sr->visual_renderer); #if 0 if (sr->frame_number == 0 && sr->user->EventProc) { GF_Event evt; evt.type = GF_EVENT_UPDATE_RTI; evt.caption.caption = "Before first call to draw scene"; sr->user->EventProc(sr->user->opaque, &evt); } #endif } sr->reset_graphics = 0; GF_LOG(GF_LOG_INFO, GF_LOG_RENDER, ("[Render] Scene drawn in %d ms\n", gf_sys_clock() - in_time)); if (sr->stress_mode) { sr->draw_next_frame = 1; sr->reset_graphics = 1; } } /*release all textures - we must release them to handle a same OD being used by several textures*/ count = gf_list_count(sr->textures); for (i=0; i<count; i++) { GF_TextureHandler *st = (GF_TextureHandler *)gf_list_get(sr->textures, i); gf_sr_texture_release_stream(st); } /*update all timed nodes */ for (i=0; i<gf_list_count(sr->time_nodes); i++) { GF_TimeNode *tn = (GF_TimeNode *)gf_list_get(sr->time_nodes, i); if (!tn->needs_unregister) tn->UpdateTimeNode(tn); if (tn->needs_unregister) { tn->is_registered = 0; tn->needs_unregister = 0; gf_list_rem(sr->time_nodes, i); i--; continue; } } end_time = gf_sys_clock() - in_time; gf_sr_lock(sr, 0); sr->current_frame = (sr->current_frame+1) % GF_SR_FPS_COMPUTE_SIZE; sr->frame_time[sr->current_frame] = end_time; sr->frame_number++; #if 0 if (sr->user->EventProc) { char legend[100]; GF_Event evt; evt.type = GF_EVENT_UPDATE_RTI; sprintf(legend, "After rendering of frame %d", sr->frame_number); evt.caption.caption = legend; sr->user->EventProc(sr->user->opaque, &evt); } #endif /*step mode on, pause and return*/ if (sr->step_mode) { sr->step_mode = 0; if (sr->term) gf_term_set_option(sr->term, GF_OPT_PLAY_STATE, GF_STATE_PAUSED); return; } /*not threaded, let the owner decide*/ if ((sr->user->init_flags & GF_TERM_NO_VISUAL_THREAD) || !sr->frame_duration) return; /*compute sleep time till next frame, otherwise we'll kill the CPU*/ i=1; while (i * sr->frame_duration < end_time) i++; in_time = i * sr->frame_duration - end_time; gf_sleep(in_time); }