From 2f1bfa9340dfceec06237d6454328f4555f67d0a Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 26 Jul 2023 16:03:45 +0200 Subject: [PATCH] do not use source TS as RTP TS by default Do not use source TS as (a base for) RTP TS by default anymore. Since this was essential for synchronized DeckLink playback, require `--incompatible` to enable this. The reason to disable for now is because it breaks compressed audio. Eg. for Opus, one receives 2 packets for 40 ms input. Currently only the first gets source TS, second is undefined, thus getting the default, loosely related TS, that may however create TS discontinuity (especially with the time, when PC and DeckLink time diverges). There is no good solution for the above yet, sending both packet with the same TS and m-bit on second isn't sufficient now, because it gets joined in receiver buffer and eg. Opus is not self delimiting so it will need changes on receiver side to pass RTP packets to Opus decoder as Opus packets. refer to GH-326 --- src/host.cpp | 8 +++++++- src/host.h | 1 + src/transmit.cpp | 12 ++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/host.cpp b/src/host.cpp index 5a2316100..0bf3a1f0d 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -107,7 +107,7 @@ using namespace std; unsigned int audio_capture_channels = 0; unsigned int audio_capture_bps = 0; unsigned int audio_capture_sample_rate = 0; - +bool incompatible_features = false; unsigned int cuda_devices[MAX_CUDA_DEVICES] = { 0 }; unsigned int cuda_devices_count = 1; @@ -426,6 +426,10 @@ struct init_data *common_preinit(int argc, char *argv[]) load_libgcc(); + if (get_commandline_param("incompatible") != nullptr) { + incompatible_features = true; + } + return new init_data{init}; } @@ -1065,6 +1069,8 @@ ADD_TO_PARAM("debug-dump", "* debug-dump=[=][,[=]\n" " Dumps specified buffer for debugging, n-th buffer may be selected, name is .dump.\n" " Avaiable modules: lavd-uncompressed\n"); #endif +ADD_TO_PARAM("incompatible", "* incompatible\n" + " Features that may possibly not be compatible with at least older or even any other UG version.\n"); ADD_TO_PARAM("low-latency-audio", "* low-latency-audio[=ultra]\n" " Try to reduce audio latency at the expense of worse reliability\n" " Add ultra for even more aggressive setting.\n"); diff --git a/src/host.h b/src/host.h index 3d777a0d5..f6c86820e 100644 --- a/src/host.h +++ b/src/host.h @@ -109,6 +109,7 @@ extern void *mainloop_udata; extern int glfw_init_count; extern char pixfmt_conv_pref[]; // defined in video_codec.c extern char *sage_network_device; +extern bool incompatible_features; // Both of following varables are non-negative. It indicates amount of milliseconds that // audio or video should be delayed. This shall be used for AV sync control. For diff --git a/src/transmit.cpp b/src/transmit.cpp index 3f29fdbe9..938f756b9 100644 --- a/src/transmit.cpp +++ b/src/transmit.cpp @@ -389,9 +389,9 @@ tx_send(struct tx *tx, struct video_frame *frame, struct rtp *rtp_session) fec_check_messages(tx); uint32_t ts = - (frame->flags & TIMESTAMP_VALID) == 0 - ? get_local_mediatime() - : get_local_mediatime_offset() + frame->timestamp; + incompatible_features && (frame->flags & TIMESTAMP_VALID) != 0 + ? get_local_mediatime_offset() + frame->timestamp + : get_local_mediatime(); if(frame->fragment && tx->last_frame_fragment_id == frame->frame_fragment_id) { ts = tx->last_ts; @@ -774,9 +774,9 @@ void audio_tx_send(struct tx* tx, struct rtp *rtp_session, const audio_frame2 * fec_check_messages(tx); const uint32_t timestamp = - buffer->get_timestamp() == -1 - ? get_local_mediatime() - : get_local_mediatime_offset() + buffer->get_timestamp(); + incompatible_features && buffer->get_timestamp() != -1 + ? get_local_mediatime_offset() + buffer->get_timestamp() + : get_local_mediatime(); for (int channel = 0; channel < buffer->get_channel_count(); ++channel) {