GF_EXPORT u32 gf_term_process_step(GF_Terminal *term) { u32 nb_decs=0; u32 time_taken = gf_sys_clock(); if (term->flags & GF_TERM_NO_DECODER_THREAD) { MM_SimulationStep_Decoder(term, &nb_decs); } if (term->flags & GF_TERM_NO_COMPOSITOR_THREAD) { u32 ms_until_next; gf_sc_draw_frame(term->compositor, &ms_until_next); if (ms_until_next<term->compositor->frame_duration/2) { time_taken=0; } } time_taken = gf_sys_clock() - time_taken; if (time_taken > term->compositor->frame_duration) { time_taken = 0; } else { time_taken = term->compositor->frame_duration - time_taken; } if (term->bench_mode || (term->user->init_flags & GF_TERM_NO_REGULATION)) return time_taken; if (2*time_taken >= term->compositor->frame_duration) { gf_sleep(nb_decs ? 1 : time_taken); } return time_taken; }
u32 MM_Loop(void *par) { GF_Terminal *term = (GF_Terminal *) par; Bool do_scene = (term->flags & GF_TERM_NO_VISUAL_THREAD) ? 1 : 0; Bool do_codec = (term->flags & GF_TERM_NO_DECODER_THREAD) ? 0 : 1; Bool do_regulate = (term->user->init_flags & GF_TERM_NO_REGULATION) ? 0 : 1; gf_th_set_priority(term->mm_thread, term->priority); GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[MediaManager] Entering thread ID %d\n", gf_th_id() )); // GF_LOG(GF_LOG_DEBUG, GF_LOG_RTI, ("(RTI] Terminal Cycle Log\tServices\tDecoders\tCompositor\tSleep\n")); while (term->flags & GF_TERM_RUNNING) { u32 left; if (do_codec) left = MM_SimulationStep_Decoder(term); else left = term->frame_duration; if (do_scene) { u32 time_taken = gf_sys_clock(); gf_sc_draw_frame(term->compositor); time_taken = gf_sys_clock() - time_taken; if (left>time_taken) left -= time_taken; else left = 0; } if (do_regulate) gf_sleep(left); } term->flags |= GF_TERM_DEAD; return 0; }
u32 MM_Loop(void *par) { GF_Terminal *term = (GF_Terminal *) par; Bool do_scene = (term->flags & GF_TERM_NO_VISUAL_THREAD) ? 1 : 0; Bool do_codec = (term->flags & GF_TERM_NO_DECODER_THREAD) ? 0 : 1; Bool do_regulate = (term->user->init_flags & GF_TERM_NO_REGULATION) ? 0 : 1; gf_th_set_priority(term->mm_thread, term->priority); GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[MediaManager] Entering thread ID %d\n", gf_th_id() )); // GF_LOG(GF_LOG_DEBUG, GF_LOG_RTI, ("(RTI] Terminal Cycle Log\tServices\tDecoders\tCompositor\tSleep\n")); while (term->flags & GF_TERM_RUNNING) { u32 nb_decs = 0; u32 left = 0; if (do_codec) left = MM_SimulationStep_Decoder(term, &nb_decs); else left = term->frame_duration; if (do_scene) { u32 ms_until_next=0; u32 time_taken = gf_sys_clock(); gf_sc_draw_frame(term->compositor, &ms_until_next); time_taken = gf_sys_clock() - time_taken; if (ms_until_next<term->frame_duration/2) { left = 0; } else if (left>time_taken) left -= time_taken; else left = 0; } if (do_regulate) { if (term->bench_mode) { gf_sleep(0); } else { if (left==term->frame_duration) { //if nothing was done during this pass but we have active decoder, just yield. We don't want to sleep since //composition memory could be released at any time. We should have a signal here, rather than a wait gf_sleep(nb_decs ? 0 : term->frame_duration/2); } } } } term->flags |= GF_TERM_DEAD; return 0; }
GF_EXPORT GF_Err gf_term_process_step(GF_Terminal *term) { u32 left = 0; if (term->flags & GF_TERM_NO_DECODER_THREAD) { left = MM_SimulationStep_Decoder(term); } else { left = term->frame_duration; } if (term->flags & GF_TERM_NO_COMPOSITOR_THREAD) { left = MM_SimulationStep_Compositor(term, left); } if (term->user->init_flags & GF_TERM_NO_REGULATION) return GF_OK; gf_sleep(left); return GF_OK; }
GF_EXPORT u32 gf_term_process_step(GF_Terminal *term) { u32 time_taken = gf_sys_clock(); if (term->flags & GF_TERM_NO_DECODER_THREAD) { MM_SimulationStep_Decoder(term); } if (term->flags & GF_TERM_NO_COMPOSITOR_THREAD) { gf_sc_draw_frame(term->compositor); } time_taken = gf_sys_clock() - time_taken; if (time_taken > term->compositor->frame_duration) { time_taken = 0; } else { time_taken = term->compositor->frame_duration - time_taken; } if (term->user->init_flags & GF_TERM_NO_REGULATION) return time_taken; gf_sleep(time_taken); return time_taken; }