int update_player_states(play_para_t *para, int force)
{
    callback_t *cb = &para->update_state;
    update_state_fun_t fn;
    para->state.last_sta = para->state.status;
    para->state.status = get_player_state(para);

    if (check_time_interrupt(&cb->callback_old_time, cb->update_interval) || force) {        
        player_info_t state;
        MEMCPY(&state, &para->state, sizeof(state));
        //if(force == 1)
        log_print("**[update_state]pid:%d status=%s(last:%s) err=0x%x curtime=%d (ms:%d) fulltime=%d lsttime=%d\n",
                  para->player_id,
                  player_status2str(state.status),
                  player_status2str(state.last_sta),
                  (-state.error_no),
                  state.current_time,
                  state.current_ms,
                  state.full_time,
                  state.last_time);
        fn = cb->update_statue_callback;
        if (fn) {
            fn(para->player_id, &state);
        }
        send_event(para, PLAYER_EVENTS_PLAYER_INFO, &state, 0);
        para->state.error_no = 0;
    }
    return 0;
}
Exemplo n.º 2
0
int update_player_states(play_para_t *para, int force)
{
    callback_t *cb = &para->update_state;
    update_state_fun_t fn;
    para->state.last_sta = para->state.status;
    para->state.status = get_player_state(para);

    if (check_time_interrupt(&cb->callback_old_time, cb->update_interval) || force) {
        player_info_t state;
        MEMCPY(&state, &para->state, sizeof(state));
        //if(force == 1)
        log_print("**[update_state]pid:%d status=%s(tttlast:%s) err=0x%x curtime=%d (ms:%d) fulltime=%d lsttime=%d\n",
                  para->player_id,
                  player_status2str(state.status),
                  player_status2str(state.last_sta),
                  (-state.error_no),
                  state.current_time,
                  state.current_ms,
                  state.full_time,
                  state.last_time);		
        log_print("**[update_state]abuflevel=%.08f vbublevel=%.08f abufrp=%x vbufrp=%x read_end=%d\n",
                  state.audio_bufferlevel,
                  state.video_bufferlevel,
                  para->abuffer.buffer_rp,
                  para->vbuffer.buffer_rp,
                  para->playctrl_info.read_end_flag);
        fn = cb->update_statue_callback;

        if (fn) {
            fn(para->player_id, &state);
        }
        send_event(para, PLAYER_EVENTS_PLAYER_INFO, &state, 0);
        para->state.error_no = 0;
        player_hwbuflevel_update(para);
    }
	return 0;
}
static void update_current_time(play_para_t *p_para)
{
	#define REFRESH_CURTIME_INTERVAL    (100)
    unsigned int time = p_para->state.current_time;
	if (check_time_interrupt(&p_para->state.curtime_old_time, REFRESH_CURTIME_INTERVAL) || 
		!p_para->playctrl_info.pts_valid || 
		(p_para->playctrl_info.end_flag && !p_para->playctrl_info.search_flag)) {
	    if (p_para->playctrl_info.f_step > 0) {
	        time = (unsigned int)p_para->playctrl_info.time_point;
	        p_para->state.current_time = time;
	        p_para->state.current_ms = (unsigned int)(p_para->playctrl_info.time_point * 1000);
	        log_print("[update_current_time]ff/fb:time=%d\n", time);
#ifdef DEBUG_VARIABLE_DUR
	        if (p_para->playctrl_info.info_variable) {
	            update_variable_info(p_para);
	        }
#endif
	    } else  if (!p_para->playctrl_info.end_flag) {
	        time = get_current_time(p_para);
		  p_para->state.current_pts = time;
	        if (p_para->state.start_time == -1) {
	            if (p_para->astream_info.start_time != -1) {
	                p_para->state.start_time = p_para->astream_info.start_time;
	            } else if (p_para->vstream_info.start_time != -1) {
	                p_para->state.start_time = p_para->vstream_info.start_time;
	            }
	        }

	        log_debug("[update_current_time]time=%d astart_time=%d  vstart_time=%d last_time=%d\n", time / PTS_FREQ, ((unsigned int)p_para->astream_info.start_time / PTS_FREQ), ((unsigned int)p_para->vstream_info.start_time / PTS_FREQ), p_para->state.last_time);
			if (p_para->state.first_time == 0) {
				p_para->state.first_time = time;
			}

			if ((unsigned int)p_para->state.first_time > 0) {
				if ((unsigned int)p_para->state.first_time < (unsigned int)p_para->state.start_time) {
	                log_print("[update_current_time:%d]time=0x%x start_time=0x%x\n", __LINE__, time, ((unsigned int)p_para->astream_info.start_time));
	                p_para->state.start_time = p_para->state.first_time;
	            } else if (((unsigned int)p_para->state.first_time - (unsigned int)p_para->state.start_time) >  0 &&
	                       (p_para->state.start_time == 0) && p_para->playctrl_info.time_point == 0) {
	                p_para->state.start_time = p_para->state.first_time;
	                log_print("[update_current_time:%d]reset start_time=0x%x time=0x%x\n", __LINE__, p_para->state.start_time, time);
	            } 		
			}
			
	        if ((unsigned int)time > 0 && (unsigned int)p_para->state.start_time > 0) {				 
	            if ((unsigned int)p_para->state.start_time < (unsigned int)time) {
	                log_debug("[update_current_time:%d]time=0x%x start_time=0x%x\n", __LINE__, time, p_para->state.start_time);
	                time -= p_para->state.start_time;
	                log_debug("[update_current_time:%d]time=0x%x (%d)\n", __LINE__, time, time / PTS_FREQ);

	            }
	        }

	        log_debug("[update_current_time:%d]time=%d discontinue=%d\n", __LINE__, time / PTS_FREQ, p_para->discontinue_point);
	        if (p_para->discontinue_point > 0) 
			{
            	log_debug("[update_current_time:%d]time=%d dpoint=%d  ldpoint=%d\n", 
						__LINE__, time / PTS_FREQ, p_para->discontinue_point, p_para->discontinue_last_point);
	            if (p_para->pFormatCtx && p_para->pFormatCtx->pb && 
					url_support_time_seek(p_para->pFormatCtx->pb) && 
					(time / PTS_FREQ > 0) && (!p_para->discontinue_flag))					
				{
					if ((time / PTS_FREQ) < (p_para->discontinue_point - p_para->discontinue_last_point))  				 
					{
		                p_para->discontinue_point = p_para->discontinue_point - time / PTS_FREQ;
		                log_print("[update_current_time:%d]time<dpoint dpoint=%d\n", __LINE__, p_para->discontinue_point);
					} else if (time > p_para->discontinue_point * PTS_FREQ)
					{
						p_para->discontinue_point = 0;
		                log_print("[update_current_time:%d]time>dpoint dpoint=%d\n", __LINE__, p_para->discontinue_point);
					}
					p_para->discontinue_flag = 1;
	            }			
                time += p_para->discontinue_point * PTS_FREQ;
	        }
	        log_debug("[update_current_time]time=%d curtime=%d lasttime=%d\n", time / PTS_FREQ, p_para->state.current_time, p_para->state.last_time);
	        p_para->state.current_ms = time / PTS_FREQ_MS;
	      
	        time /= PTS_FREQ;
	    } else if (!p_para->playctrl_info.reset_flag && !p_para->playctrl_info.search_flag){
	    	time = p_para->state.full_time;
	        log_print("[update_current_time:%d]play end, curtime: %d\n", __LINE__, time);
	    }

	    if (p_para->state.current_time != p_para->state.last_time) {
	        p_para->state.last_time = p_para->state.current_time;
	    }
	    p_para->state.current_time = (int)time;

	    log_debug("[update_current_time:%d]curtime=%d lasttime=%d tpos=%d full_time=%d\n", __LINE__, p_para->state.current_time, p_para->state.last_time, p_para->playctrl_info.time_point, p_para->state.full_time);

	    if (p_para->state.current_time == 0 && p_para->playctrl_info.time_point > 0) {
	        p_para->state.current_time = p_para->playctrl_info.time_point;
	        p_para->state.current_ms = p_para->playctrl_info.time_point * 1000;
	        log_print("[update_current_time:%d]curtime: 0->%d\n", __LINE__, p_para->playctrl_info.time_point);
	    }
	    if ((p_para->state.current_time > p_para->state.full_time) && (p_para->state.full_time > 0)) {
	        //log_print("[update_current_time:%d]time=%d fulltime=%d\n", __LINE__, time, p_para->state.full_time);
	        if (p_para->state.current_time > p_para->state.full_time) {
	            p_para->state.current_time = p_para->state.full_time;
	            p_para->state.current_ms = p_para->state.current_time * 1000;
	        }
	    }
	    log_debug("[update_current_time:%d]time=%d last_time=%d time_point=%d\n", __LINE__, p_para->state.current_time, p_para->state.last_time, p_para->playctrl_info.time_point);

#ifdef DEBUG_VARIABLE_DUR
	    if (p_para->playctrl_info.info_variable) {
	        update_variable_info(p_para);
	    }
#endif
	}
}