mirror of
https://github.com/morgan9e/UxPlay
synced 2026-04-14 00:04:13 +09:00
fix for issues with client sleep and gstreamer >= 1.24
This commit is contained in:
@@ -47,12 +47,6 @@ if ( GST_MACOS )
|
||||
message ( STATUS "define GST_MACOS" )
|
||||
endif()
|
||||
|
||||
if ( GST_124 )
|
||||
add_definitions( -DGST_124 )
|
||||
message ( STATUS "define GST_124" )
|
||||
endif()
|
||||
|
||||
|
||||
add_executable( uxplay uxplay.cpp )
|
||||
target_link_libraries( uxplay
|
||||
renderers
|
||||
|
||||
@@ -200,6 +200,7 @@ raop_rtp_mirror_thread(void *arg)
|
||||
const char h264[] = "h264";
|
||||
const char h265[] = "h265";
|
||||
bool unsupported_codec = false;
|
||||
bool video_stream_suspended = false;
|
||||
|
||||
while (1) {
|
||||
fd_set rfds;
|
||||
@@ -529,7 +530,6 @@ raop_rtp_mirror_thread(void *arg)
|
||||
prepend_sps_pps = false;
|
||||
}
|
||||
|
||||
raop_rtp_mirror->callbacks.video_resume(raop_rtp_mirror->callbacks.cls);
|
||||
raop_rtp_mirror->callbacks.video_process(raop_rtp_mirror->callbacks.cls, raop_rtp_mirror->ntp, &video_data);
|
||||
free(payload_out);
|
||||
break;
|
||||
@@ -557,6 +557,14 @@ raop_rtp_mirror_thread(void *arg)
|
||||
" payload_size %d header %s ts_client = %8.6f",
|
||||
payload_size, packet_description, (double) ntp_timestamp_remote / SEC);
|
||||
|
||||
if (!video_stream_suspended && (packet[6] == 0x56 || packet[6] == 0x5e)) {
|
||||
video_stream_suspended = true;
|
||||
raop_rtp_mirror->callbacks.video_pause(raop_rtp_mirror->callbacks.cls);
|
||||
} else if (video_stream_suspended && (packet[6] == 0x16 || packet[6] == 0x1e)) {
|
||||
raop_rtp_mirror->callbacks.video_resume(raop_rtp_mirror->callbacks.cls);
|
||||
video_stream_suspended = false;
|
||||
}
|
||||
|
||||
codec = VIDEO_CODEC_UNKNOWN;
|
||||
assert (raop_rtp_mirror->callbacks.video_set_codec);
|
||||
ntp_timestamp_nal = ntp_timestamp_raw;
|
||||
|
||||
@@ -38,15 +38,6 @@ pkg_check_modules(GST REQUIRED gstreamer-1.0>=1.4
|
||||
gstreamer-app-1.0>=1.4
|
||||
)
|
||||
|
||||
# temporary hack to deal with an issue in gstreamer 1.24
|
||||
pkg_check_modules ( GST124 gstreamer-1.0>=1.24 )
|
||||
if ( GST124_FOUND )
|
||||
message( STATUS "*** GStreamer >= 1.24: GST_124 will be defined" )
|
||||
set( GST_124 "1" CACHE STRING "define GST_124" )
|
||||
else()
|
||||
message( STATUS "No problem: will use Gtreamer < 1.24" )
|
||||
endif()
|
||||
|
||||
add_library( renderers
|
||||
STATIC
|
||||
audio_renderer.c
|
||||
|
||||
@@ -277,17 +277,13 @@ void video_renderer_pause() {
|
||||
}
|
||||
|
||||
void video_renderer_resume() {
|
||||
if (video_renderer_is_paused()) {
|
||||
logger_log(logger, LOGGER_DEBUG, "video renderer resumed");
|
||||
gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING);
|
||||
gst_video_pipeline_base_time = gst_element_get_base_time(renderer->appsrc);
|
||||
}
|
||||
}
|
||||
|
||||
bool video_renderer_is_paused() {
|
||||
gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING);
|
||||
GstState state;
|
||||
gst_element_get_state(renderer->pipeline, &state, NULL, 0);
|
||||
return (state == GST_STATE_PAUSED);
|
||||
/* wait with timeout 100 msec for pipeline to change state from PAUSED to PLAYING */
|
||||
gst_element_get_state(renderer->pipeline, &state, NULL, 100 * GST_MSECOND);
|
||||
const gchar *state_name = gst_element_state_get_name(state);
|
||||
logger_log(logger, LOGGER_DEBUG, "video renderer resumed: state %s", state_name);
|
||||
gst_video_pipeline_base_time = gst_element_get_base_time(renderer->appsrc);
|
||||
}
|
||||
|
||||
void video_renderer_start() {
|
||||
@@ -514,7 +510,7 @@ gboolean gstreamer_pipeline_bus_callback(GstBus *bus, GstMessage *message, void
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void video_renderer_h265 (bool video_is_h265) {
|
||||
void video_renderer_choose_codec (bool video_is_h265) {
|
||||
/* set renderer to h264 or h265, depending on pps/sps received by raop_rtp_mirror */
|
||||
video_renderer_t *renderer_new = video_is_h265 ? renderer_type[1] : renderer_type[0];
|
||||
if (renderer == renderer_new) {
|
||||
|
||||
@@ -59,12 +59,11 @@ void video_renderer_start ();
|
||||
void video_renderer_stop ();
|
||||
void video_renderer_pause ();
|
||||
void video_renderer_resume ();
|
||||
bool video_renderer_is_paused();
|
||||
void video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time);
|
||||
void video_renderer_flush ();
|
||||
void video_renderer_destroy ();
|
||||
void video_renderer_size(float *width_source, float *height_source, float *width, float *height);
|
||||
void video_renderer_h265(bool is_h265);
|
||||
void video_renderer_choose_codec(bool is_h265);
|
||||
|
||||
unsigned int video_renderer_listen(void *loop, int id);
|
||||
unsigned int video_reset_callback(void *loop);
|
||||
|
||||
13
uxplay.cpp
13
uxplay.cpp
@@ -1482,11 +1482,8 @@ extern "C" void video_reset(void *cls) {
|
||||
|
||||
extern "C" void video_set_codec(void *cls, video_codec_t codec) {
|
||||
if (use_video) {
|
||||
if (codec == VIDEO_CODEC_H265) {
|
||||
video_renderer_h265(true);
|
||||
} else {
|
||||
video_renderer_h265(false);
|
||||
}
|
||||
bool video_is_h265 = (codec == VIDEO_CODEC_H265);
|
||||
video_renderer_choose_codec(video_is_h265);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1614,18 +1611,12 @@ extern "C" void video_process (void *cls, raop_ntp_t *ntp, video_decode_struct *
|
||||
}
|
||||
|
||||
extern "C" void video_pause (void *cls) {
|
||||
#ifdef GST_124
|
||||
return; //pause/resume changes in GStreamer-1.24 break this code
|
||||
#endif
|
||||
if (use_video) {
|
||||
video_renderer_pause();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void video_resume (void *cls) {
|
||||
#ifdef GST_124
|
||||
return; //pause/resume changes in GStreamer-1.24 break this code
|
||||
#endif
|
||||
if (use_video) {
|
||||
video_renderer_resume();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user