From 5291021fd3171347717d7703609161676e4fe794 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Mon, 30 Dec 2024 09:18:04 -0600 Subject: [PATCH 01/11] Add sync-debug logging to help see timecodes and timestamps --- CMakeLists.txt | 2 ++ src/ndi-filter.cpp | 23 ++++++++++++++++ src/ndi-output.cpp | 12 ++++++++- src/ndi-source.cpp | 28 +++++++++++++++++++ src/obs-support/sync-debug.cpp | 49 ++++++++++++++++++++++++++++++++++ src/obs-support/sync-debug.h | 12 +++++++++ src/plugin-main.cpp | 4 ++- 7 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/obs-support/sync-debug.cpp create mode 100644 src/obs-support/sync-debug.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d713b4c..d3a60a91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,8 @@ target_sources( src/obs-support/remote-text.hpp src/obs-support/shared-update.cpp src/obs-support/shared-update.hpp + src/obs-support/sync-debug.cpp + src/obs-support/sync-debug.h src/config.cpp src/config.h src/main-output.cpp diff --git a/src/ndi-filter.cpp b/src/ndi-filter.cpp index 67a2e293..1e874738 100644 --- a/src/ndi-filter.cpp +++ b/src/ndi-filter.cpp @@ -16,6 +16,7 @@ ******************************************************************************/ #include "plugin-main.h" +#include "obs-support/sync-debug.h" #include #include @@ -125,6 +126,10 @@ void ndi_filter_raw_video(void *data, video_data *frame) if (!frame || !frame->data[0]) return; + obs_sync_debug_log("OBS -> ndi_filter_raw_video", + obs_source_get_name(f->obs_source), (uint64_t)0, + frame->timestamp); + NDIlib_video_frame_v2_t video_frame = {0}; video_frame.xres = f->known_width; video_frame.yres = f->known_height; @@ -138,6 +143,11 @@ void ndi_filter_raw_video(void *data, video_data *frame) video_frame.line_stride_in_bytes = frame->linesize[0]; pthread_mutex_lock(&f->ndi_sender_video_mutex); + + obs_sync_debug_log("NDI <- ndi_filter_raw_video", + obs_source_get_name(f->obs_source), + video_frame.timecode, video_frame.timestamp); + ndiLib->send_send_video_v2(f->ndi_sender, &video_frame); pthread_mutex_unlock(&f->ndi_sender_video_mutex); } @@ -201,6 +211,10 @@ void ndi_filter_offscreen_render(void *data, uint32_t, uint32_t) video_frame output_frame; if (video_output_lock_frame(f->video_output, &output_frame, 1, os_gettime_ns())) { + obs_sync_debug_log("OBS -> ndi_filter_offscreen_render", + obs_source_get_name(f->obs_source), + 0, obs_get_video_frame_time()); + if (f->video_data) { gs_stagesurface_unmap(f->stagesurface); f->video_data = nullptr; @@ -372,6 +386,10 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) // ndi-output.cpp/ndi_output_raw_audio(...) auto f = (ndi_filter_t *)data; + obs_sync_debug_log("OBS -> ndi_filter_asyncaudio", + obs_source_get_name(f->obs_source), 0, + audio_data->timestamp); + obs_get_audio_info(&f->oai); NDIlib_audio_frame_v2_t audio_frame = {0}; @@ -410,6 +428,11 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) audio_frame.p_data = (float *)f->audio_conv_buffer; pthread_mutex_lock(&f->ndi_sender_audio_mutex); + + obs_sync_debug_log("NDI <- ndi_filter_asyncaudio", + obs_source_get_name(f->obs_source), + audio_frame.timecode, audio_frame.timestamp); + ndiLib->send_send_audio_v2(f->ndi_sender, &audio_frame); pthread_mutex_unlock(&f->ndi_sender_audio_mutex); diff --git a/src/ndi-output.cpp b/src/ndi-output.cpp index 14006d85..14c5aa8c 100644 --- a/src/ndi-output.cpp +++ b/src/ndi-output.cpp @@ -16,6 +16,7 @@ ******************************************************************************/ #include "plugin-main.h" +#include "obs-support/sync-debug.h" static FORCE_INLINE uint32_t min_uint32(uint32_t a, uint32_t b) { @@ -328,7 +329,8 @@ void ndi_output_rawvideo(void *data, video_data *frame) auto o = (ndi_output_t *)data; if (!o->started || !o->frame_width || !o->frame_height) return; - + obs_sync_debug_log("OBS -> ndi_output_rawvideo", o->ndi_name, + (uint64_t)0, frame->timestamp); uint32_t width = o->frame_width; uint32_t height = o->frame_height; @@ -352,6 +354,9 @@ void ndi_output_rawvideo(void *data, video_data *frame) video_frame.line_stride_in_bytes = frame->linesize[0]; } + obs_sync_debug_log("NDI <- ndi_output_rawvideo", o->ndi_name, + video_frame.timecode, video_frame.timestamp); + ndiLib->send_send_video_async_v2(o->ndi_sender, &video_frame); } @@ -363,6 +368,9 @@ void ndi_output_rawaudio(void *data, audio_data *frame) if (!o->started || !o->audio_samplerate || !o->audio_channels) return; + obs_sync_debug_log("OBS -> ndi_output_rawaudio", o->ndi_name, + (uint64_t)0, frame->timestamp); + NDIlib_audio_frame_v3_t audio_frame = {0}; audio_frame.sample_rate = o->audio_samplerate; audio_frame.no_channels = (int)o->audio_channels; @@ -399,6 +407,8 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.p_data = o->audio_conv_buffer; + obs_sync_debug_log("NDI <- ndi_output_rawaudio", o->ndi_name, + audio_frame.timecode, audio_frame.timestamp); ndiLib->send_send_audio_v3(o->ndi_sender, &audio_frame); } diff --git a/src/ndi-source.cpp b/src/ndi-source.cpp index 409143fe..278a207d 100644 --- a/src/ndi-source.cpp +++ b/src/ndi-source.cpp @@ -20,6 +20,7 @@ #include #include +#include "obs-support/sync-debug.h" #include #include @@ -809,6 +810,11 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, return; } + obs_sync_debug_log("NDI -> ndi_source_thread_process_audio2", + obs_source_get_name(obs_source), + ndi_audio_frame2->timecode, + ndi_audio_frame2->timestamp); + const int channelCount = ndi_audio_frame2->no_channels > 8 ? 8 : ndi_audio_frame2->no_channels; @@ -836,6 +842,10 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, (i * ndi_audio_frame2->channel_stride_in_bytes); } + obs_sync_debug_log("OBS <- ndi_source_thread_process_audio2", + obs_source_get_name(obs_source), (int64_t)0, + obs_audio_frame->timestamp); + obs_source_output_audio(obs_source, obs_audio_frame); } @@ -848,6 +858,11 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, return; } + obs_sync_debug_log("NDI -> ndi_source_thread_process_audio3", + obs_source_get_name(obs_source), + ndi_audio_frame3->timecode, + ndi_audio_frame3->timestamp); + const int channelCount = ndi_audio_frame3->no_channels > 8 ? 8 : ndi_audio_frame3->no_channels; @@ -875,6 +890,10 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, (i * ndi_audio_frame3->channel_stride_in_bytes); } + obs_sync_debug_log("OBS <- ndi_source_thread_process_audio3", + obs_source_get_name(obs_source), (int64_t)0, + obs_audio_frame->timestamp); + obs_source_output_audio(obs_source, obs_audio_frame); } @@ -883,6 +902,11 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, obs_source *obs_source, obs_source_frame *obs_video_frame) { + obs_sync_debug_log("NDI -> ndi_source_thread_process_video2", + obs_source_get_name(obs_source), + ndi_video_frame->timecode, + ndi_video_frame->timestamp); + switch (ndi_video_frame->FourCC) { case NDIlib_FourCC_type_BGRA: obs_video_frame->format = VIDEO_FORMAT_BGRA; @@ -939,6 +963,10 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, obs_video_frame->color_range_min, obs_video_frame->color_range_max); + obs_sync_debug_log("OBS <- ndi_source_thread_process_video2", + obs_source_get_name(obs_source), (int64_t)0, + obs_video_frame->timestamp); + obs_source_output_video(obs_source, obs_video_frame); } diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp new file mode 100644 index 00000000..74eb71ce --- /dev/null +++ b/src/obs-support/sync-debug.cpp @@ -0,0 +1,49 @@ +#include "obs-support/sync-debug.h" + +// Shared map to store the last log time for each message +static std::map lastLogTime; + +// Function to clear the lastLogTime map +void obs_clear_last_log_time() +{ + lastLogTime.clear(); + obs_log(LOG_INFO, "Cleared lastLogTime map."); +} + +// Function to log messages with a cooldown for each message +void obs_sync_debug_log(const char *message, const char *source_ndi_name, + uint64_t timecode, uint64_t timestamp) +{ + if ((LOG_LEVEL != LOG_VERBOSE) || (lastLogTime.size() >= 100)) + return; + + auto now = std::chrono::steady_clock::now(); + + std::string key = std::string(message) + " [" + + std::string(source_ndi_name) + "]"; + auto it = lastLogTime.find(key); + if (it == lastLogTime.end() || + std::chrono::duration_cast(now - it->second) + .count() >= 5) { + + std::string timecodeStr = "N/A"; + if (timecode > (uint64_t)0) { + timecodeStr = + (timecode == LLONG_MAX) + ? "MAX" + : std::to_string(timecode / 1000000); + } + + std::string timestampStr = "N/A"; + if (timestamp > (uint64_t)0) { + timestampStr = + (timestamp == LLONG_MAX) + ? "MAX" + : std::to_string(timestamp / 1000000); + } + + obs_log(LOG_VERBOSE, "tc=%14s ts=%14s: %s", timecodeStr.c_str(), + timestampStr.c_str(), key.c_str()); + lastLogTime[key] = now; + } +} diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h new file mode 100644 index 00000000..7ba84141 --- /dev/null +++ b/src/obs-support/sync-debug.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include +#include +#include +#include "plugin-support.h" + +void obs_sync_debug_log(const char *checkpoint, const char *source_ndi_name, + uint64_t timecode, uint64_t timestamp); + +void obs_clear_last_log_time(); \ No newline at end of file diff --git a/src/plugin-main.cpp b/src/plugin-main.cpp index ffaaea85..65ad8f66 100644 --- a/src/plugin-main.cpp +++ b/src/plugin-main.cpp @@ -16,7 +16,7 @@ ******************************************************************************/ #include "plugin-main.h" - +#include "obs-support/sync-debug.h" #include "forms/output-settings.h" #include "forms/update.h" #include "main-output.h" @@ -373,6 +373,8 @@ void obs_module_unload(void) delete loaded_lib; } + obs_clear_last_log_time(); + obs_log(LOG_INFO, "-obs_module_unload(): goodbye!"); } From a824f9c89c2fff8266dd660488990f5ee33b940e Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Mon, 30 Dec 2024 09:46:02 -0600 Subject: [PATCH 02/11] Add empty line to sync-debug.h --- src/obs-support/sync-debug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h index 7ba84141..de82edc9 100644 --- a/src/obs-support/sync-debug.h +++ b/src/obs-support/sync-debug.h @@ -9,4 +9,4 @@ void obs_sync_debug_log(const char *checkpoint, const char *source_ndi_name, uint64_t timecode, uint64_t timestamp); -void obs_clear_last_log_time(); \ No newline at end of file +void obs_clear_last_log_time(); From 5dd00e30728132196cdcb771350ac94b2c6aa029 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Mon, 6 Jan 2025 17:11:43 -0600 Subject: [PATCH 03/11] Add sync testing using special video/audio input --- src/ndi-filter.cpp | 8 +- src/ndi-output.cpp | 6 +- src/ndi-source.cpp | 12 ++- src/obs-support/sync-debug.cpp | 151 +++++++++++++++++++++++++++++++++ src/obs-support/sync-debug.h | 31 ++++++- 5 files changed, 201 insertions(+), 7 deletions(-) diff --git a/src/ndi-filter.cpp b/src/ndi-filter.cpp index 1e874738..414e0a6e 100644 --- a/src/ndi-filter.cpp +++ b/src/ndi-filter.cpp @@ -147,7 +147,9 @@ void ndi_filter_raw_video(void *data, video_data *frame) obs_sync_debug_log("NDI <- ndi_filter_raw_video", obs_source_get_name(f->obs_source), video_frame.timecode, video_frame.timestamp); - + OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_filter", + obs_source_get_name(f->obs_source), + &video_frame); ndiLib->send_send_video_v2(f->ndi_sender, &video_frame); pthread_mutex_unlock(&f->ndi_sender_video_mutex); } @@ -432,7 +434,9 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) obs_sync_debug_log("NDI <- ndi_filter_asyncaudio", obs_source_get_name(f->obs_source), audio_frame.timecode, audio_frame.timestamp); - + OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_filter", + obs_source_get_name(f->obs_source), + &audio_frame); ndiLib->send_send_audio_v2(f->ndi_sender, &audio_frame); pthread_mutex_unlock(&f->ndi_sender_audio_mutex); diff --git a/src/ndi-output.cpp b/src/ndi-output.cpp index 14c5aa8c..494de730 100644 --- a/src/ndi-output.cpp +++ b/src/ndi-output.cpp @@ -356,7 +356,8 @@ void ndi_output_rawvideo(void *data, video_data *frame) obs_sync_debug_log("NDI <- ndi_output_rawvideo", o->ndi_name, video_frame.timecode, video_frame.timestamp); - + OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_output", o->ndi_name, + &video_frame); ndiLib->send_send_video_async_v2(o->ndi_sender, &video_frame); } @@ -406,7 +407,8 @@ void ndi_output_rawaudio(void *data, audio_data *frame) } audio_frame.p_data = o->audio_conv_buffer; - + OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_output", o->ndi_name, + &audio_frame); obs_sync_debug_log("NDI <- ndi_output_rawaudio", o->ndi_name, audio_frame.timecode, audio_frame.timestamp); ndiLib->send_send_audio_v3(o->ndi_sender, &audio_frame); diff --git a/src/ndi-source.cpp b/src/ndi-source.cpp index 278a207d..fb40753c 100644 --- a/src/ndi-source.cpp +++ b/src/ndi-source.cpp @@ -814,7 +814,9 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, obs_source_get_name(obs_source), ndi_audio_frame2->timecode, ndi_audio_frame2->timestamp); - + OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", + obs_source_get_name(obs_source), + ndi_audio_frame2); const int channelCount = ndi_audio_frame2->no_channels > 8 ? 8 : ndi_audio_frame2->no_channels; @@ -863,6 +865,10 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, ndi_audio_frame3->timecode, ndi_audio_frame3->timestamp); + OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", + obs_source_get_name(obs_source), + ndi_audio_frame3); + const int channelCount = ndi_audio_frame3->no_channels > 8 ? 8 : ndi_audio_frame3->no_channels; @@ -906,7 +912,9 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, obs_source_get_name(obs_source), ndi_video_frame->timecode, ndi_video_frame->timestamp); - + OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI -> ndi_source_thread", + obs_source_get_name(obs_source), + ndi_video_frame); switch (ndi_video_frame->FourCC) { case NDIlib_FourCC_type_BGRA: obs_video_frame->format = VIDEO_FORMAT_BGRA; diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index 74eb71ce..27446f5c 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -6,6 +6,9 @@ static std::map lastLogTime; // Function to clear the lastLogTime map void obs_clear_last_log_time() { + if (lastLogTime.size() == 0) + return; + lastLogTime.clear(); obs_log(LOG_INFO, "Cleared lastLogTime map."); } @@ -47,3 +50,151 @@ void obs_sync_debug_log(const char *message, const char *source_ndi_name, lastLogTime[key] = now; } } + +std::map audio_on; +std::map audio_on_time; +std::map white_on; +std::map white_on_time; + +int64_t obs_sync_white_time(int64_t time, uint8_t *p_data) +{ + uint8_t pixel0 = p_data[0]; + uint8_t pixel1 = p_data[1]; + uint8_t pixel2 = p_data[2]; + uint8_t pixel3 = p_data[3]; + bool white = (((pixel0 == 128) && (pixel1 == 235)) || + ((pixel0 == 255) && (pixel1 == 255))); + return white ? time : 0; +} +int64_t obs_sync_audio_time(int64_t time, float *p_data, int nsamples, + int samplerate) +{ + int64_t return_time = 0; + int sample = 0; + while (sample < nsamples) { + auto sample_amp = p_data[sample]; + if (sample_amp != 0.0f) { + int64_t ns_per_sample = 1000000000 / samplerate; + return_time = time + sample * ns_per_sample; + float sample_amp_prev = 0.0f; + if (sample > 0) + sample_amp_prev = p_data[sample - 1]; + return return_time; + } + sample++; + } + return return_time; +} + +void obs_sync_debug_log_video_time(const char *message, + const char *source_ndi_name, + NDIlib_video_frame_v2_t *video_frame) +{ + if ((LOG_LEVEL != LOG_VERBOSE) || (white_on.size() >= 100)) + return; + std::string key = std::string(message) + " [" + + std::string(source_ndi_name) + "]"; + + auto wo = white_on.find(key); + if (wo == white_on.end()) { + white_on[key] = false; + wo = white_on.find(key); + } + + // If white frame is going from off to on, log the frame time, audio time and diff + auto white_time = obs_sync_white_time(video_frame->timecode * 100, + video_frame->p_data); + if (!wo->second && (white_time > 0)) { + white_on[key] = true; + white_on_time[key] = white_time; + + auto diff = white_on_time[key] - audio_on_time[key]; + + std::string wtimeStr = "N/A"; + if (white_on_time[key] > (uint64_t)0) { + wtimeStr = (white_on_time[key] == LLONG_MAX) + ? "MAX" + : std::to_string(white_on_time[key] / + 1000000); + } + + std::string atimeStr = "N/A"; + if (audio_on_time[key] > (uint64_t)0) { + atimeStr = (audio_on_time[key] == LLONG_MAX) + ? "MAX" + : std::to_string(audio_on_time[key] / + 1000000); + } + + std::string dtimeStr = "N/A"; + if ((audio_on_time[key] > (uint64_t)0) && + (white_on_time[key] > (uint64_t)0)) { + + dtimeStr = ((audio_on_time[key] == LLONG_MAX) || + (white_on_time[key] == LLONG_MAX)) + ? "MAX" + : std::to_string(diff / 1000000); + } + obs_log(LOG_VERBOSE, "AT %14s WT %14s: %5s %s", + atimeStr.c_str(), wtimeStr.c_str(), dtimeStr.c_str(), + key.c_str()); + + } else if (wo->second && (white_time == 0)) { + white_on[key] = false; + } +} +void obs_sync_debug_log_audio_time(const char *message, + const char *source_ndi_name, + NDIlib_audio_frame_v2_t *audio_frame2) +{ + if ((LOG_LEVEL != LOG_VERBOSE) || (audio_on.size() >= 100)) + return; + std::string key = std::string(message) + " [" + + std::string(source_ndi_name) + "]"; + + auto ao = audio_on.find(key); + if (ao == audio_on.end()) { + audio_on[key] = false; // set audio off + ao = audio_on.find(key); + } + + // If audio on, log the frame time + auto audio_time = obs_sync_audio_time(audio_frame2->timecode * 100, + audio_frame2->p_data, + audio_frame2->no_samples, + audio_frame2->sample_rate); + if (!ao->second && (audio_time > 0)) { + ao->second = true; // set audio on + audio_on_time[key] = audio_time; + } else if (ao->second && (audio_time == 0)) { + ao->second = false; + } +} + +void obs_sync_debug_log_audio_time(const char *message, + const char *source_ndi_name, + NDIlib_audio_frame_v3_t *audio_frame2) +{ + if ((LOG_LEVEL != LOG_VERBOSE) || (audio_on.size() >= 100)) + return; + std::string key = std::string(message) + " [" + + std::string(source_ndi_name) + "]"; + + auto ao = audio_on.find(key); + if (ao == audio_on.end()) { + audio_on[key] = false; + ao = audio_on.find(key); + } + + // If audio on, log the frame time + auto audio_time = obs_sync_audio_time(audio_frame2->timecode * 100, + (float *)audio_frame2->p_data, + audio_frame2->no_samples, + audio_frame2->sample_rate); + if (!ao->second && (audio_time > 0)) { + ao->second = true; + audio_on_time[key] = audio_time; + } else if (ao->second && (audio_time == 0)) { + ao->second = false; + } +} \ No newline at end of file diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h index de82edc9..be80e849 100644 --- a/src/obs-support/sync-debug.h +++ b/src/obs-support/sync-debug.h @@ -4,9 +4,38 @@ #include #include #include +#include "plugin-main.h" #include "plugin-support.h" void obs_sync_debug_log(const char *checkpoint, const char *source_ndi_name, uint64_t timecode, uint64_t timestamp); - +void obs_sync_debug_log_video_time(const char *message, + const char *source_ndi_name, + NDIlib_video_frame_v2_t *video_frame); +void obs_sync_debug_log_audio_time(const char *message, + const char *source_ndi_name, + NDIlib_audio_frame_v2_t *audio_frame); +void obs_sync_debug_log_audio_time(const char *message, + const char *source_ndi_name, + NDIlib_audio_frame_v3_t *audio_frame); void obs_clear_last_log_time(); + +// Uncomment to enable measuring audio and video time differences +// using black/white frames and audio on white frames +// #define SYNC_DEBUG 1 +#ifdef SYNC_DEBUG +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, video_frame) \ + obs_sync_debug_log_video_time(message, source_ndi_name, video_frame) +#else +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, video_frame) \ + do { \ + } while (0) +#endif +#ifdef SYNC_DEBUG +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, audio_frame2) \ + obs_sync_debug_log_audio_time(message, source_ndi_name, audio_frame2) +#else +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, audio_frame2) \ + do { \ + } while (0) +#endif \ No newline at end of file From 7ca70b0bb2d1b82d8fa6fc5b8c18fe315a648504 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Tue, 14 Jan 2025 15:47:00 -0600 Subject: [PATCH 04/11] Refine sync debug to work on outputs and simplify code --- src/ndi-filter.cpp | 8 ++++-- src/ndi-output.cpp | 7 +++-- src/ndi-source.cpp | 27 ++++++++++++------ src/obs-support/sync-debug.cpp | 50 ++++++++-------------------------- src/obs-support/sync-debug.h | 21 ++++++-------- 5 files changed, 50 insertions(+), 63 deletions(-) diff --git a/src/ndi-filter.cpp b/src/ndi-filter.cpp index 414e0a6e..367558e9 100644 --- a/src/ndi-filter.cpp +++ b/src/ndi-filter.cpp @@ -139,6 +139,7 @@ void ndi_filter_raw_video(void *data, video_data *frame) video_frame.picture_aspect_ratio = 0; // square pixels video_frame.frame_format_type = NDIlib_frame_format_type_progressive; video_frame.timecode = (frame->timestamp / 100); + video_frame.timestamp = frame->timestamp; video_frame.p_data = frame->data[0]; video_frame.line_stride_in_bytes = frame->linesize[0]; @@ -149,7 +150,7 @@ void ndi_filter_raw_video(void *data, video_data *frame) video_frame.timecode, video_frame.timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_filter", obs_source_get_name(f->obs_source), - &video_frame); + video_frame.timestamp, (uint8_t *)video_frame.p_data); ndiLib->send_send_video_v2(f->ndi_sender, &video_frame); pthread_mutex_unlock(&f->ndi_sender_video_mutex); } @@ -215,7 +216,7 @@ void ndi_filter_offscreen_render(void *data, uint32_t, uint32_t) os_gettime_ns())) { obs_sync_debug_log("OBS -> ndi_filter_offscreen_render", obs_source_get_name(f->obs_source), - 0, obs_get_video_frame_time()); + 0, os_gettime_ns()); if (f->video_data) { gs_stagesurface_unmap(f->stagesurface); @@ -398,6 +399,7 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) audio_frame.sample_rate = f->oai.samples_per_sec; audio_frame.no_channels = f->oai.speakers; audio_frame.timecode = audio_data->timestamp / 100; + audio_frame.timestamp = audio_data->timestamp; audio_frame.no_samples = audio_data->frames; audio_frame.channel_stride_in_bytes = audio_frame.no_samples * 4; @@ -436,7 +438,7 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) audio_frame.timecode, audio_frame.timestamp); OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_filter", obs_source_get_name(f->obs_source), - &audio_frame); + audio_frame.timestamp, audio_frame.p_data, audio_frame.no_samples, audio_frame.sample_rate); ndiLib->send_send_audio_v2(f->ndi_sender, &audio_frame); pthread_mutex_unlock(&f->ndi_sender_audio_mutex); diff --git a/src/ndi-output.cpp b/src/ndi-output.cpp index 494de730..f05021d6 100644 --- a/src/ndi-output.cpp +++ b/src/ndi-output.cpp @@ -342,6 +342,7 @@ void ndi_output_rawvideo(void *data, video_data *frame) video_frame.frame_rate_D = 100; video_frame.frame_format_type = NDIlib_frame_format_type_progressive; video_frame.timecode = frame->timestamp / 100; + video_frame.timestamp = frame->timestamp; video_frame.FourCC = o->frame_fourcc; if (video_frame.FourCC == NDIlib_FourCC_type_UYVY) { @@ -357,7 +358,7 @@ void ndi_output_rawvideo(void *data, video_data *frame) obs_sync_debug_log("NDI <- ndi_output_rawvideo", o->ndi_name, video_frame.timecode, video_frame.timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_output", o->ndi_name, - &video_frame); + video_frame.timestamp, (uint8_t *)video_frame.p_data); ndiLib->send_send_video_async_v2(o->ndi_sender, &video_frame); } @@ -376,6 +377,7 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.sample_rate = o->audio_samplerate; audio_frame.no_channels = (int)o->audio_channels; audio_frame.timecode = NDIlib_send_timecode_synthesize; + audio_frame.timestamp = frame->timestamp; audio_frame.no_samples = frame->frames; audio_frame.channel_stride_in_bytes = frame->frames * 4; audio_frame.FourCC = NDIlib_FourCC_audio_type_FLTP; @@ -408,7 +410,8 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.p_data = o->audio_conv_buffer; OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_output", o->ndi_name, - &audio_frame); + audio_frame.timestamp, (float *)audio_frame.p_data, + audio_frame.no_samples, audio_frame.sample_rate); obs_sync_debug_log("NDI <- ndi_output_rawaudio", o->ndi_name, audio_frame.timecode, audio_frame.timestamp); ndiLib->send_send_audio_v3(o->ndi_sender, &audio_frame); diff --git a/src/ndi-source.cpp b/src/ndi-source.cpp index fb40753c..1dc50ffa 100644 --- a/src/ndi-source.cpp +++ b/src/ndi-source.cpp @@ -717,7 +717,7 @@ void *ndi_source_thread(void *data) if (video_frame2.p_data && (video_frame2.timestamp > timestamp_video)) { //blog(LOG_INFO, "v");//ideo_frame"); - timestamp_video = video_frame2.timestamp; + timestamp_video = video_frame2.timestamp; ndi_source_thread_process_video2( &s->config, &video_frame2, s->obs_source, &obs_video_frame); @@ -816,7 +816,8 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, ndi_audio_frame2->timestamp); OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", obs_source_get_name(obs_source), - ndi_audio_frame2); + ndi_audio_frame2->timestamp, ndi_audio_frame2->p_data, + ndi_audio_frame2->no_samples, ndi_audio_frame2->sample_rate ); const int channelCount = ndi_audio_frame2->no_channels > 8 ? 8 : ndi_audio_frame2->no_channels; @@ -847,7 +848,10 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, obs_sync_debug_log("OBS <- ndi_source_thread_process_audio2", obs_source_get_name(obs_source), (int64_t)0, obs_audio_frame->timestamp); - + OBS_SYNC_DEBUG_LOG_AUDIO_TIME( + "OBS <- ndi_source_thread", obs_source_get_name(obs_source), + obs_audio_frame->timestamp, (float *)obs_audio_frame->data[0], + obs_audio_frame->frames, obs_audio_frame->samples_per_sec); obs_source_output_audio(obs_source, obs_audio_frame); } @@ -866,8 +870,9 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, ndi_audio_frame3->timestamp); OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", - obs_source_get_name(obs_source), - ndi_audio_frame3); + obs_source_get_name(obs_source), + ndi_audio_frame3->timestamp, (float *)ndi_audio_frame3->p_data, + ndi_audio_frame3->no_samples, ndi_audio_frame3->sample_rate); const int channelCount = ndi_audio_frame3->no_channels > 8 ? 8 @@ -899,7 +904,10 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, obs_sync_debug_log("OBS <- ndi_source_thread_process_audio3", obs_source_get_name(obs_source), (int64_t)0, obs_audio_frame->timestamp); - + OBS_SYNC_DEBUG_LOG_AUDIO_TIME( + "OBS <- ndi_source_thread", obs_source_get_name(obs_source), + obs_audio_frame->timestamp, (float *)obs_audio_frame->data[0], + obs_audio_frame->frames, obs_audio_frame->samples_per_sec); obs_source_output_audio(obs_source, obs_audio_frame); } @@ -914,7 +922,7 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, ndi_video_frame->timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI -> ndi_source_thread", obs_source_get_name(obs_source), - ndi_video_frame); + ndi_video_frame->timestamp, (uint8_t *)ndi_video_frame->p_data); switch (ndi_video_frame->FourCC) { case NDIlib_FourCC_type_BGRA: obs_video_frame->format = VIDEO_FORMAT_BGRA; @@ -974,7 +982,10 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, obs_sync_debug_log("OBS <- ndi_source_thread_process_video2", obs_source_get_name(obs_source), (int64_t)0, obs_video_frame->timestamp); - + OBS_SYNC_DEBUG_LOG_VIDEO_TIME( + "OBS <- ndi_source_thread", obs_source_get_name(obs_source), + (int64_t)obs_video_frame->timestamp, + obs_video_frame->data[0]); obs_source_output_video(obs_source, obs_video_frame); } diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index 27446f5c..172c19d4 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -1,6 +1,7 @@ #include "obs-support/sync-debug.h" +#include -// Shared map to store the last log time for each message + // Shared map to store the last log time for each message static std::map lastLogTime; // Function to clear the lastLogTime map @@ -38,6 +39,7 @@ void obs_sync_debug_log(const char *message, const char *source_ndi_name, } std::string timestampStr = "N/A"; + if (timestamp > (uint64_t)0) { timestampStr = (timestamp == LLONG_MAX) @@ -88,7 +90,7 @@ int64_t obs_sync_audio_time(int64_t time, float *p_data, int nsamples, void obs_sync_debug_log_video_time(const char *message, const char *source_ndi_name, - NDIlib_video_frame_v2_t *video_frame) + uint64_t timestamp, uint8_t *data) { if ((LOG_LEVEL != LOG_VERBOSE) || (white_on.size() >= 100)) return; @@ -102,8 +104,8 @@ void obs_sync_debug_log_video_time(const char *message, } // If white frame is going from off to on, log the frame time, audio time and diff - auto white_time = obs_sync_white_time(video_frame->timecode * 100, - video_frame->p_data); + auto white_time = obs_sync_white_time(timestamp, + data); if (!wo->second && (white_time > 0)) { white_on[key] = true; white_on_time[key] = white_time; @@ -135,7 +137,7 @@ void obs_sync_debug_log_video_time(const char *message, ? "MAX" : std::to_string(diff / 1000000); } - obs_log(LOG_VERBOSE, "AT %14s WT %14s: %5s %s", + obs_log(LOG_VERBOSE, "~___~___ Sync Test Data Found: AT %14s WT %14s: %5s %s", atimeStr.c_str(), wtimeStr.c_str(), dtimeStr.c_str(), key.c_str()); @@ -145,7 +147,7 @@ void obs_sync_debug_log_video_time(const char *message, } void obs_sync_debug_log_audio_time(const char *message, const char *source_ndi_name, - NDIlib_audio_frame_v2_t *audio_frame2) + uint64_t timestamp, float *data, int no_samples, int sample_rate) { if ((LOG_LEVEL != LOG_VERBOSE) || (audio_on.size() >= 100)) return; @@ -159,10 +161,10 @@ void obs_sync_debug_log_audio_time(const char *message, } // If audio on, log the frame time - auto audio_time = obs_sync_audio_time(audio_frame2->timecode * 100, - audio_frame2->p_data, - audio_frame2->no_samples, - audio_frame2->sample_rate); + auto audio_time = obs_sync_audio_time(timestamp, + data, + no_samples, + sample_rate); if (!ao->second && (audio_time > 0)) { ao->second = true; // set audio on audio_on_time[key] = audio_time; @@ -170,31 +172,3 @@ void obs_sync_debug_log_audio_time(const char *message, ao->second = false; } } - -void obs_sync_debug_log_audio_time(const char *message, - const char *source_ndi_name, - NDIlib_audio_frame_v3_t *audio_frame2) -{ - if ((LOG_LEVEL != LOG_VERBOSE) || (audio_on.size() >= 100)) - return; - std::string key = std::string(message) + " [" + - std::string(source_ndi_name) + "]"; - - auto ao = audio_on.find(key); - if (ao == audio_on.end()) { - audio_on[key] = false; - ao = audio_on.find(key); - } - - // If audio on, log the frame time - auto audio_time = obs_sync_audio_time(audio_frame2->timecode * 100, - (float *)audio_frame2->p_data, - audio_frame2->no_samples, - audio_frame2->sample_rate); - if (!ao->second && (audio_time > 0)) { - ao->second = true; - audio_on_time[key] = audio_time; - } else if (ao->second && (audio_time == 0)) { - ao->second = false; - } -} \ No newline at end of file diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h index be80e849..48c6d59c 100644 --- a/src/obs-support/sync-debug.h +++ b/src/obs-support/sync-debug.h @@ -11,31 +11,28 @@ void obs_sync_debug_log(const char *checkpoint, const char *source_ndi_name, uint64_t timecode, uint64_t timestamp); void obs_sync_debug_log_video_time(const char *message, const char *source_ndi_name, - NDIlib_video_frame_v2_t *video_frame); + uint64_t timestamp, uint8_t *data); void obs_sync_debug_log_audio_time(const char *message, const char *source_ndi_name, - NDIlib_audio_frame_v2_t *audio_frame); -void obs_sync_debug_log_audio_time(const char *message, - const char *source_ndi_name, - NDIlib_audio_frame_v3_t *audio_frame); + uint64_t timestamp, float *data, int no_samples, int sample_rate); void obs_clear_last_log_time(); // Uncomment to enable measuring audio and video time differences // using black/white frames and audio on white frames -// #define SYNC_DEBUG 1 +#define SYNC_DEBUG 1 #ifdef SYNC_DEBUG -#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, video_frame) \ - obs_sync_debug_log_video_time(message, source_ndi_name, video_frame) +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, data) \ + obs_sync_debug_log_video_time(message, source_ndi_name, timestamp, data) #else -#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, video_frame) \ +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, data) \ do { \ } while (0) #endif #ifdef SYNC_DEBUG -#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, audio_frame2) \ - obs_sync_debug_log_audio_time(message, source_ndi_name, audio_frame2) +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, data, no_samples, sample_rate) \ + obs_sync_debug_log_audio_time(message, source_ndi_name, timestamp, data, no_samples, sample_rate) #else -#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, audio_frame2) \ +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, data, no_samples, sample_rate) \ do { \ } while (0) #endif \ No newline at end of file From 59dce90192f0ed9dbd183d482085b846e2736483 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Tue, 14 Jan 2025 15:56:22 -0600 Subject: [PATCH 05/11] Sync test data sender exe and a video file with sync data --- tests/SendSyncTestData.exe | Bin 0 -> 138752 bytes tests/SyncTestZeroAV.mp4 | Bin 0 -> 595089 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/SendSyncTestData.exe create mode 100644 tests/SyncTestZeroAV.mp4 diff --git a/tests/SendSyncTestData.exe b/tests/SendSyncTestData.exe new file mode 100644 index 0000000000000000000000000000000000000000..5ab1679136f3106b787b8cca96b38278ec9d22c2 GIT binary patch literal 138752 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

m51U;b<5ds-u}Z!P54y z{xwgr(R~-}1VbFjHSRaWof}$H_8U;oJ7Wn60gM`4bf0~3xg+5ENcTZXw8>-)uf~zVO`_Z4@pVa zlx0BOmiH3)1l!Bl>_4m*h|t_46zF3UxXSx#yU*8d z(21}4QBU0COEr~uI?9Zqu;B;Tel?vw?U6BvgAi7SsFVrPy=UU;_Rb5z8t=5dy)GVi zwj&J{@PBs;R!^rIapOG|VTc%uL3{*Xb8t}>oxsby`Av==$)1atyjkCNV;*|y-{zMV z5guVJCUcvEhKLATMjkc;lS7hoDntgdN@HVVZG85SGNUGZL82;Oj#iDS8xTEEcUrq7 zRiN{xU`V|_rR$8vJZh^Y1If7$ZJbWIX2s7hahl+)O4P>4dQ3{C#AvHz&s>X0+f+3v zYLw34lLzgACPSCo?ltD2C`T0QM>K)JGTZpvdsC+t+a`geX`i;LNMEBf6;moq2wGhQ zCh3pYD>W6FS4G5hn5spD=dQl|i1n;jqMW718KrAJgZe}=Z0K?E!;=Y)2rHN z{J17@)=iTFPsC@Fr<#!$I`e)Ig2*zW_dubY>e;V)XKP8>Bs|Kf=O^r;NZz7#x$yC4Q2|E9{zDaM zaleZvj48hGV|k?^PeX)e<7$<0$*GQ$!1|j=K)`oXk?d-}Gil z@bHOqzQ(9m(J&m3I5>w;kx%+~)ye*3$oq>=w01o8<)|+u#WW0SMlL4oDI-Q3_R+4V zyipk)Wt#nndv{L?^HxNjCC1S&#aEs|FF^X7V@rHYxWmL98WA5JNZFiVwXV8XRbgkB zeX7^?3%qnZ9w5YVu}|l&M1n#XTo|iKqNU@Krh0Ovs7O@vTA{-)m2QOunVVnw1(G{>u!)vi`=Y zht)rPX!gTW6$fc)SqfiY(j?cCRjZWq-srg4#}2)v;(fcVnP}YshE=zuv<|&N?+Rhd zoxQtj%bTuqNd2+VoV)ffyc-^G7~A)h7fLefc+)>M!k?;pya#*M$`_sT`72*jF*&So z8u#tuzRVeSMLH#?31|peibAGK@8*=EbqiN`C(Po`SD6}JXTdc(<7GRuz%T(PX*QWn zGfjt+HSNhZY(ZOyZ|i9g3WT#{RcDe$pR-Tjioxr_XV{{PDSV`^@6it`J>MchxNd6e2aEH?%A$0&XLcOfR*rS7R0*%ea;XHv2U zvT_e}zwu$InY12@z-sj1N_0q3M%?0V!iw8fwk@U=yk6^I`O5dHCG&GXOOt&v%nnU^ zSaQ*Ci7BC?48StWxOtkAujAX61-g>S494a@9L~yB1nEUN&3zxVc+OO~)Y#&{afs#XEJ%*vB6c;1* zplc#2v*=j_EEHCQ_Ep?R@57}i(0&I&P)szX7rG{;p@^13!PGa&_n;IJDA?jMq7H@c z3q?z99~kjtUXvW1vVLIH2&)nJgn1nw@+m0|QzLX+#~O@v9bXuYSlg2t^GQ{lMQ`rh zgRV)k9*){V(SE612=w;Ob_n7a7PJj*WPcM@(@u$&TE~PI@CndTFXpYuyGhAWFvU*H zx4DUO&R*q1p+{FWUGMK98wQJfakm_T#M5Sz%#Ael=BeI3)d|lS&wELt%$&h@EBZ&Z z2Bv~72&=H&*qNS@3HzgRp(+a{=VfNKM?6886%%V|k0oZ)#a?@l?{dij5$;qN)Umm8 ze9for+t3!h)(0ceft5EYiUC8r;d2&rDS!E05wT_ z5ph0Dk(#HOmwmRg5RMD6z>@@Pa+e4i}67E#(Q zpI{S+8+4mS8{vyadu7M@lDw?)tkE=>fn~NwAL>k+(MFZ9`b>3pJT0R4VOE~c*~Wqy z|1`Yz+{J=@84Wb|x~ASD>RLy2^PC>T;`WOduo%2|hF(^wKVHq}eLEjQ<7So1dZr(2 zBL2~=-q|?5h0GwBaQbV1gjPG|weotaY0bE=;>i*dH)`l4P}MbIit?i58or`oO*!Zo z2tnK>zes#O!s~U$HIQiO!x}B(|HR5#@J+E$5SsI4U-G{ko_Bycn&cr+w@G$eX7bn!oKmnitP~cx%fm^?RB!KhFM*_d)QsEs95gZK>9SxBj4FU5d zkkJ7$I)2Y*_?g!Aw+z4swf{{Y)PjWqEEHg&_+0_8`hnH&XvWvi2uS?`sb4=7_(v=h zzaEMH>8>q@1uYoY7GHur<6r+?zqM`v_X*%W;rCtgZ#hT&yyhQ43YdOi`hn^9y8?hI zaGUz`ru66l+@^xt)PLMoKmnitPyi?Z6aWeU1%LuT0iXa-@NY-KUwB*oX2}7P?=c8Cu&RJG$7rtlI<-NL48Ed>y<=yL1+|~1;jiK2wFN-#2zaiz$ z1shn+vZ0Pxvuj?~-BypHXP=@3pK+%bJbx>P$ko2>TAP%2g)2S(m5n*&rC^U38E?7t zi>E#e7};bxS0xr?yh_Tx#!zXcTo*QBdOp?3P2Ie;XQ4pux@Hl6UQLmUsn_eYkTEH& zy_1|aT5$XT^VAwkReBO8>{_`<4S9J=j3ciMMWj^I0hC~l741wFzH!1+6Q`hn!(te3CD5 zPH@D8Ot)9)aZj>HX{;v6ekYMRsT6As#*KUu;}&h)Z~R3_29H@*jvuxm^%`S79xB^N z2*JhK-CP-jCMeJPsui3{UrTw3c$<$^fK=B}&N&c5-mScm`1mZ9NB55A_WsgJwd;qz zmi*Dw&0E%RL#K&dsmHTL=Vz)PhlT2@Ptnfh7kGkvAuJHx?TcczbkXGO%{c7MUL+^nowmgvjUpYk zQjT?3JWdK;uv_Z-CP)CYIO~#yw!NAsI)_WWy*8}(opSrB`c;RayS=WPkYzz0%!{^@B zmG|A58JOg-_Z5(L(~b0n@ffb2rW_olt9gJ^C1(Y>k#niF4ELv5xruMThR|^uyx;)i zG(xU)VhaBUEU7SfN-ZK;EffL?qQJ)4?6~LiX5+pj)vf3~Pe!Er4r6shL&LKiK6rD2 zr+BXje5VZo?MKU9*)0EB`NFfDX=Laa!Dr*^8*URi5*6g>CX2NV`s4FD$HQQgcC%dL z&MR);W}mzha;wO8bBZNbdm!&&_2w3RDx8z+#f1~by6zl%=RNCRp4zD&xK1a@A5Dyk z+IDRsHW0RJtcskkve5kSvX{O6Y~O&bVC(YZ`qJaE?kv1`89B6`X+?xg${8tf17q9G z%XFu54fxUr3=GUAmOk9Vx}UhyL0Sseb-$^eZW?o{%+6ZHn?uF~@i5y(XTtss)7%nM z0xZ#Jw`H| z|49Zhn3w(6Zkh-DUw{HY0iXa-04M+y015yFfC4}Ppa4(+C;$`y3IGLw0zd(v08juZ z@E@SS|6d+4hfTaN9x;bayy8)yi5F<%1)6xxf<$bPi2ZMuhz%w!n6zNh0tx^HfC4}P zpa4(+C;$`y3IGLw0zd(v08juZ02BZU00n>oKmnitPyi?Z6aWeU1%QITXyQfw!}uIi zD!+KxY@pqkhn^ZAyH+L=Qz3r>k4EOORGvl=m9;C?wB)R-;EM%;IL<51rx?A1j3!Yj zzS_NLT&WE+O1IrgDY-hzZjqb9UVU+?YeMk}<`J_{AjMJi9iSBq4EuA4;6McJCqF++lY{FnTpIth_wX3&%B3gl=Y|5ZFg}YVp z)~y^MFCn_KW8HXN)FWvXSm&lY-Ei*@=E5*vxvvQ_j)H&I@TOVta@FO<$iN)@oFn!!K zit^#RUn+R|X&0(l36-#4QMn<|Cw-+O+L9n0XFR4&ZG!#cdfsg4%fXLEZTWaDO;{9X zCPbJbPQAW(LZi!mQ10>tvl4dMEFXl=Vzb>|)$xJy)z8x+PKg2;mmAYz0XQJ@>rw^4`(B8-dakM zrkRglMu>=c)_l(0B(e5(b1R@$i6pj8BdVrj8s=g+Q7@-x#5f}q`#^t+#&?ci>*S;S zmIaU4__UCz3x|CgFq6->-;!U16fZQ0C8M9q9vLwQOPiW|dt6%9kMJ5^aR}dHa)>Jx zc_g-CO~U*W=0p{qlk=5Bg3FTVw6-rDy&hXjT`zJACbs80>MY2_?)SV4>|D>;tco4J zFgq+ck1|fVsX9zOEqFcn@kr${=5dOxUS#|1OO@i>y3o}(C7I`jSz<~3cX!G?hZaoh z6fC#6`Lg>}2%Um%laxtR;j4>KTXl@fULAt5bu4Fb@m09%74(_w%LT@y>rX0~M;*t; z?)jW%Ekx*LV@n#D{PdYmL<2PSMEU%hqp1Y+=>wYgJ6VFp{;%996EnU^RM zyE&gwgy}KH??S2qLTdDs_l`vcXE#-@Gloym1Tz&IT4m^RxTeGzQaoHpm~UP~ns@O^ z7rUg=>(u4Ibt(?N@Lzj&Q2(=8!{PMPq9?(}u9N-I-~v}hIx>=jMg|WD{RXMN=6RAL zDAE@qjhkGq$hXjBQ;CT#(k?`R5`nNsseSVQ(=c^n0PHfO;MhR@sd?~AhQXf$cOY3{6fht;3P_S9NsuIjG zK#(-#oO2rH?`CzEtL}cg-`(%|Z|HvJP&KE{bXC87-b!>=Ato;;5~{S#R$WMZ(YVa! zdf^7WXGf<|S;{FQZHdMR+y2Q@4sUlE5smAu&JSZEV|sLr?bC(PGFQ->kr(Qv%ajyb z_FY0puwY}l-Cpl*8g!q}4>WQ0y!Fo0RqeqWV_Slo1^1U^TME+v4WjR%wc zs`P-@bB-sT4@!8PA%FEhRp;b+}r`JsCCERv|Ju$ys})N@0w z@s;=2wN?g6s^nfanusxwQd1?WQk{xlV|%ql5rUGh1^kkz$m|@Xx_f#gH-_HqxvTix znA|QyFko>CeJA6I)0p09%6gHD+j=R60;BB^WPd|6d?`L~D?3I0^6(?9Id2GeE5FOJ zN8+K3P_I&i`l!Z!4;7oZ)+<76O0$010yk_` zGAQs1jw0R#uaD987X8sOK`UGaa9k}VWA8m3 zqUKX+#+Y3piS0(Q!qcob)SRsxKgi1Ub)bj(Lz|@r>{$FfN>>U=nA@yB#Ns)A{z$;o z>(;Taa_EYC$7}WT!j=k@)s8zkypO^E)~T>lfpo-3$OBKISI}mgtSnU5gLMe_{KzxL z2P&=f9#Ud*Y3DLRE?6oTWnYfSPQ1{0rQ~&<{g3hNA1rg*WzHj#Y!0 zG_Pm{Ylm>|C-iirr` zb6gMFW5pKhw+^RN*tnM>0j`C#c+ZUY((0v1Oiue&>L)xII{r%UAia)2?u~H!(H2w z<_=S$$x&A*oU_*49L<_tX*is-DdjtZ15>wfXv)`jj42(iGxW7}w*>{+-_bkd<8Ck! zKf!_K-$?x+?=hre|%S?ta*a^OeYT`?zz$wnSn<2V1YQxo~PZ z2Rk&KXrA{}`CLDaRI(ep`oL4UBjccE-iP@B#Rrw45&YMKg)gJHg@*HG$C%_bLXN4c z>ohvlkcU>i&+%}mzkE1$J$b%Tm;9|Z{TIjeHXY*Bu{MnC8G8E9Lb9Aa4!-5LOG%w? zU!^3u!CE?e%QUQm@ucR{$-6D00SEZpp1miaYTr*q_w-Fd;#WR{NSY?J>wtVFBzP^Prdd$R(NlO5hy4xUroJwV1dn-Xf%2~{c-;;r=1fQqj#ZjReK2AFO#blqb z>h~Gn(nqpRFt+5bcQ?H3Urxr`Fdcfe@$vSbQSDmoc%pzm4W{su;@G)j3K}MJsZ%fr;6)96(DDw@UJc*igkfFOH0? z+pl}$DaK50&a@Ghr8YNIjfwlcyvx~pIL>qJ!?hUI*QMDD_eyq6{iLn1DaWboe;hqNXzBb0l|d zESe@0vnEYAb{%-gM?QKhIyoPo^D^^^^^aAohLQ!FLNfVwrRSd!PYhQ0oV@d7w#uO_ zK$ZeA>dANcem}+;tw)iYV%yx{BbmZ`l1+lH3+`j zV*3gFgG~~2_|B8;$L(E3H_khf3Iu{{Cm}YsR*m+*SkK`(V=d#18G7v2yw!v4=(e^g zojx3Camy~q*ga^WZEeAA)qVnZ2dlp&K93=6#MI(DIRscaBs*GKIz$-Xm#xe>H1)jv z{JDyPa?w)pyJb>hqNhH!W%OuY{1};Gl%=U3x-w%F{BEX8i@V|tq9f;8p`80bDYnrt&XVGcH6go@+jl)j8(C#LDj8Gql$xGtyUTBORF4L~QSuuFbNi@26)D)q37^vW}3! zcB&`c^Q@F(w1)PSa@@N~;UG>82{Aj7dwB;OZs=WaFG{(}GO?MAIx%lVF&Cx`n60c< zqYN1)SU+=Qsr%O$UX7eY4c^GxCL& zaKW>L3I?lPB*gyyCQlfS8Dm4oeP1;t;Z>tfBT#ZG*9Mo8<6p^Iu!r}{Q2BfCZ|aeU z*1f8*%vy8PIWzB(w`WE?JbK`IS%9t0Ot<*_+tL@r@86lmJMfIV1nnC0X-FZJ=CyGG zE+SqNdWfsCuqLz`>(F4^1eSen?~O*ZQfPTrv!Xp#9oJ5&Qm!KHho1C*dVVEn3{Yt- zx|71ebmcMIVk!S)fkwVLKjoJ_4bR?uFq|&Sdn|Y?WcG^Bnv(S_!Is(BHO^1Hgud(_ zB(^Gi%BUM=dUx3l^DnK2Q|w_=3bd|T+bXOae#I(OIlSDc+=f{7wfu;f$o7_Zk+4sw z4$t=8;NU>{(dO(U*!#iIo6;V0FJLq_TAJUv0(NnxbB+6QeD3c-Y-SvAa%c;T3+mx&nmPHlFF0)5= z!qqG2xflL4TWrJW)8l1%eG?u*JuVbNY{^q&9&G2EDJdP;_U3odMs{~rV14Vv9p^BK zI7xIQ_KRic9Yb8+S+~oztXp~lb9M9c4Zfkb^E^Dmv#So&KEEO*N#3K|d2}dG;9djc z388dG9R7o?vW3tVH03hxp&hzm3NtHVyornPNnG{K!*RUyMd$glhc0dDt_SsPVHOC{ z@ttM8d$GR3-pR8Y=#PgfN0w)TsjZC>h5N>Dif zpdQ3dGCr5%Z%O~qhvMXZ`PFx)2=V1!oq8yuC5a3ShX7Y&aB;E9+9gjF$hYpncWRk! zK=(u0_!q6wr&L>MpYN?{#9>RiKOgd~UB04oME~h0x1#7ThHYzXRk*3Ly5Xj79PYsc z?kH)^;JtY9M^eSHX>EO??r!s$pG&U{-rFi8$gJteUrWg&lhEGGjN3|E6@HD|Kc}&# z@33i{=963Nd#>M@X;bLkLV8~B)3TvUm{wopT;`ie<2rh*R?x(8pZ#xhwENtIW9hdv znYXkBvD!DhY-h`CwyZMepRZ~Qu4eYWHXee~SN9389fwY5x0cya>Y}}-X`D{Jnn}}S ze5k#Y&V_#Wn|qU|S;4fjC{>c+{Snx-J{7rhn~fUdIe6DMHTgzA8B6ZpOb0Ud&lz#i ziAC1m9M=aEcHeL*e=%exezv0P)$2|(N?y7<5#lcaq{;cqS(CehN!PAU-x+pz-)a{< z1aNE*w9nopCX|;8YviJ%x7GE=nLxYgF2c-7KUbXG!8vbyWvTwhUGmsYU6p#oyUO=Vqu zf1dNl2%)1|V{vv>x=#_(_176i^_WB2nnom^67NfUTENwOIGg)@X(-ciwN~~7nx^Xo ziw8d&4yNsYVA(Zbuvw$p%AKm3B;63%=KRI;ptFlN%W&7`NRFzYq*lk{JhtS~5pfy) zO0?v@m&bAp!WDZ|X*KT|Ui382RYPL+6Izg`c2P84!~g6@+1S1(hox%t;uMo7Wh3TA z{Yr$WV9<-Btrqvlq?2Sbb#>jN@aI`}F2_gx%XHXI7445I`X5!he^fF4sAB$6#rmU) z?MD^IFDiIp=6{=onMwY&7G@rU*9A|y$@h~_2+S#%Q@<^rzqsx#6R(ll{HHW9r+z{x zkYzBZ{9sP~DF*#WH<(i}rwH&6z&3+^j93Ui20P~f@E2<7AARf(G_d>qj{EH#67BtQ zfWrNwiuXqq|BtHuKdJG}o=`~O+n!Km@Safc-c>LH zFaj_FFaj_FFaj_FFaj_FFaj_FFaj_FFaj_FFaj_FFaj_FFaj_F|F#JHU+)P8KfVD! zzVX|`3%@?@^k*XQKQRBB{(%Ws6mUfWR}{Y?0M~wS?f2v3UB7DJ=e*$Oyx`}&eqKfV z@&<0m&PSra?P&doR!w%QzOG5RQ}zGty?nUy19yIYYx@7p;OJKyxS#OzN&tR47=AnW z&%Iy&E0unYz?_0P^=nW2#|Yf_hWp-sW8a(XY%MXtd-j*X0$jwz+e_I#rej1BLTlP8 z(jC4jvdR%8OO+KYe+wU*EE8qCeDHEBW~j4sYpS^=Ed;aQG7jq}wy?fA*Ni!2j4f?C zi{G^Q_EL%Hnbd{h4L2{`Xghx8x*Mk0i9BF!D_+=7+@RdEm(w8cEehArlv7|##?^(f*=Dwe2!>TJ-^-Vl znAvdh66uwGl=fxiL?6SvcQ2jucsYp@FhQTR#EjM!`qZpp9mDN``eggQb+bwGpe?*m zb$tzGpgaBr*%`K4MDO0!UUGJyN9Xy;TxR*R+QobJCHOp);m8wV*b^2yM)bJYOnbT) z;D~&Bqw~J*(r|@%=hX2S;v;T;n?bw+nsi8iIoX#c0%EkNH*dhDs0C<9#K6S}6OSEZ z=EzQ}s6e0)2ojds%*>6t&V~7w4IjxvzV$Nkt88bfvb@fFpA{&Uaa*)ovWi^aJ(-vK zAtjz|J~Yp}Idw~pc#G56;1M-T;)lVqT2{=OW69jUL;4Cj_!p_)MKSSSrnrdi_oCeF zOSGiJnd1`@&9#!1)qCA%A1y+$j8bT*puGsF&#N&wI!2#g}p@G0x+Qov3he zOOZ-n*(6v^nH1MpLQUUpYo4kj@b1ZT5@O5RM|#sl`Qjy}`?|s7!Pn^~sZdK#^0Y0u zgA>k~e#pH?cXx^E1~N?d<<=c19~wqFXVc+&8H%kdMdh{0`FeCq zTOK~?d2~k}y+OvUd&c)}uN0~tuS7!W5Y_hX$bp31(!xl0uJHP@t%f{Stw^pIm%|CX zsZF#s9lUOc!x<^ocm!9&<%x3VFQ+)wJ!F?o6du|#Y{SIe6|pE=UF}JqWj#~$dA-Ee zYLX>F_|?!ni?eLNke5UT{%v{f^-JM3V!gbi_pbNdSGnObQ{&of;Uj+{e$Uxa#k|{v zo*sMigA3)z&mK2V(Mrg!jXc00d^1pYG+62V7coU0RlBCUb5T6@(=4j_lA+-q}O`_nCCt#O9U{#Z#e4x4} znJ3>aNMiKJ#nV+vG@^Jk9C%cTBvgrvV&+X@Wf7TXxEIzj-1$N%|0hp5iREbdIXP9a zML~@?*Xg679i`oJI*iIXHLf9g1&ZTiW;#Q+vHI~vx6*4qSJ_80iH3-c&t)~W#ylL1 zQ`c-Au+%GT6MgykWbjjIG0{)ORGhbv9M`)e4qVE_yThd&UfhGHMt#h5m9pH2=-cp= zi@-DrT(RwKzaQ}E_1?FaL#g|ZsszvN`B#m?o1nm(pun4;z$}1S0J8vQ0n7rJ1uzR> z7QifkSpc&DW&z9sm<2EkU>3kEfLQ>u0A>Nq0+Z%+dO#HLYSH*4If`WN3Zh4-T7CSib?NfY~R22w_X3Pq|@T#CfRDDX)~pWz0x znkI_~U5l_l4xnJow-RTsMj=h1#(^LRQ{TT-n52T{KADD6(%uYS$G`zk1y< z+9qWjso&L)4fGr@PJi85X%M=eRmORgQQ2W?ETfkQ61R6*)m$J905_jE zIm|#$i1)_tWtadbDLGz+Lf9!TE@EmDIXT}!U!v8c5%RlqNdZ5^;L?P|@?zqfwT*cr z`dr&otnmtY_g3~sm#4CKPtyfVU(&OJ^;`{wBahl}aVqofj?uALZ6deKqH1UR77Q=0 zygas2_a=FdQfftA$718>3+kukRAk0ulY2|)<>)C$uJtD9lUfVb?%o=GF%h-8ON8}x zmDINH;Nhjrx8l3wlmLz#f!!e1=t1#-QR!UHBZP44qceIA5IE zll8LGeaTR~<|Vp=?fsJ;)eHf@SF~=e6Fof{cM6PW(`=+32rIokhY!4yc2?atm?!$V zp9k-Xw4}p9UCx7{&uTtSzc@d_Bk{~Lo+zG}T>a_nS*6LYdReyH`i4vB=g z2G>2ds0CcceR1UOiMYP;&pj&Tv1PfXgeM+w=i9z3xT{8!)~je`WwZZec;nIACv&qN z@Ae8Et(|&-*Y@OMn5%4VjPr%u>P#N(L}nGKO)syjQ5q@9#QTQ=n3b%0#9gBfpk*k9`I(@Ehj~%;2g7Uw{o`_pUo2?y0hu)jgs-C)6?Cl@tvdHl``|Suw6ld5z32 z4cARl*DhVNc5}%Rcoj!^GHWsJ%kjO)xvM7wG{0C+l6x1Id(^u5Ch5>tjOZDGVN1Y1F* zUy++6sX~Aorw5-QAqc$6o`m9)C!zNbz!hw;^^W#l3u^*66al+DnYO7fm|RzLDyli6 zJugnjiZAwj6Ll@;k1zIz|t*V)&(8NY^}_Z{5iJsF5QnB;SS zHpxW;eD$S?gM&kID+UMdGZ`PRTX%+uhNiQydBvk6dLhYrvLz$$dj8^};{nlr3c4=s zL>u1ui_|`S0pyfLihgQ6bOOCm;i9$Hp8CpXkvHrhR^IDB#}>kY(+?Y?y-^suf|@74Mw}+MEu%}J8086gIx!2+}0Cu zJUJ}X6CrdpYJ;m=f=dK^^c&iK9z?PHsem~Ll1dJI^m~#{d`o54H*v6uRNy57fjZT- zYM5ykyt(MCFB0!I{wb?av}gu7xS}63b)j_=iwni9t=cqowyiCA$S|eci)~*XcvjHX zRH`GwrHhWj^5;mkt<-OmL-nRJ$jF!^g`tC*{$t*ysmg9Ym75Lf<<@x5nSB6z?zD zx|^E)LRe2-YQAogkDNv7X;>pW=e?=Kw`La7Up(&V3pN_&t{2G(pcpc2Jm^mwn7?#9 zs33;G$KUg@iQ2~Pqd!s5qj4?1=!RtLQsYM%ZEZC7?vV4GSxLQPc)WJMb4Ej#-zf8R zmjsumY>kQe=An7%_+Y=OB8-Eagu-jUs-4vWFrj@=Hl zC$bo8DJEnNnI(irX^fM14&l{!v$OW+vobbZic$!eV5*KkFnvnH{n`sw+XuWWsuV+9!ysv$^tKTdEw_k=SnkhAU!js6!GBViiw&%xjp-LrXuS6sRkay=;+-_|b|5gQSuHGQV#U<^MRZ*iSJ-20*N$9+qF9%RETiH9|B z4#}{6X*A?&U7YX<-AER3rn6cd(W0SG%0YX7T&^O^*gI`yx<;|xgj_qn4InMp+RBH8 zjnnZX{jahoJmh2B4DH1!)Rcp}oKw-s%2j-b9WqSqOgcnOycjo?U51qoYAs^Q#I4k< z6-S+uFl=8twBm~yVB?)Jl2Ns->c`BL-kEcVwlT32oHMaMNhTG&Pv-W;dmKHY>^|j= z?3zGuVULSy(8G%l`l?PgHcXLq@&*ZM&%S$i^wiU*wIj?b?~607+S8KK@;q+5Sq8Xb z?>I^-jgNQeKk;gIF0QyW|Dy10}y zkS8@nT8$Hlgkde!Z6>b=Sw-%&P^@T#Kg1Y)&^RfjQ?14PygD^q$|UA`WS(Kxs|^O$ zZtLD#bB`{H%4#+*+KXs46Y=L2kOkL=CKS?`xO6F3F{C^A&8Mn86MwMsNg!$PD~J<> zAc*Z&kQaho7OGR`VDn2L2X+l{8*D8&UKIikb9R7=$`^x^uJ^UT>b{+R!=h60spe2y zUrYUv#j5>M9(p8xrZZ&HabwG?yTrS_Z?oaE?;w_UOmajs5In}?ynSV3&qfM1p&3ss zu5-1i;vN$bjB%XExU}AJTA1?q%(_Ql0$Q55GEGPz)v!-jFHeCbGF?BBSTvryFyPq? zq3a6Di7Hy)hQ7}iIv$3T8e%2WL^0FZDL~FBnM0=}OJrtWyMJh?_PV^%rSnusjwiL_y?Y(!HukZU zIfd&Ba1HLlIX$uSShQWgu&?Cc3tpy*XS6P7yTxTjz2n*p9waZO>jn^EgS8o%$-y@S ze(^$Nfc(psRw8s{p!1osS6k805cvDEC!+WckQ~GnU^V7l98X(N;RPdrAhnqVPvME1 z{l}Lzu8FW7bT540RycgcP~1o6q|^E#9|l!cw>m7-O4F;&1aY<%)&WZfo6XjTHd9aC zR;?oI-@1*NJxcXS-c%YU`*4)ltTu;oI#gKli$-jUe`s{3cn95E>+5nwV&oZwoTU~* zrZJs1=n1bHTW4NEix16?j^^z&XEb%Xr!SUru-4rm4{@^;GHdgB*EzVs%XL26(?lWj z4aYO=b1}07LIN7LVS_OCgf-Nq{F!&O=K{O5_7wQ9uAz|&=xbXdBcf3JKx3jgllA$@uA>JYb z%w(aiA1OUbUXH5KoJ)?}Kaf4acL5!Mr3kr-lE({10ew1C(+%x>$r+LdSXAn|QgOUZ zIT;m&Uh(3*OHO@l-D;^p(W?_fR|Y!U?2OBCy4Ax4yMqQ@d%C@FYF{#*OxzqQ8{{Z- z#S-ZG#OqS_^?7El2*w;|MV`g@ci5zMaf#8;D{4sR+xCZCk#X-!^=vNe#ahs)mgD)# zdb~0X2^2o!EYTfo6D;AqKq+(GsYBwzCRL-zG4b~?W=b(Exo^+CS~>dO%6U^aD3?Fb zn|dH~X=t@CL*r=m+2-AXpRaWAetgSFe(jO4LFhY`vHXC5;mt3CjqC1bc*zwRPxN3= zwJ(lLpFyx}IppPDdDU9l8@G?H=pL86kj5~vL}wtvii11HL9G8PO9!EGTce3411TY1 zrJTsIW1J)+{y`>*=xLv-Rj|i*Js2S1kUc;DvUnoGvhT9)8rSq1QR30fE%7>;xYsGQ zQ+wrl#hk5q>>8G6F)wh z(b1t2tItI^^^}HJJ6weR*^RDqMh5R@$?hsSbTEvrN!ROyU~MV3x|Zoy=iiW=*_$Lw z>b4@mU1_UIbm9^sf9OcNh1P|Xchll%%8z0qM5bvruB|ma%b{#;mx9jB`Vs-7M%)Kq zBkI=pUj=mVSJSnod+PJKRUI+4NjPfN5Q-fvp*CotbxdH+rY4EEz@i{J1^Yw9kX1{lS$P+{S12r+f`sBwV%~D*2nuwZd<0iv8&Xx%;mDN z;j-iXl4cEKi^Tiiy4K5bD=zf3aTcW>LKJH5wX2a}J)p_yVA~+ExULte=vSZ7l3r@= zph%SaI{$H@*vc|;D07R8SyOqRQ48%uoeQ-p1jS2>=T^o1?8zq|GIq)}VBY||HNW2Q% z$F0;g$s@?Hm!}Z`KCjx<4I?5xniJt9Dsii+zE@^uN}f%u&FopJT(@!6I&8G%^=x6I zczwmTJ98AHye__}E?8e`EEpAi#y3p?pW=(m8ST7-u4Yw_s77<0rPU_cj$R+AE6WQh9G`it`uuFttQ>Jjut+RTNAlzQ?Nj%U(QQqbupE?UT3|bCQdylI zho+DF&cDlOJBUMy?>(cLTZ3&qh&kewe?OetJz7-Bo&u+ z8jMN1wYzOT^&3XP{`q(J88UhF5)n6UN2llWDDeq8TtUda8*L0G|MIz8V=bqp$3ZBX z)Be?S18G6B#2_uMuA3Kfq|T&J9*{#sXD2Y-LxhPO*!!HpN5Svga2VlskaZFI5f+S;MvCil%SEDOR5qDSsyz6XXy#N5<5sLr-^nxC^ z4KVbAUewmV>RWj`-WP z7QifkSpc&DW&z9sm<2EkU>3kEfLQ>u0A>Nq0+mK4dIf*2*3!y2*3!y2*3!y2*3!y z2*3!y2*3!y2*3!y2*3!y2*3!y2*3!y2>hEMVD#-ZVrXSQ{9pbh0Pbo;`X!z*Dk;mk?nW<^-P-FX+y6Xd1Upy`DDn+ALmd6X8bT((F zS`y}^m8F$gd^~KOrH@RH_o-XxaGqfUS~w(e6WB)$#ohxOOd}IGV@$nus2@<$Ff`b` zGNye#j+3I`Z#oXH|gcg*Xd6RrEaO8Z&qo>^#wefU?_|m zqTF;D7B$nKUq3j}DHk7H#cNRTgmgNP;gn`y`te=CBiV^}4~w;8uFdWn*+q^jh?cq` zA)D=1cifIf?;w@XG3ZTgUiAT`&J0HR0_8f#_pNTh$GmV7?m`BUX}FDe7J~vV>3rOV zI`@;e-b=UyE_E7>h_JiPN7&TLZwW8mJ71;Qtr($qgW)E3(oJQF<5pD{sm2xG&!E4V-md~E9*}A-~s;YYVk48T?rAIZWzqV=rxS&<1%gBHH zNy_clHqV}?2;6^upgmkw4cwOYyv6}Kql==IETZ9ix*Vg)j2=nrX%IynxyAXnL9j-XOJG)|B1`QgtEW(#e8GgDlWUhRwQMWQV?4fzm_`2?(3fJ zJt8~eV~HG(YDk;itnAw3m9bQH_#-AUYmz0BD6dx%8GenC>h?A2trMR=-00lTRWQOGnKW zAC(wYy;lIY!^NLvyIRg`gU|lsrtE*9u@p`z2l*uu$ObNjHnzC#{lD10{EvUdmvr-= z{q*vZ{Kdp%hkt|9=ja2S99pwDl|KYRhz-+h<;&GKh4d;p-Na=Bz`3nm)4*ly>E z_$|+`XM^(n{`fARpXE#B2LJ>|pdV7aurs$d1taWs=0Cr#b8jI#K+wwk;-&2v_{YuK z+~Qjt3bnxR4#!OG%`aL&HWb=+*7g^`2%VeVF9nB;z8+lWzofC4U$TH~paUv0nd_yC z?7ze*c00SAzX--7on4%_!Tv=L1ev;-iGp$H`2I2hB0unwj)5tVKnH?EPD_DZ!2!(B z@)ynbe;IH%P$deURRJMi&WGy*m@L8Y!OK0sjWrMzd?*)u;3#=QuyQW~Ah7xn$`1a3 z!P&*d`Rlnr13W#@XcP=xz~Y*H)gJ^ysEEX0Lp(49*C5{3f%o=TJpmXe`Km|m&=Z02 zZ}zAidgy%L?4j`6`N?+Jlkd<|?69ZYp{L$qPqRZ$yThJthkn-%``tVA3_I)@cj%dS z*t6`=v+l6pvqR4g#=l)J#|}Lw82@&?dw1x$ci8jn(DUxF=i8y*x5Iw_4!yt*d%+!g z;T`tis!+e;47uO8@*LQq7u#WfXovpr4twz(dWjwOk~{QLJM53{(97(wM}u)fP(c48 z_5yv*6O4a7AYWvJt^>NK|BOKQ5Aub-AdoA3Z_fq!-=93kU$NbJ&Y$JGGyU&~|Ez4k zm+#MP|BfkqH3uhz5W(JP#mkq5-6P1%Q0}89=TL0E9%u z0HJ^|KqzqzAhcTo2#YfS!kQL>PL1fb-e1E>on0Ls-LK&3I{a^K@SQv_F)4>8Wa!{zyp*>P;x_ z*e=O8#ZSJ=?o0!yxqp8=T;vB(yaawW9(HzcwcmM~v*360-^RmKjbF#ZRL;MQhrikW ziLo%%{jXzT2;iM#VNE+nG1IRn+P=>1I357LdjbGpQK3V`!r6TLrr`Ve`9XJs01WA5 z>7mgBVsTrLpazdRj1U0<_}#!3{{{F9Pz^Ac{lkD4(r+JpI|jVa@1b&lH+4HigW=bK z62;qp9Heajz5-0I1_dMv@ClUGe}6%ggO`2=6mYd~g+Vz63WS~6e;0NLa6$qBR5g-8PhYS~u)^YO!T0k8E4C}3-`?K_YkLHq>qfdl|2jeg@$M`4?1oDS`skb1I-51O>ts!U@6;;xIVLwq3VD zI6`TjpzQuH!w#(DfFkg^4MBk>^Y}q7(t>da69`AB&Vzgm`VQ7*z&R{*%hG6sk{k{25{l0zu`QUY*0tIRZApV^M1@bK@4(T8tgfN6~g7hGc0OWU2 z{RXuSP<>Yp>Y)4ZAJEtMv)6zJ;qeVC$hV+A35e5n`w8L$`PnvyA*`Ub1gZ<6eh6d> z`Wr$V6id(-Fa8%|=K@|k#7(FkgRp`43gN*EVgd4Z+xH;9gE$KL8RT~mhao?N1gz`u zzWE;~_?!P=zr%C*dhJl#3Dr|j2w`&w6bJ*boq%)z4;Y8~#t?oGmXLo!A=F;@f};7K zjnmJ308s#5H#k|a?Q2kd24N-(3KWO@4~jz}gy%Q^f_Mylhx`)4*9jDJP|r7U z0A8@p6a&Y5-p&Bn0Q{Gp0DeV1IN7rZ;4d-( z1l&>pf%bcV;OZ7Y5XuD*#25kuL$=^#&oF@8cM(9I8Uc_->;TeM89?S}0?4r>0J$Cl z5VGZflRX^(q2UHV_#B+*DbWQ8KimTd+wuV-_V)nMxfX!Pf)yaTsQ?f~S_4GYHvtr# z1~}QX44@7P11LRt0A*H5(UKK9}krE PMQ5-=1yDNRG|vA6bRbIo literal 0 HcmV?d00001 From a0e30ecae999e22cff6351434f675a1368189037 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Tue, 14 Jan 2025 16:20:50 -0600 Subject: [PATCH 06/11] Clang-format --- src/ndi-output.cpp | 9 ++++++--- src/ndi-source.cpp | 25 +++++++++++++------------ src/obs-support/sync-debug.cpp | 17 ++++++++--------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/ndi-output.cpp b/src/ndi-output.cpp index f05021d6..b85e7701 100644 --- a/src/ndi-output.cpp +++ b/src/ndi-output.cpp @@ -358,7 +358,8 @@ void ndi_output_rawvideo(void *data, video_data *frame) obs_sync_debug_log("NDI <- ndi_output_rawvideo", o->ndi_name, video_frame.timecode, video_frame.timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_output", o->ndi_name, - video_frame.timestamp, (uint8_t *)video_frame.p_data); + video_frame.timestamp, + (uint8_t *)video_frame.p_data); ndiLib->send_send_video_async_v2(o->ndi_sender, &video_frame); } @@ -410,8 +411,10 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.p_data = o->audio_conv_buffer; OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_output", o->ndi_name, - audio_frame.timestamp, (float *)audio_frame.p_data, - audio_frame.no_samples, audio_frame.sample_rate); + audio_frame.timestamp, + (float *)audio_frame.p_data, + audio_frame.no_samples, + audio_frame.sample_rate); obs_sync_debug_log("NDI <- ndi_output_rawaudio", o->ndi_name, audio_frame.timecode, audio_frame.timestamp); ndiLib->send_send_audio_v3(o->ndi_sender, &audio_frame); diff --git a/src/ndi-source.cpp b/src/ndi-source.cpp index 1dc50ffa..02fd135e 100644 --- a/src/ndi-source.cpp +++ b/src/ndi-source.cpp @@ -717,7 +717,7 @@ void *ndi_source_thread(void *data) if (video_frame2.p_data && (video_frame2.timestamp > timestamp_video)) { //blog(LOG_INFO, "v");//ideo_frame"); - timestamp_video = video_frame2.timestamp; + timestamp_video = video_frame2.timestamp; ndi_source_thread_process_video2( &s->config, &video_frame2, s->obs_source, &obs_video_frame); @@ -814,10 +814,10 @@ void ndi_source_thread_process_audio2(ndi_source_config_t *config, obs_source_get_name(obs_source), ndi_audio_frame2->timecode, ndi_audio_frame2->timestamp); - OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", - obs_source_get_name(obs_source), - ndi_audio_frame2->timestamp, ndi_audio_frame2->p_data, - ndi_audio_frame2->no_samples, ndi_audio_frame2->sample_rate ); + OBS_SYNC_DEBUG_LOG_AUDIO_TIME( + "NDI -> ndi_source_thread", obs_source_get_name(obs_source), + ndi_audio_frame2->timestamp, ndi_audio_frame2->p_data, + ndi_audio_frame2->no_samples, ndi_audio_frame2->sample_rate); const int channelCount = ndi_audio_frame2->no_channels > 8 ? 8 : ndi_audio_frame2->no_channels; @@ -869,10 +869,10 @@ void ndi_source_thread_process_audio3(ndi_source_config_t *config, ndi_audio_frame3->timecode, ndi_audio_frame3->timestamp); - OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI -> ndi_source_thread", - obs_source_get_name(obs_source), - ndi_audio_frame3->timestamp, (float *)ndi_audio_frame3->p_data, - ndi_audio_frame3->no_samples, ndi_audio_frame3->sample_rate); + OBS_SYNC_DEBUG_LOG_AUDIO_TIME( + "NDI -> ndi_source_thread", obs_source_get_name(obs_source), + ndi_audio_frame3->timestamp, (float *)ndi_audio_frame3->p_data, + ndi_audio_frame3->no_samples, ndi_audio_frame3->sample_rate); const int channelCount = ndi_audio_frame3->no_channels > 8 ? 8 @@ -922,7 +922,8 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, ndi_video_frame->timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI -> ndi_source_thread", obs_source_get_name(obs_source), - ndi_video_frame->timestamp, (uint8_t *)ndi_video_frame->p_data); + ndi_video_frame->timestamp, + (uint8_t *)ndi_video_frame->p_data); switch (ndi_video_frame->FourCC) { case NDIlib_FourCC_type_BGRA: obs_video_frame->format = VIDEO_FORMAT_BGRA; @@ -982,8 +983,8 @@ void ndi_source_thread_process_video2(ndi_source_config_t *config, obs_sync_debug_log("OBS <- ndi_source_thread_process_video2", obs_source_get_name(obs_source), (int64_t)0, obs_video_frame->timestamp); - OBS_SYNC_DEBUG_LOG_VIDEO_TIME( - "OBS <- ndi_source_thread", obs_source_get_name(obs_source), + OBS_SYNC_DEBUG_LOG_VIDEO_TIME("OBS <- ndi_source_thread", + obs_source_get_name(obs_source), (int64_t)obs_video_frame->timestamp, obs_video_frame->data[0]); obs_source_output_video(obs_source, obs_video_frame); diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index 172c19d4..241985f3 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -1,7 +1,7 @@ #include "obs-support/sync-debug.h" #include - // Shared map to store the last log time for each message +// Shared map to store the last log time for each message static std::map lastLogTime; // Function to clear the lastLogTime map @@ -104,8 +104,7 @@ void obs_sync_debug_log_video_time(const char *message, } // If white frame is going from off to on, log the frame time, audio time and diff - auto white_time = obs_sync_white_time(timestamp, - data); + auto white_time = obs_sync_white_time(timestamp, data); if (!wo->second && (white_time > 0)) { white_on[key] = true; white_on_time[key] = white_time; @@ -137,7 +136,8 @@ void obs_sync_debug_log_video_time(const char *message, ? "MAX" : std::to_string(diff / 1000000); } - obs_log(LOG_VERBOSE, "~___~___ Sync Test Data Found: AT %14s WT %14s: %5s %s", + obs_log(LOG_VERBOSE, + "~___~___ Sync Test Data Found: AT %14s WT %14s: %5s %s", atimeStr.c_str(), wtimeStr.c_str(), dtimeStr.c_str(), key.c_str()); @@ -147,7 +147,8 @@ void obs_sync_debug_log_video_time(const char *message, } void obs_sync_debug_log_audio_time(const char *message, const char *source_ndi_name, - uint64_t timestamp, float *data, int no_samples, int sample_rate) + uint64_t timestamp, float *data, + int no_samples, int sample_rate) { if ((LOG_LEVEL != LOG_VERBOSE) || (audio_on.size() >= 100)) return; @@ -161,10 +162,8 @@ void obs_sync_debug_log_audio_time(const char *message, } // If audio on, log the frame time - auto audio_time = obs_sync_audio_time(timestamp, - data, - no_samples, - sample_rate); + auto audio_time = + obs_sync_audio_time(timestamp, data, no_samples, sample_rate); if (!ao->second && (audio_time > 0)) { ao->second = true; // set audio on audio_on_time[key] = audio_time; From 29f4929ec58aa4814f79d0e4fb4eef78bb1ef90f Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Wed, 15 Jan 2025 09:20:36 -0600 Subject: [PATCH 07/11] Don't modify NDI output timestamps, just use timestamps from OBS sync data. --- src/ndi-output.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ndi-output.cpp b/src/ndi-output.cpp index b85e7701..240c1cc2 100644 --- a/src/ndi-output.cpp +++ b/src/ndi-output.cpp @@ -342,7 +342,6 @@ void ndi_output_rawvideo(void *data, video_data *frame) video_frame.frame_rate_D = 100; video_frame.frame_format_type = NDIlib_frame_format_type_progressive; video_frame.timecode = frame->timestamp / 100; - video_frame.timestamp = frame->timestamp; video_frame.FourCC = o->frame_fourcc; if (video_frame.FourCC == NDIlib_FourCC_type_UYVY) { @@ -358,7 +357,7 @@ void ndi_output_rawvideo(void *data, video_data *frame) obs_sync_debug_log("NDI <- ndi_output_rawvideo", o->ndi_name, video_frame.timecode, video_frame.timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_output", o->ndi_name, - video_frame.timestamp, + frame->timestamp, (uint8_t *)video_frame.p_data); ndiLib->send_send_video_async_v2(o->ndi_sender, &video_frame); } @@ -378,7 +377,6 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.sample_rate = o->audio_samplerate; audio_frame.no_channels = (int)o->audio_channels; audio_frame.timecode = NDIlib_send_timecode_synthesize; - audio_frame.timestamp = frame->timestamp; audio_frame.no_samples = frame->frames; audio_frame.channel_stride_in_bytes = frame->frames * 4; audio_frame.FourCC = NDIlib_FourCC_audio_type_FLTP; @@ -411,7 +409,7 @@ void ndi_output_rawaudio(void *data, audio_data *frame) audio_frame.p_data = o->audio_conv_buffer; OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_output", o->ndi_name, - audio_frame.timestamp, + frame->timestamp, (float *)audio_frame.p_data, audio_frame.no_samples, audio_frame.sample_rate); From efa1f94fa58fe88d3d11515526dea8e3cb026fca Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Wed, 15 Jan 2025 10:06:10 -0600 Subject: [PATCH 08/11] Fix clang-format and build errors on mac and linux --- src/ndi-filter.cpp | 7 +++++-- src/obs-support/sync-debug.cpp | 10 ++++------ src/obs-support/sync-debug.h | 22 ++++++++++++++-------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/ndi-filter.cpp b/src/ndi-filter.cpp index 367558e9..5f608e00 100644 --- a/src/ndi-filter.cpp +++ b/src/ndi-filter.cpp @@ -150,7 +150,8 @@ void ndi_filter_raw_video(void *data, video_data *frame) video_frame.timecode, video_frame.timestamp); OBS_SYNC_DEBUG_LOG_VIDEO_TIME("NDI <- ndi_filter", obs_source_get_name(f->obs_source), - video_frame.timestamp, (uint8_t *)video_frame.p_data); + video_frame.timestamp, + (uint8_t *)video_frame.p_data); ndiLib->send_send_video_v2(f->ndi_sender, &video_frame); pthread_mutex_unlock(&f->ndi_sender_video_mutex); } @@ -438,7 +439,9 @@ obs_audio_data *ndi_filter_asyncaudio(void *data, obs_audio_data *audio_data) audio_frame.timecode, audio_frame.timestamp); OBS_SYNC_DEBUG_LOG_AUDIO_TIME("NDI <- ndi_filter", obs_source_get_name(f->obs_source), - audio_frame.timestamp, audio_frame.p_data, audio_frame.no_samples, audio_frame.sample_rate); + audio_frame.timestamp, audio_frame.p_data, + audio_frame.no_samples, + audio_frame.sample_rate); ndiLib->send_send_audio_v2(f->ndi_sender, &audio_frame); pthread_mutex_unlock(&f->ndi_sender_audio_mutex); diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index 241985f3..b03f1216 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -62,8 +62,6 @@ int64_t obs_sync_white_time(int64_t time, uint8_t *p_data) { uint8_t pixel0 = p_data[0]; uint8_t pixel1 = p_data[1]; - uint8_t pixel2 = p_data[2]; - uint8_t pixel3 = p_data[3]; bool white = (((pixel0 == 128) && (pixel1 == 235)) || ((pixel0 == 255) && (pixel1 == 255))); return white ? time : 0; @@ -112,7 +110,7 @@ void obs_sync_debug_log_video_time(const char *message, auto diff = white_on_time[key] - audio_on_time[key]; std::string wtimeStr = "N/A"; - if (white_on_time[key] > (uint64_t)0) { + if (white_on_time[key] > (int64_t)0) { wtimeStr = (white_on_time[key] == LLONG_MAX) ? "MAX" : std::to_string(white_on_time[key] / @@ -120,7 +118,7 @@ void obs_sync_debug_log_video_time(const char *message, } std::string atimeStr = "N/A"; - if (audio_on_time[key] > (uint64_t)0) { + if (audio_on_time[key] > (int64_t)0) { atimeStr = (audio_on_time[key] == LLONG_MAX) ? "MAX" : std::to_string(audio_on_time[key] / @@ -128,8 +126,8 @@ void obs_sync_debug_log_video_time(const char *message, } std::string dtimeStr = "N/A"; - if ((audio_on_time[key] > (uint64_t)0) && - (white_on_time[key] > (uint64_t)0)) { + if ((audio_on_time[key] > (int64_t)0) && + (white_on_time[key] > (int64_t)0)) { dtimeStr = ((audio_on_time[key] == LLONG_MAX) || (white_on_time[key] == LLONG_MAX)) diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h index 48c6d59c..87ba9fd1 100644 --- a/src/obs-support/sync-debug.h +++ b/src/obs-support/sync-debug.h @@ -14,25 +14,31 @@ void obs_sync_debug_log_video_time(const char *message, uint64_t timestamp, uint8_t *data); void obs_sync_debug_log_audio_time(const char *message, const char *source_ndi_name, - uint64_t timestamp, float *data, int no_samples, int sample_rate); + uint64_t timestamp, float *data, + int no_samples, int sample_rate); void obs_clear_last_log_time(); // Uncomment to enable measuring audio and video time differences // using black/white frames and audio on white frames #define SYNC_DEBUG 1 #ifdef SYNC_DEBUG -#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, data) \ +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, \ + data) \ obs_sync_debug_log_video_time(message, source_ndi_name, timestamp, data) #else -#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, data) \ - do { \ +#define OBS_SYNC_DEBUG_LOG_VIDEO_TIME(message, source_ndi_name, timestamp, \ + data) \ + do { \ } while (0) #endif #ifdef SYNC_DEBUG -#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, data, no_samples, sample_rate) \ - obs_sync_debug_log_audio_time(message, source_ndi_name, timestamp, data, no_samples, sample_rate) +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, \ + data, no_samples, sample_rate) \ + obs_sync_debug_log_audio_time(message, source_ndi_name, timestamp, \ + data, no_samples, sample_rate) #else -#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, data, no_samples, sample_rate) \ - do { \ +#define OBS_SYNC_DEBUG_LOG_AUDIO_TIME(message, source_ndi_name, timestamp, \ + data, no_samples, sample_rate) \ + do { \ } while (0) #endif \ No newline at end of file From a69690484060ac21b27799727ecab237da5927e5 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Wed, 15 Jan 2025 10:18:38 -0600 Subject: [PATCH 09/11] Add blank line at end of sync-debug.cpp --- src/obs-support/sync-debug.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index b03f1216..36ff9a0d 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -169,3 +169,4 @@ void obs_sync_debug_log_audio_time(const char *message, ao->second = false; } } + From 4103e5c437d9b76aff213399176b854a1c4d2d48 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Wed, 15 Jan 2025 10:22:44 -0600 Subject: [PATCH 10/11] More clang changes --- src/obs-support/sync-debug.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/obs-support/sync-debug.cpp b/src/obs-support/sync-debug.cpp index 36ff9a0d..b03f1216 100644 --- a/src/obs-support/sync-debug.cpp +++ b/src/obs-support/sync-debug.cpp @@ -169,4 +169,3 @@ void obs_sync_debug_log_audio_time(const char *message, ao->second = false; } } - From 94fee61a0221b8ea44daf3d1fc4ac6288f00cf23 Mon Sep 17 00:00:00 2001 From: BitRate27 Date: Wed, 15 Jan 2025 10:40:26 -0600 Subject: [PATCH 11/11] Blank line needed on sync-debug.h --- src/obs-support/sync-debug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/obs-support/sync-debug.h b/src/obs-support/sync-debug.h index 87ba9fd1..329fae77 100644 --- a/src/obs-support/sync-debug.h +++ b/src/obs-support/sync-debug.h @@ -41,4 +41,4 @@ void obs_clear_last_log_time(); data, no_samples, sample_rate) \ do { \ } while (0) -#endif \ No newline at end of file +#endif