From b7734c5b7223abf93db28f132c83276914722581 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Wed, 2 Oct 2024 04:15:43 -0400 Subject: [PATCH] fix for issues with client sleep and gstreamer >= 1.24 --- CMakeLists.txt | 6 ------ lib/raop_rtp_mirror.c | 10 +++++++++- renderers/CMakeLists.txt | 9 --------- renderers/video_renderer.c | 18 +++++++----------- renderers/video_renderer.h | 3 +-- uxplay.cpp | 13 ++----------- 6 files changed, 19 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 225583d..2a2ab75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c index e6e7383..91f471f 100644 --- a/lib/raop_rtp_mirror.c +++ b/lib/raop_rtp_mirror.c @@ -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; diff --git a/renderers/CMakeLists.txt b/renderers/CMakeLists.txt index 9b15a47..6ecdc4b 100644 --- a/renderers/CMakeLists.txt +++ b/renderers/CMakeLists.txt @@ -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 diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index e57b4ca..194e56d 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_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) { diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 5457e4b..fa2cb2e 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -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); diff --git a/uxplay.cpp b/uxplay.cpp index 5ce6e8e..b2805fa 100644 --- a/uxplay.cpp +++ b/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(); }