Merge pull request #209 from thiccaxe/avsync-fix

pause/resume gstreamer stream when video stream stops/starts
This commit is contained in:
fduncanh
2023-09-05 17:08:29 -04:00
committed by GitHub
5 changed files with 41 additions and 1 deletions

View File

@@ -53,6 +53,8 @@ struct raop_callbacks_s {
void (*audio_process)(void *cls, raop_ntp_t *ntp, audio_decode_struct *data);
void (*video_process)(void *cls, raop_ntp_t *ntp, h264_decode_struct *data);
void (*video_pause)(void *cls);
void (*video_resume)(void *cls);
/* Optional but recommended callback functions */
void (*conn_init)(void *cls);

View File

@@ -510,6 +510,7 @@ raop_rtp_mirror_thread(void *arg)
h264_data.nal_count += 2;
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, &h264_data);
free(payload_out);
break;
@@ -600,7 +601,7 @@ raop_rtp_mirror_thread(void *arg)
// h264.pps_size = pps_size;
// h264.picture_parameter_set = malloc(h264.pps_size);
// memcpy(h264.picture_parameter_set, picture_parameter_set, pps_size);
raop_rtp_mirror->callbacks.video_pause(raop_rtp_mirror->callbacks.cls);
break;
case 0x02:
logger_log(raop_rtp_mirror->logger, LOGGER_DEBUG, "\nReceived old-protocol once-per-second packet from client:"

View File

@@ -52,6 +52,9 @@ void video_renderer_init (logger_t *logger, const char *server_name, videoflip_t
const bool *video_sync);
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 ();
unsigned int video_renderer_listen(void *loop);

View File

@@ -221,6 +221,25 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, vide
}
}
void video_renderer_pause() {
logger_log(logger, LOGGER_DEBUG, "video renderer paused");
gst_element_set_state(renderer->pipeline, GST_STATE_PAUSED);
}
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() {
GstState state;
gst_element_get_state(renderer->pipeline, &state, NULL, 0);
return (state == GST_STATE_PAUSED);
}
void video_renderer_start() {
gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING);
gst_video_pipeline_base_time = gst_element_get_base_time(renderer->appsrc);

View File

@@ -1120,6 +1120,19 @@ extern "C" void video_process (void *cls, raop_ntp_t *ntp, h264_decode_struct *d
}
}
extern "C" void video_pause (void *cls) {
if (use_video) {
video_renderer_pause();
}
}
extern "C" void video_resume (void *cls) {
if (use_video) {
video_renderer_resume();
}
}
extern "C" void audio_flush (void *cls) {
if (use_audio) {
audio_renderer_flush();
@@ -1254,6 +1267,8 @@ int start_raop_server (unsigned short display[5], unsigned short tcp[3], unsigne
raop_cbs.video_process = video_process;
raop_cbs.audio_flush = audio_flush;
raop_cbs.video_flush = video_flush;
raop_cbs.video_pause = video_pause;
raop_cbs.video_resume = video_resume;
raop_cbs.audio_set_volume = audio_set_volume;
raop_cbs.audio_get_format = audio_get_format;
raop_cbs.video_report_size = video_report_size;