diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index dc504d87..8940e339 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -25,14 +25,12 @@ #include "server.h" #include "stream.h" #include "tiny_xpm.h" -#include "video_buffer.h" #include "util/log.h" #include "util/net.h" static struct server server; static struct screen screen; static struct fps_counter fps_counter; -static struct video_buffer video_buffer; static struct stream stream; static struct decoder decoder; static struct recorder recorder; @@ -276,7 +274,6 @@ scrcpy(const struct scrcpy_options *options) { bool server_started = false; bool fps_counter_initialized = false; - bool video_buffer_initialized = false; bool file_handler_initialized = false; bool recorder_initialized = false; bool stream_started = false; @@ -334,11 +331,6 @@ scrcpy(const struct scrcpy_options *options) { } fps_counter_initialized = true; - if (!video_buffer_init(&video_buffer)) { - goto end; - } - video_buffer_initialized = true; - if (options->control) { if (!file_handler_init(&file_handler, server.serial, options->push_target)) { @@ -404,8 +396,7 @@ scrcpy(const struct scrcpy_options *options) { .mipmaps = options->mipmaps, }; - if (!screen_init(&screen, &video_buffer, &fps_counter, - &screen_params)) { + if (!screen_init(&screen, &fps_counter, &screen_params)) { goto end; } screen_initialized = true; @@ -485,10 +476,6 @@ end: file_handler_destroy(&file_handler); } - if (video_buffer_initialized) { - video_buffer_destroy(&video_buffer); - } - if (fps_counter_initialized) { fps_counter_join(&fps_counter); fps_counter_destroy(&fps_counter); diff --git a/app/src/screen.c b/app/src/screen.c index 2aa2d7ca..4deb6aa2 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -261,14 +261,12 @@ screen_frame_sink_close(struct sc_frame_sink *sink) { static bool screen_frame_sink_push(struct sc_frame_sink *sink, const AVFrame *frame) { struct screen *screen = DOWNCAST(sink); - return video_buffer_push(screen->vb, frame); + return video_buffer_push(&screen->vb, frame); } bool -screen_init(struct screen *screen, struct video_buffer *vb, - struct fps_counter *fps_counter, +screen_init(struct screen *screen, struct fps_counter *fps_counter, const struct screen_params *params) { - screen->vb = vb; screen->fps_counter = fps_counter; screen->resize_pending = false; @@ -276,11 +274,17 @@ screen_init(struct screen *screen, struct video_buffer *vb, screen->fullscreen = false; screen->maximized = false; + bool ok = video_buffer_init(&screen->vb); + if (!ok) { + LOGE("Could not initialize video buffer"); + return false; + } + static const struct video_buffer_callbacks cbs = { .on_frame_available = on_frame_available, .on_frame_skipped = on_frame_skipped, }; - video_buffer_set_consumer_callbacks(vb, &cbs, screen); + video_buffer_set_consumer_callbacks(&screen->vb, &cbs, screen); screen->frame_size = params->frame_size; screen->rotation = params->rotation; @@ -326,6 +330,7 @@ screen_init(struct screen *screen, struct video_buffer *vb, if (!screen->renderer) { LOGC("Could not create renderer: %s", SDL_GetError()); SDL_DestroyWindow(screen->window); + video_buffer_destroy(&screen->vb); return false; } @@ -377,6 +382,7 @@ screen_init(struct screen *screen, struct video_buffer *vb, LOGC("Could not create texture: %s", SDL_GetError()); SDL_DestroyRenderer(screen->renderer); SDL_DestroyWindow(screen->window); + video_buffer_destroy(&screen->vb); return false; } @@ -386,6 +392,7 @@ screen_init(struct screen *screen, struct video_buffer *vb, SDL_DestroyTexture(screen->texture); SDL_DestroyRenderer(screen->renderer); SDL_DestroyWindow(screen->window); + video_buffer_destroy(&screen->vb); return false; } @@ -418,6 +425,7 @@ screen_destroy(struct screen *screen) { SDL_DestroyTexture(screen->texture); SDL_DestroyRenderer(screen->renderer); SDL_DestroyWindow(screen->window); + video_buffer_destroy(&screen->vb); } static void @@ -523,7 +531,7 @@ update_texture(struct screen *screen, const AVFrame *frame) { static bool screen_update_frame(struct screen *screen) { av_frame_unref(screen->frame); - video_buffer_consume(screen->vb, screen->frame); + video_buffer_consume(&screen->vb, screen->frame); AVFrame *frame = screen->frame; fps_counter_add_rendered_frame(screen->fps_counter); diff --git a/app/src/screen.h b/app/src/screen.h index 12ca494e..557de509 100644 --- a/app/src/screen.h +++ b/app/src/screen.h @@ -10,13 +10,14 @@ #include "coords.h" #include "opengl.h" #include "trait/frame_sink.h" +#include "video_buffer.h" struct video_buffer; struct screen { struct sc_frame_sink frame_sink; // frame sink trait - struct video_buffer *vb; + struct video_buffer vb; struct fps_counter *fps_counter; SDL_Window *window; @@ -61,8 +62,7 @@ struct screen_params { // initialize screen, create window, renderer and texture (window is hidden) bool -screen_init(struct screen *screen, struct video_buffer *vb, - struct fps_counter *fps_counter, +screen_init(struct screen *screen, struct fps_counter *fps_counter, const struct screen_params *params); // show the window