Properly report demuxer errors

All demuxer errors were reported as "device disconnected", even if the
failure was not related to device socket read.
This commit is contained in:
Romain Vimont 2023-02-10 18:54:46 +01:00
parent 4f9e9c6619
commit 730eb1086a
4 changed files with 21 additions and 8 deletions

View file

@ -201,9 +201,13 @@ static int
run_demuxer(void *data) { run_demuxer(void *data) {
struct sc_demuxer *demuxer = data; struct sc_demuxer *demuxer = data;
// Flag to report end-of-stream (i.e. device disconnected)
bool eos = false;
uint32_t raw_codec_id; uint32_t raw_codec_id;
bool ok = sc_demuxer_recv_codec_id(demuxer, &raw_codec_id); bool ok = sc_demuxer_recv_codec_id(demuxer, &raw_codec_id);
if (!ok) { if (!ok) {
eos = true;
goto end; goto end;
} }
@ -244,6 +248,7 @@ run_demuxer(void *data) {
bool ok = sc_demuxer_recv_packet(demuxer, packet); bool ok = sc_demuxer_recv_packet(demuxer, packet);
if (!ok) { if (!ok) {
// end of stream // end of stream
eos = true;
break; break;
} }
@ -267,7 +272,7 @@ finally_close_parser:
finally_close_sinks: finally_close_sinks:
sc_demuxer_close_sinks(demuxer); sc_demuxer_close_sinks(demuxer);
end: end:
demuxer->cbs->on_eos(demuxer, demuxer->cbs_userdata); demuxer->cbs->on_ended(demuxer, eos, demuxer->cbs_userdata);
return 0; return 0;
} }
@ -279,7 +284,7 @@ sc_demuxer_init(struct sc_demuxer *demuxer, sc_socket socket,
demuxer->pending = NULL; demuxer->pending = NULL;
demuxer->sink_count = 0; demuxer->sink_count = 0;
assert(cbs && cbs->on_eos); assert(cbs && cbs->on_ended);
demuxer->cbs = cbs; demuxer->cbs = cbs;
demuxer->cbs_userdata = cbs_userdata; demuxer->cbs_userdata = cbs_userdata;

View file

@ -31,7 +31,7 @@ struct sc_demuxer {
}; };
struct sc_demuxer_callbacks { 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 void

View file

@ -1,5 +1,6 @@
#define SC_EVENT_NEW_FRAME SDL_USEREVENT #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_CONNECTION_FAILED (SDL_USEREVENT + 2)
#define SC_EVENT_SERVER_CONNECTED (SDL_USEREVENT + 3) #define SC_EVENT_SERVER_CONNECTED (SDL_USEREVENT + 3)
#define SC_EVENT_USB_DEVICE_DISCONNECTED (SDL_USEREVENT + 4) #define SC_EVENT_USB_DEVICE_DISCONNECTED (SDL_USEREVENT + 4)
#define SC_EVENT_DEMUXER_ERROR (SDL_USEREVENT + 5)

View file

@ -155,9 +155,12 @@ event_loop(struct scrcpy *s) {
SDL_Event event; SDL_Event event;
while (SDL_WaitEvent(&event)) { while (SDL_WaitEvent(&event)) {
switch (event.type) { switch (event.type) {
case SC_EVENT_STREAM_STOPPED: case SC_EVENT_DEVICE_DISCONNECTED:
LOGW("Device disconnected"); LOGW("Device disconnected");
return SCRCPY_EXIT_DISCONNECTED; return SCRCPY_EXIT_DISCONNECTED;
case SC_EVENT_DEMUXER_ERROR:
LOGE("Demuxer error");
return SCRCPY_EXIT_FAILURE;
case SDL_QUIT: case SDL_QUIT:
LOGD("User requested to quit"); LOGD("User requested to quit");
return SCRCPY_EXIT_SUCCESS; return SCRCPY_EXIT_SUCCESS;
@ -233,11 +236,15 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) {
} }
static void 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) demuxer;
(void) userdata; (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 static void
@ -421,7 +428,7 @@ scrcpy(struct scrcpy_options *options) {
av_log_set_callback(av_log_callback); av_log_set_callback(av_log_callback);
static const struct sc_demuxer_callbacks demuxer_cbs = { 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); sc_demuxer_init(&s->demuxer, s->server.video_socket, &demuxer_cbs, NULL);