use frame delta to determine how much to sleep
This commit is contained in:
parent
84c812725e
commit
6608cb4e35
|
@ -145,7 +145,7 @@ bool EventStream::loadEventData(uint64_t event_id) {
|
||||||
event_data->storage_id = dbrow[1] ? atoi( dbrow[1] ) : 0;
|
event_data->storage_id = dbrow[1] ? atoi( dbrow[1] ) : 0;
|
||||||
event_data->frame_count = dbrow[2] == NULL ? 0 : atoi(dbrow[2]);
|
event_data->frame_count = dbrow[2] == NULL ? 0 : atoi(dbrow[2]);
|
||||||
event_data->start_time = atoi(dbrow[3]);
|
event_data->start_time = atoi(dbrow[3]);
|
||||||
event_data->duration = atof(dbrow[4]);
|
event_data->duration = dbrow[4] ? atof(dbrow[4]) : 0.0;
|
||||||
strncpy( event_data->video_file, dbrow[5], sizeof(event_data->video_file)-1 );
|
strncpy( event_data->video_file, dbrow[5], sizeof(event_data->video_file)-1 );
|
||||||
std::string scheme_str = std::string(dbrow[6]);
|
std::string scheme_str = std::string(dbrow[6]);
|
||||||
if ( scheme_str == "Deep" ) {
|
if ( scheme_str == "Deep" ) {
|
||||||
|
@ -762,7 +762,7 @@ Debug(1, "Loading image");
|
||||||
}
|
}
|
||||||
last_frame_sent = TV_2_FLOAT(now);
|
last_frame_sent = TV_2_FLOAT(now);
|
||||||
return true;
|
return true;
|
||||||
}
|
} // sendFrame(int delta_us)
|
||||||
|
|
||||||
void EventStream::runStream() {
|
void EventStream::runStream() {
|
||||||
openComms();
|
openComms();
|
||||||
|
@ -780,11 +780,12 @@ void EventStream::runStream() {
|
||||||
|
|
||||||
Debug(3, "frame rate is: (%f)", (double)event_data->frame_count/event_data->duration);
|
Debug(3, "frame rate is: (%f)", (double)event_data->frame_count/event_data->duration);
|
||||||
updateFrameRate((double)event_data->frame_count/event_data->duration);
|
updateFrameRate((double)event_data->frame_count/event_data->duration);
|
||||||
|
gettimeofday(&start, NULL);
|
||||||
|
|
||||||
while( !zm_terminate ) {
|
while( !zm_terminate ) {
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
|
||||||
unsigned int delta_us = 0;
|
int delta_us = 0;
|
||||||
send_frame = false;
|
send_frame = false;
|
||||||
|
|
||||||
// commands may set send_frame to true
|
// commands may set send_frame to true
|
||||||
|
@ -850,6 +851,7 @@ Debug(3,"cur_frame_id (%d-1) mod frame_mod(%d)",curr_frame_id, frame_mod);
|
||||||
Debug(3,"delta %u = base_fps(%f)/effective fps(%f)", delta_us, base_fps, effective_fps);
|
Debug(3,"delta %u = base_fps(%f)/effective fps(%f)", delta_us, base_fps, effective_fps);
|
||||||
// but must not exceed maxfps
|
// but must not exceed maxfps
|
||||||
delta_us = max(delta_us, 1000000 / maxfps);
|
delta_us = max(delta_us, 1000000 / maxfps);
|
||||||
|
Debug(3,"delta %u = base_fps(%f)/effective fps(%f)", delta_us, base_fps, effective_fps);
|
||||||
send_frame = true;
|
send_frame = true;
|
||||||
}
|
}
|
||||||
} else if ( step != 0 ) {
|
} else if ( step != 0 ) {
|
||||||
|
@ -870,18 +872,34 @@ Debug(3,"cur_frame_id (%d-1) mod frame_mod(%d)",curr_frame_id, frame_mod);
|
||||||
if ( !sendFrame(delta_us) )
|
if ( !sendFrame(delta_us) )
|
||||||
zm_terminate = true;
|
zm_terminate = true;
|
||||||
|
|
||||||
|
|
||||||
curr_stream_time = frame_data->timestamp;
|
curr_stream_time = frame_data->timestamp;
|
||||||
|
|
||||||
if ( !paused ) {
|
if ( !paused ) {
|
||||||
curr_frame_id += (replay_rate>0) ? 1 : -1;
|
curr_frame_id += (replay_rate>0) ? 1 : -1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( (mode == MODE_SINGLE) && ((unsigned int)curr_frame_id == event_data->frame_count) ) {
|
if ( (mode == MODE_SINGLE) && ((unsigned int)curr_frame_id == event_data->frame_count) ) {
|
||||||
Debug(2, "Have mode==MODE_SINGLE and at end of event, looping back to start");
|
Debug(2, "Have mode==MODE_SINGLE and at end of event, looping back to start");
|
||||||
curr_frame_id = 1;
|
curr_frame_id = 1;
|
||||||
}
|
}
|
||||||
|
frame_data = &event_data->frames[curr_frame_id-1];
|
||||||
|
|
||||||
|
uint64_t now_usec = (now.tv_sec * 1000000 + now.tv_usec);
|
||||||
|
uint64_t start_usec = (start.tv_sec * 1000000 + start.tv_usec);
|
||||||
|
uint64_t frame_delta = frame_data->delta*1000000;
|
||||||
|
|
||||||
|
delta_us = frame_delta - (now_usec - start_usec);
|
||||||
|
Debug(2, "New delta_us now %" PRIu64 " - start %" PRIu64 " = %d - frame %" PRIu64 " = %d",
|
||||||
|
now_usec, start_usec, now_usec-start_usec, frame_delta,
|
||||||
|
delta_us);
|
||||||
|
|
||||||
if ( send_frame && type != STREAM_MPEG ) {
|
if ( send_frame && type != STREAM_MPEG ) {
|
||||||
Debug( 3, "dUs: %d", delta_us );
|
if ( delta_us > 0 ) {
|
||||||
if ( delta_us )
|
Debug( 3, "dUs: %d", delta_us );
|
||||||
usleep( delta_us );
|
usleep( delta_us );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
usleep( (unsigned long)((1000000 * ZM_RATE_BASE)/((base_fps?base_fps:1)*abs(replay_rate*2))) );
|
usleep( (unsigned long)((1000000 * ZM_RATE_BASE)/((base_fps?base_fps:1)*abs(replay_rate*2))) );
|
||||||
|
|
Loading…
Reference in New Issue