fix for issues with client sleep and gstreamer >= 1.24

This commit is contained in:
F. Duncanh
2024-10-02 04:15:43 -04:00
parent 44fec22219
commit b7734c5b72
6 changed files with 19 additions and 40 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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();
}