Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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 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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
0
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;
}