diff --git a/app/src/demuxer.c b/app/src/demuxer.c index e6a35f4f..97a17594 100644 --- a/app/src/demuxer.c +++ b/app/src/demuxer.c @@ -201,9 +201,13 @@ static int run_demuxer(void *data) { struct sc_demuxer *demuxer = data; + // Flag to report end-of-stream (i.e. device disconnected) + bool eos = false; + uint32_t raw_codec_id; bool ok = sc_demuxer_recv_codec_id(demuxer, &raw_codec_id); if (!ok) { + eos = true; goto end; } @@ -244,6 +248,7 @@ run_demuxer(void *data) { bool ok = sc_demuxer_recv_packet(demuxer, packet); if (!ok) { // end of stream + eos = true; break; } @@ -267,7 +272,7 @@ finally_close_parser: finally_close_sinks: sc_demuxer_close_sinks(demuxer); end: - demuxer->cbs->on_eos(demuxer, demuxer->cbs_userdata); + demuxer->cbs->on_ended(demuxer, eos, demuxer->cbs_userdata); return 0; } @@ -279,7 +284,7 @@ sc_demuxer_init(struct sc_demuxer *demuxer, sc_socket socket, demuxer->pending = NULL; demuxer->sink_count = 0; - assert(cbs && cbs->on_eos); + assert(cbs && cbs->on_ended); demuxer->cbs = cbs; demuxer->cbs_userdata = cbs_userdata; diff --git a/app/src/demuxer.h b/app/src/demuxer.h index 4e660fbf..dfb06675 100644 --- a/app/src/demuxer.h +++ b/app/src/demuxer.h @@ -31,7 +31,7 @@ struct sc_demuxer { }; struct sc_demuxer_callbacks { - void (*on_eos)(struct sc_demuxer *demuxer, void *userdata); + void (*on_ended)(struct sc_demuxer *demuxer, bool eos, void *userdata); }; void diff --git a/app/src/events.h b/app/src/events.h index 477328de..7fa10761 100644 --- a/app/src/events.h +++ b/app/src/events.h @@ -1,5 +1,6 @@ #define SC_EVENT_NEW_FRAME SDL_USEREVENT -#define SC_EVENT_STREAM_STOPPED (SDL_USEREVENT + 1) +#define SC_EVENT_DEVICE_DISCONNECTED (SDL_USEREVENT + 1) #define SC_EVENT_SERVER_CONNECTION_FAILED (SDL_USEREVENT + 2) #define SC_EVENT_SERVER_CONNECTED (SDL_USEREVENT + 3) #define SC_EVENT_USB_DEVICE_DISCONNECTED (SDL_USEREVENT + 4) +#define SC_EVENT_DEMUXER_ERROR (SDL_USEREVENT + 5) diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index b0324f7a..bf4bb199 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -155,9 +155,12 @@ event_loop(struct scrcpy *s) { SDL_Event event; while (SDL_WaitEvent(&event)) { switch (event.type) { - case SC_EVENT_STREAM_STOPPED: + case SC_EVENT_DEVICE_DISCONNECTED: LOGW("Device disconnected"); return SCRCPY_EXIT_DISCONNECTED; + case SC_EVENT_DEMUXER_ERROR: + LOGE("Demuxer error"); + return SCRCPY_EXIT_FAILURE; case SDL_QUIT: LOGD("User requested to quit"); return SCRCPY_EXIT_SUCCESS; @@ -233,11 +236,15 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) { } static void -sc_demuxer_on_eos(struct sc_demuxer *demuxer, void *userdata) { +sc_demuxer_on_ended(struct sc_demuxer *demuxer, bool eos, void *userdata) { (void) demuxer; (void) userdata; - PUSH_EVENT(SC_EVENT_STREAM_STOPPED); + if (eos) { + PUSH_EVENT(SC_EVENT_DEVICE_DISCONNECTED); + } else { + PUSH_EVENT(SC_EVENT_DEMUXER_ERROR); + } } static void @@ -421,7 +428,7 @@ scrcpy(struct scrcpy_options *options) { av_log_set_callback(av_log_callback); static const struct sc_demuxer_callbacks demuxer_cbs = { - .on_eos = sc_demuxer_on_eos, + .on_ended = sc_demuxer_on_ended, }; sc_demuxer_init(&s->demuxer, s->server.video_socket, &demuxer_cbs, NULL);