From 815ba2ccddb0dbc1ae00c60188c850cb628cb199 Mon Sep 17 00:00:00 2001 From: fduncanh Date: Wed, 8 Dec 2021 13:38:12 -0500 Subject: [PATCH] move error message for undecrytped video into video_renderers_gstreamer.c --- lib/raop_rtp_mirror.c | 26 +++++++++--------------- renderers/audio_renderer_gstreamer.c | 2 +- renderers/video_renderer_gstreamer.c | 30 +++++++++++++++++----------- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c index 219d8c8..9e9313d 100755 --- a/lib/raop_rtp_mirror.c +++ b/lib/raop_rtp_mirror.c @@ -78,7 +78,6 @@ struct raop_rtp_mirror_s { unsigned short mirror_data_lport; - bool broken_video; }; static int @@ -337,7 +336,6 @@ raop_rtp_mirror_thread(void *arg) break; } } - if (nalu_size != payload_size) valid = false; // int nalu_type = payload[4] & 0x1f; // logger_log(raop_rtp_mirror->logger, LOGGER_DEBUG, "nalutype = %d", nalu_type); @@ -347,20 +345,15 @@ raop_rtp_mirror_thread(void *arg) #ifdef DUMP_H264 fwrite(payload_decrypted, payload_size, 1, file); #endif - if (valid) { - raop_rtp_mirror->broken_video = false; - h264_decode_struct h264_data; - h264_data.data_len = payload_size; - h264_data.data = payload_decrypted; - h264_data.frame_type = 1; - h264_data.pts = ntp_timestamp; - raop_rtp_mirror->callbacks.video_process(raop_rtp_mirror->callbacks.cls, raop_rtp_mirror->ntp, &h264_data); - } else { - if (!raop_rtp_mirror->broken_video) { - logger_log(raop_rtp_mirror->logger, LOGGER_ERR, "*** ERROR decryption of video failed"); - } - raop_rtp_mirror->broken_video = true; - } + if (!valid || nalu_size != payload_size) payload_decrypted[0] = 1; /* mark as invalid */ + + h264_decode_struct h264_data; + h264_data.data_len = payload_size; + h264_data.data = payload_decrypted; + h264_data.frame_type = 1; + h264_data.pts = ntp_timestamp; + raop_rtp_mirror->callbacks.video_process(raop_rtp_mirror->callbacks.cls, raop_rtp_mirror->ntp, &h264_data); + free(payload_decrypted); } else if ((payload_type & 255) == 1) { // The information in the payload contains an SPS and a PPS NAL @@ -482,7 +475,6 @@ raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned /* Create the thread and initialize running values */ raop_rtp_mirror->running = 1; raop_rtp_mirror->joined = 0; - raop_rtp_mirror->broken_video = false; THREAD_CREATE(raop_rtp_mirror->thread_mirror, raop_rtp_mirror_thread, raop_rtp_mirror); MUTEX_UNLOCK(raop_rtp_mirror->run_mutex); diff --git a/renderers/audio_renderer_gstreamer.c b/renderers/audio_renderer_gstreamer.c index 5a34a0f..0a9ef4a 100644 --- a/renderers/audio_renderer_gstreamer.c +++ b/renderers/audio_renderer_gstreamer.c @@ -209,7 +209,7 @@ void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data if (counter == 2) broken_audio = false; if (!broken_audio) gst_app_src_push_buffer(GST_APP_SRC(renderer->appsrc), buffer); } else { - if(!broken_audio) logger_log(logger, LOGGER_ERR, "*** ERROR decryption of audio (compression_type %d) failed ", renderer->ct); + if (!broken_audio) logger_log(logger, LOGGER_ERR, "*** ERROR decryption of audio (compression_type %d) failed ", renderer->ct); broken_audio = true; counter = 0; } diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 895a59b..3f54e3d 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -94,6 +94,7 @@ static void append_videoflip (GString *launch, const videoflip_t *flip, const vi static video_renderer_t *renderer = NULL; static logger_t *logger = NULL; +static bool broken_video; void video_renderer_init(logger_t *render_logger, const char *server_name, videoflip_t videoflip[2], const char *videosink) { GError *error = NULL; @@ -143,28 +144,33 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, vide } void video_renderer_start() { + broken_video = false; gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING); renderer->bus = gst_element_get_bus(renderer->pipeline); } void video_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type) { GstBuffer *buffer; - assert(data_len != 0); - - buffer = gst_buffer_new_and_alloc(data_len); - assert(buffer != NULL); - GST_BUFFER_DTS(buffer) = (GstClockTime)pts; - gst_buffer_fill(buffer, 0, data, data_len); - gst_app_src_push_buffer (GST_APP_SRC(renderer->appsrc), buffer); - + /* first four bytes of valid video data are 0x0, 0x0, 0x0, 0x1 */ + /* first byte of invalid data (decryption failed) is 0x1 */ + if (data[0]) { + if (!broken_video) logger_log(logger, LOGGER_ERR, "*** ERROR decryption of video failed "); + broken_video = true; + } else { + broken_video = false; + buffer = gst_buffer_new_and_alloc(data_len); + assert(buffer != NULL); + GST_BUFFER_DTS(buffer) = (GstClockTime)pts; + gst_buffer_fill(buffer, 0, data, data_len); + gst_app_src_push_buffer (GST_APP_SRC(renderer->appsrc), buffer); #ifdef X_DISPLAY_FIX - if(renderer->gst_window && !(renderer->gst_window->window)) { - fix_x_window_name(renderer->gst_window, renderer->server_name); - } + if (renderer->gst_window && !(renderer->gst_window->window)) { + fix_x_window_name(renderer->gst_window, renderer->server_name); + } #endif + } } - void video_renderer_flush(video_renderer_t *renderer) { }