mirror of
https://github.com/morgan9e/UxPlay
synced 2026-04-14 00:04:13 +09:00
further fixes for #496 (transition from mirror_mode to HLS)
This commit is contained in:
@@ -87,7 +87,8 @@ struct raop_s {
|
|||||||
|
|
||||||
/* activate support for HLS live streaming */
|
/* activate support for HLS live streaming */
|
||||||
bool hls_support;
|
bool hls_support;
|
||||||
|
bool hls_pending;
|
||||||
|
|
||||||
/* used in digest authentication */
|
/* used in digest authentication */
|
||||||
char *nonce;
|
char *nonce;
|
||||||
char *random_pw;
|
char *random_pw;
|
||||||
@@ -424,6 +425,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
} else if (!strcmp(method, "OPTIONS")) {
|
} else if (!strcmp(method, "OPTIONS")) {
|
||||||
handler = &raop_handler_options;
|
handler = &raop_handler_options;
|
||||||
} else if (!strcmp(method, "SETUP")) {
|
} else if (!strcmp(method, "SETUP")) {
|
||||||
|
raop->hls_pending = false;
|
||||||
handler = &raop_handler_setup;
|
handler = &raop_handler_setup;
|
||||||
} else if (!strcmp(method, "GET_PARAMETER")) {
|
} else if (!strcmp(method, "GET_PARAMETER")) {
|
||||||
handler = &raop_handler_get_parameter;
|
handler = &raop_handler_get_parameter;
|
||||||
@@ -459,6 +461,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
}
|
}
|
||||||
} else if (!strcmp(method, "GET")) {
|
} else if (!strcmp(method, "GET")) {
|
||||||
if (!strcmp(url, "/server-info")) {
|
if (!strcmp(url, "/server-info")) {
|
||||||
|
raop->hls_pending = true;
|
||||||
handler = &http_handler_server_info;
|
handler = &http_handler_server_info;
|
||||||
} else if (!strcmp(url, "/playback-info")) {
|
} else if (!strcmp(url, "/playback-info")) {
|
||||||
handler = &http_handler_playback_info;
|
handler = &http_handler_playback_info;
|
||||||
@@ -487,7 +490,6 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
http_response_finish(*response, response_data, response_datalen);
|
http_response_finish(*response, response_data, response_datalen);
|
||||||
|
|
||||||
int len = 0;
|
int len = 0;
|
||||||
const char *data = http_response_get_data(*response, &len);
|
const char *data = http_response_get_data(*response, &len);
|
||||||
if (response_data && response_datalen > 0) {
|
if (response_data && response_datalen > 0) {
|
||||||
@@ -635,7 +637,8 @@ raop_init(raop_callbacks_t *callbacks) {
|
|||||||
raop->audio_delay_micros = 250000;
|
raop->audio_delay_micros = 250000;
|
||||||
|
|
||||||
raop->hls_support = false;
|
raop->hls_support = false;
|
||||||
|
raop->hls_pending = false;
|
||||||
|
|
||||||
raop->nonce = NULL;
|
raop->nonce = NULL;
|
||||||
|
|
||||||
raop->lang = NULL;
|
raop->lang = NULL;
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ typedef struct raop_s raop_t;
|
|||||||
|
|
||||||
typedef void (*raop_log_callback_t)(void *cls, int level, const char *msg);
|
typedef void (*raop_log_callback_t)(void *cls, int level, const char *msg);
|
||||||
|
|
||||||
|
|
||||||
typedef struct playback_info_s {
|
typedef struct playback_info_s {
|
||||||
//char * uuid;
|
//char * uuid;
|
||||||
uint32_t stallcount;
|
uint32_t stallcount;
|
||||||
@@ -66,7 +65,7 @@ typedef enum reset_type_e {
|
|||||||
RESET_TYPE_HLS_SHUTDOWN,
|
RESET_TYPE_HLS_SHUTDOWN,
|
||||||
RESET_TYPE_HLS_EOS,
|
RESET_TYPE_HLS_EOS,
|
||||||
RESET_TYPE_ON_VIDEO_PLAY,
|
RESET_TYPE_ON_VIDEO_PLAY,
|
||||||
RESET_TYPE_TEARDOWN_110
|
RESET_TYPE_RTP_TO_HLS_TEARDOWN
|
||||||
} reset_type_t;
|
} reset_type_t;
|
||||||
|
|
||||||
struct raop_callbacks_s {
|
struct raop_callbacks_s {
|
||||||
|
|||||||
@@ -1278,7 +1278,11 @@ raop_handler_teardown(raop_conn_t *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (teardown_110) {
|
} else if (teardown_110) {
|
||||||
raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_SHUTDOWN);
|
if (raop->hls_pending) {
|
||||||
|
raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_TO_HLS_TEARDOWN);
|
||||||
|
} else {
|
||||||
|
raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_SHUTDOWN);
|
||||||
|
}
|
||||||
if (conn->raop_rtp_mirror) {
|
if (conn->raop_rtp_mirror) {
|
||||||
/* Stop our video RTP session */
|
/* Stop our video RTP session */
|
||||||
raop_rtp_mirror_stop(conn->raop_rtp_mirror);
|
raop_rtp_mirror_stop(conn->raop_rtp_mirror);
|
||||||
@@ -1299,7 +1303,4 @@ raop_handler_teardown(raop_conn_t *conn,
|
|||||||
raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_HLS_SHUTDOWN);
|
raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_HLS_SHUTDOWN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (raop->callbacks.conn_teardown) {
|
|
||||||
raop->callbacks.conn_teardown(raop->callbacks.cls, &teardown_96, &teardown_110);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
43
uxplay.cpp
43
uxplay.cpp
@@ -2113,14 +2113,25 @@ static bool check_blocked_client(char *deviceid) {
|
|||||||
|
|
||||||
|
|
||||||
//to be simplified
|
//to be simplified
|
||||||
|
|
||||||
|
static const char *reset_name[] = {
|
||||||
|
[RESET_TYPE_NOHOLD] = "Nohold",
|
||||||
|
[RESET_TYPE_RTP_SHUTDOWN] = "RTP_Shutdown",
|
||||||
|
[RESET_TYPE_HLS_SHUTDOWN] = "HLS_Shutdown",
|
||||||
|
[RESET_TYPE_HLS_EOS] = "HLS_eos",
|
||||||
|
[RESET_TYPE_ON_VIDEO_PLAY] = "on_video_play",
|
||||||
|
[RESET_TYPE_RTP_TO_HLS_TEARDOWN] = "RTP_to_HLS_Shutdown"
|
||||||
|
};
|
||||||
|
|
||||||
extern "C" void video_reset(void *cls, reset_type_t type) {
|
extern "C" void video_reset(void *cls, reset_type_t type) {
|
||||||
LOGD("video_reset");
|
LOGD("video_reset: type = %s", reset_name[type]);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case RESET_TYPE_NOHOLD:
|
case RESET_TYPE_NOHOLD:
|
||||||
if (hls_support) {
|
if (hls_support) {
|
||||||
url.erase();
|
url.erase();
|
||||||
raop_destroy_airplay_video(raop, -1);
|
raop_destroy_airplay_video(raop, -1);
|
||||||
}
|
}
|
||||||
|
case RESET_TYPE_HLS_EOS:
|
||||||
if (use_video) {
|
if (use_video) {
|
||||||
video_renderer_stop();
|
video_renderer_stop();
|
||||||
/* reset the video renderer immediately to avoid a timing issue if we wait for main_loop to reset */
|
/* reset the video renderer immediately to avoid a timing issue if we wait for main_loop to reset */
|
||||||
@@ -2136,6 +2147,8 @@ extern "C" void video_reset(void *cls, reset_type_t type) {
|
|||||||
remote_clock_offset = 0;
|
remote_clock_offset = 0;
|
||||||
relaunch_video = true;
|
relaunch_video = true;
|
||||||
break;
|
break;
|
||||||
|
case RESET_TYPE_RTP_TO_HLS_TEARDOWN:
|
||||||
|
preserve_connections = true;
|
||||||
case RESET_TYPE_RTP_SHUTDOWN:
|
case RESET_TYPE_RTP_SHUTDOWN:
|
||||||
if (use_video) {
|
if (use_video) {
|
||||||
video_renderer_stop();
|
video_renderer_stop();
|
||||||
@@ -2156,27 +2169,6 @@ extern "C" void video_reset(void *cls, reset_type_t type) {
|
|||||||
remote_clock_offset = 0;
|
remote_clock_offset = 0;
|
||||||
relaunch_video = true;
|
relaunch_video = true;
|
||||||
break;
|
break;
|
||||||
case RESET_TYPE_HLS_EOS:
|
|
||||||
if (use_video) {
|
|
||||||
/* reset the video renderer immediately to avoid a timing issue if we wait for main_loop to reset */
|
|
||||||
video_renderer_stop();
|
|
||||||
video_renderer_destroy();
|
|
||||||
video_renderer_init(render_logger, server_name.c_str(), videoflip, video_parser.c_str(), rtp_pipeline.c_str(),
|
|
||||||
video_decoder.c_str(), video_converter.c_str(), videosink.c_str(),
|
|
||||||
videosink_options.c_str(), fullscreen, video_sync, h265_support,
|
|
||||||
render_coverart, playbin_version, NULL);
|
|
||||||
video_renderer_start();
|
|
||||||
close_window = false; // we already closed the window
|
|
||||||
}
|
|
||||||
remote_clock_offset = 0;
|
|
||||||
relaunch_video = true;
|
|
||||||
break;
|
|
||||||
case RESET_TYPE_TEARDOWN_110:
|
|
||||||
if (use_video) {
|
|
||||||
video_renderer_stop();
|
|
||||||
}
|
|
||||||
relaunch_video = true;
|
|
||||||
break;
|
|
||||||
case RESET_TYPE_ON_VIDEO_PLAY:
|
case RESET_TYPE_ON_VIDEO_PLAY:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -2282,12 +2274,6 @@ extern "C" void conn_reset (void *cls, int reason) {
|
|||||||
reset_loop = true;
|
reset_loop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void conn_teardown(void *cls, bool *teardown_96, bool *teardown_110) {
|
|
||||||
if (*teardown_110 && close_window) {
|
|
||||||
video_reset(cls,RESET_TYPE_TEARDOWN_110);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void report_client_request(void *cls, char *deviceid, char * model, char *name, bool * admit) {
|
extern "C" void report_client_request(void *cls, char *deviceid, char * model, char *name, bool * admit) {
|
||||||
LOGI("connection request from %s (%s) with deviceID = %s\n", name, model, deviceid);
|
LOGI("connection request from %s (%s) with deviceID = %s\n", name, model, deviceid);
|
||||||
if (restrict_clients) {
|
if (restrict_clients) {
|
||||||
@@ -2717,7 +2703,6 @@ static int start_raop_server (unsigned short display[5], unsigned short tcp[3],
|
|||||||
raop_cbs.conn_destroy = conn_destroy;
|
raop_cbs.conn_destroy = conn_destroy;
|
||||||
raop_cbs.conn_reset = conn_reset;
|
raop_cbs.conn_reset = conn_reset;
|
||||||
raop_cbs.conn_feedback = conn_feedback;
|
raop_cbs.conn_feedback = conn_feedback;
|
||||||
raop_cbs.conn_teardown = conn_teardown;
|
|
||||||
raop_cbs.audio_process = audio_process;
|
raop_cbs.audio_process = audio_process;
|
||||||
raop_cbs.video_process = video_process;
|
raop_cbs.video_process = video_process;
|
||||||
raop_cbs.audio_flush = audio_flush;
|
raop_cbs.audio_flush = audio_flush;
|
||||||
|
|||||||
Reference in New Issue
Block a user