Accept clock estimation with a single point
If there is only one point, assume the slope is 1. PR #3757 <https://github.com/Genymobile/scrcpy/pull/3757>
This commit is contained in:
parent
48a537d45c
commit
9b3ca208bf
2 changed files with 15 additions and 12 deletions
|
@ -18,7 +18,15 @@ sc_clock_init(struct sc_clock *clock) {
|
||||||
static void
|
static void
|
||||||
sc_clock_estimate(struct sc_clock *clock,
|
sc_clock_estimate(struct sc_clock *clock,
|
||||||
double *out_slope, sc_tick *out_offset) {
|
double *out_slope, sc_tick *out_offset) {
|
||||||
assert(clock->count > 1); // two points are necessary
|
assert(clock->count);
|
||||||
|
|
||||||
|
if (clock->count == 1) {
|
||||||
|
// If there is only 1 point, we can't compute a slope. Assume it is 1.
|
||||||
|
struct sc_clock_point *single_point = &clock->right_sum;
|
||||||
|
*out_slope = 1;
|
||||||
|
*out_offset = single_point->system - single_point->stream;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
struct sc_clock_point left_avg = {
|
struct sc_clock_point left_avg = {
|
||||||
.system = clock->left_sum.system / (clock->count / 2),
|
.system = clock->left_sum.system / (clock->count / 2),
|
||||||
|
@ -93,19 +101,16 @@ sc_clock_update(struct sc_clock *clock, sc_tick system, sc_tick stream) {
|
||||||
|
|
||||||
clock->head = (clock->head + 1) % SC_CLOCK_RANGE;
|
clock->head = (clock->head + 1) % SC_CLOCK_RANGE;
|
||||||
|
|
||||||
if (clock->count > 1) {
|
// Update estimation
|
||||||
// Update estimation
|
sc_clock_estimate(clock, &clock->slope, &clock->offset);
|
||||||
sc_clock_estimate(clock, &clock->slope, &clock->offset);
|
|
||||||
|
|
||||||
#ifndef SC_CLOCK_NDEBUG
|
#ifndef SC_CLOCK_NDEBUG
|
||||||
LOGD("Clock estimation: %f * pts + %" PRItick,
|
LOGD("Clock estimation: %f * pts + %" PRItick, clock->slope, clock->offset);
|
||||||
clock->slope, clock->offset);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sc_tick
|
sc_tick
|
||||||
sc_clock_to_system_time(struct sc_clock *clock, sc_tick stream) {
|
sc_clock_to_system_time(struct sc_clock *clock, sc_tick stream) {
|
||||||
assert(clock->count > 1); // sc_clock_update() must have been called
|
assert(clock->count); // sc_clock_update() must have been called
|
||||||
return (sc_tick) (stream * clock->slope) + clock->offset;
|
return (sc_tick) (stream * clock->slope) + clock->offset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,10 +196,8 @@ sc_delay_buffer_frame_sink_push(struct sc_frame_sink *sink,
|
||||||
|
|
||||||
if (db->clock.count == 1) {
|
if (db->clock.count == 1) {
|
||||||
sc_mutex_unlock(&db->mutex);
|
sc_mutex_unlock(&db->mutex);
|
||||||
// First frame, push it immediately, for two reasons:
|
// First frame, push it immediately, not to delay the opening of the
|
||||||
// - not to delay the opening of the scrcpy window
|
// scrcpy window
|
||||||
// - the buffering estimation needs at least two clock points, so it
|
|
||||||
// could not handle the first frame
|
|
||||||
return sc_frame_source_sinks_push(&db->frame_source, frame);
|
return sc_frame_source_sinks_push(&db->frame_source, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue