Skip to content

Commit 5828b85

Browse files
committed
Optionally do not delay the first frame
A delay buffer delayed all the frames except the first one, to open the scrcpy window immediately and get a picture. Make this feature optional, so that the delay buffer might also be used for audio. PR #3757 <Genymobile/scrcpy#3757>
1 parent 296ea22 commit 5828b85

File tree

3 files changed

+12
-7
lines changed

3 files changed

+12
-7
lines changed

app/src/delay_buffer.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,8 @@ sc_delay_buffer_frame_sink_push(struct sc_frame_sink *sink,
194194
sc_clock_update(&db->clock, sc_tick_now(), pts);
195195
sc_cond_signal(&db->wait_cond);
196196

197-
if (db->clock.count == 1) {
197+
if (db->first_frame_asap && db->clock.count == 1) {
198198
sc_mutex_unlock(&db->mutex);
199-
// First frame, push it immediately, not to delay the opening of the
200-
// scrcpy window
201199
return sc_frame_source_sinks_push(&db->frame_source, frame);
202200
}
203201

@@ -227,10 +225,12 @@ sc_delay_buffer_frame_sink_push(struct sc_frame_sink *sink,
227225
}
228226

229227
void
230-
sc_delay_buffer_init(struct sc_delay_buffer *db, sc_tick delay) {
228+
sc_delay_buffer_init(struct sc_delay_buffer *db, sc_tick delay,
229+
bool first_frame_asap) {
231230
assert(delay > 0);
232231

233232
db->delay = delay;
233+
db->first_frame_asap = first_frame_asap;
234234

235235
sc_frame_source_init(&db->frame_source);
236236

app/src/delay_buffer.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct sc_delay_buffer {
2929
struct sc_frame_sink frame_sink; // frame sink trait
3030

3131
sc_tick delay;
32+
bool first_frame_asap;
3233

3334
sc_thread thread;
3435
sc_mutex mutex;
@@ -49,8 +50,11 @@ struct sc_delay_buffer_callbacks {
4950
* Initialize a delay buffer.
5051
*
5152
* \param delay a (strictly) positive delay
53+
* \param first_frame_asap if true, do not delay the first frame (useful for
54+
a video stream).
5255
*/
5356
void
54-
sc_delay_buffer_init(struct sc_delay_buffer *db, sc_tick delay);
57+
sc_delay_buffer_init(struct sc_delay_buffer *db, sc_tick delay,
58+
bool first_frame_asap);
5559

5660
#endif

app/src/scrcpy.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,8 @@ scrcpy(struct scrcpy_options *options) {
685685

686686
struct sc_frame_source *src = &s->video_decoder.frame_source;
687687
if (options->display_buffer) {
688-
sc_delay_buffer_init(&s->display_buffer, options->display_buffer);
688+
sc_delay_buffer_init(&s->display_buffer, options->display_buffer,
689+
true);
689690
sc_frame_source_add_sink(src, &s->display_buffer.frame_sink);
690691
src = &s->display_buffer.frame_source;
691692
}
@@ -708,7 +709,7 @@ scrcpy(struct scrcpy_options *options) {
708709

709710
struct sc_frame_source *src = &s->video_decoder.frame_source;
710711
if (options->v4l2_buffer) {
711-
sc_delay_buffer_init(&s->v4l2_buffer, options->v4l2_buffer);
712+
sc_delay_buffer_init(&s->v4l2_buffer, options->v4l2_buffer, true);
712713
sc_frame_source_add_sink(src, &s->v4l2_buffer.frame_sink);
713714
src = &s->v4l2_buffer.frame_source;
714715
}

0 commit comments

Comments
 (0)