From cdef66a14175e9a57e9e5e7cbfd580bd2ae607fa Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Mon, 16 Oct 2023 10:06:28 +0200 Subject: [PATCH] Revert "audio TX: use the packet API" This reverts commit 8da83d3e9285b5362f3e62908e53a95d18e43c23. --- src/audio/audio.cpp | 50 +++++++----------------------------- src/audio/audio.h | 5 ---- src/audio/playback/mixer.cpp | 9 ++++--- src/audio/types.cpp | 41 +++++++++-------------------- src/audio/types.h | 4 +-- src/transmit.cpp | 45 ++++++++++---------------------- 6 files changed, 42 insertions(+), 112 deletions(-) diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 399822d18..a5d30f35c 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -60,7 +60,6 @@ #include #include #include -#include #include #include #include @@ -1053,43 +1052,6 @@ static int find_codec_sample_rate(int sample_rate, const int *supported) { return rate_hi > 0 ? rate_hi : rate_lo; } -void -audio_compress_send_native(struct rtp *audio_network_device, - struct audio_codec_state *audio_encoder, - struct tx *tx_session, void *fec_state, - audio_frame2 *uncompressed) -{ - auto *fec_ = (fec *) fec_state; - if (incompatible_features) { - audio_tx_data *data = nullptr; - list buffers; // retain ptrs referenced by data - while (audio_frame2 to_send = - audio_codec_compress(audio_encoder, uncompressed)) { - if (fec_state != nullptr) { - to_send = fec_->encode(to_send); - } - data = to_send.append_tx_data(data); - buffers.push_back(std::move(to_send)); - uncompressed = nullptr; - } - if (data != nullptr) { - audio_tx_send(tx_session, audio_network_device, data); - audio_tx_data_cleanup(data); - } - } else { - while (audio_frame2 to_send = - audio_codec_compress(audio_encoder, uncompressed)) { - if (fec_state != nullptr) { - to_send = fec_->encode(to_send); - } - audio_tx_data *data = to_send.append_tx_data(nullptr); - audio_tx_send(tx_session, audio_network_device, data); - audio_tx_data_cleanup(data); - uncompressed = nullptr; - } - } -} - static void *audio_sender_thread(void *arg) { set_thread_name(__func__); @@ -1165,9 +1127,15 @@ static void *audio_sender_thread(void *arg) process_statistics(s, &bf_n); // SEND if(s->sender == NET_NATIVE) { - audio_compress_send_native( - s->audio_network_device, s->audio_encoder, - s->tx_session, s->fec_state, &bf_n); + audio_frame2 *uncompressed = &bf_n; + while (audio_frame2 to_send = audio_codec_compress(s->audio_encoder, uncompressed)) { + if (s->fec_state != nullptr) { + to_send = s->fec_state->encode(to_send); + } + audio_tx_data tx = to_send.get_tx_data(); + audio_tx_send(s->tx_session, s->audio_network_device, &tx); + uncompressed = NULL; + } }else if(s->sender == NET_STANDARD){ audio_frame2 *uncompressed = &bf_n; while (audio_frame2 compressed = audio_codec_compress(s->audio_encoder, uncompressed)) { diff --git a/src/audio/audio.h b/src/audio/audio.h index 3feb47589..d4f30ce42 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -84,11 +84,6 @@ int audio_init(struct state_audio **state, struct module *parent, long long int bitrate, volatile int *audio_delay, time_ns_t start_time, int mtu, int ttl, struct exporter *exporter); - -void audio_compress_send_native(struct rtp *audio_network_device, - struct audio_codec_state *audio_encoder, - struct tx *tx_session, void *fec_state, - audio_frame2 *uncompressed); #endif #ifdef __cplusplus diff --git a/src/audio/playback/mixer.cpp b/src/audio/playback/mixer.cpp index 513585252..49e39555f 100644 --- a/src/audio/playback/mixer.cpp +++ b/src/audio/playback/mixer.cpp @@ -42,7 +42,6 @@ #include "config_win32.h" #endif -#include "audio/audio.h" #include "audio/audio_capture.h" #include "audio/audio_playback.h" #include "audio/codec.h" @@ -358,9 +357,11 @@ void state_audio_mixer::worker() participant_index = 0; for (auto & p : participants) { audio_frame2 *uncompressed = &participant_frames[participant_index]; - audio_compress_send_native( - p.second.m_network_device, p.second.m_audio_coder, - p.second.m_tx_session, nullptr, uncompressed); + while (audio_frame2 compressed = audio_codec_compress(p.second.m_audio_coder, uncompressed)) { + audio_tx_data tx = compressed.get_tx_data(); + audio_tx_send(p.second.m_tx_session, p.second.m_network_device, &tx); + uncompressed = nullptr; + } participant_index++; } diff --git a/src/audio/types.cpp b/src/audio/types.cpp index ce3f2eb58..bafcd583d 100644 --- a/src/audio/types.cpp +++ b/src/audio/types.cpp @@ -49,7 +49,6 @@ #include "host.h" #include "utils/macros.h" -#include #include #include #include @@ -372,37 +371,21 @@ bool audio_frame2::resample(audio_frame2_resampler & resampler_state, int new_sa return true; } -audio_tx_data * -audio_frame2::append_tx_data(audio_tx_data *src) +audio_tx_data +audio_frame2::get_tx_data() { - if (src == nullptr) { - src = new audio_tx_data; - src->timestamp = get_timestamp(); - src->desc = get_desc(); - src->channels = new audio_tx_channel[get_channel_count()]; - for (int i = 0; i < get_channel_count(); ++i) { - src->channels[i].pkt_count = 0; - } - } else { - assert(src->desc == get_desc()); - } + tx_channels.resize(get_channel_count()); + audio_tx_data ret{}; + ret.desc = get_desc(); + ret.timestamp = get_timestamp(); + ret.channels = tx_channels.data(); for (int i = 0; i < get_channel_count(); ++i) { - const int idx = src->channels[i].pkt_count; - assert(idx < TX_MAX_AUDIO_PACKETS); - - src->channels[i].pkts[idx].data = get_data(i); - src->channels[i].pkts[idx].len = (int) get_data_len(i); - src->channels[i].pkts[idx].fec_desc = get_fec_params(i); - src->channels[i].pkt_count += 1; + ret.channels[i].pkt_count = 1; + ret.channels[i].pkts[0].data = get_data(i); + ret.channels[i].pkts[0].len = (int) get_data_len(i); + ret.channels[i].pkts[0].fec_desc = get_fec_params(i); } - return src; -} - -void -audio_tx_data_cleanup(audio_tx_data *d) -{ - delete d->channels; - delete d; + return ret; } diff --git a/src/audio/types.h b/src/audio/types.h index 7ee2d5471..2e9db9c15 100644 --- a/src/audio/types.h +++ b/src/audio/types.h @@ -145,7 +145,6 @@ struct audio_tx_data { int64_t timestamp; ///< -1 if not valid struct audio_tx_channel *channels; }; -void audio_tx_data_cleanup(struct audio_tx_data *d); #ifdef __cplusplus #include @@ -212,7 +211,7 @@ public: bool resample(audio_frame2_resampler &resampler_state, int new_sample_rate); ///@ resamples to new sample rate while keeping nominal sample rate intact std::tuple resample_fake(audio_frame2_resampler & resampler_state, int new_sample_rate_num, int new_sample_rate_den); - audio_tx_data *append_tx_data(audio_tx_data *src); + audio_tx_data get_tx_data(); private: struct channel { std::unique_ptr data; @@ -226,6 +225,7 @@ private: std::vector channels; /* data should be at least 4B aligned */ double duration = 0.0; ///< for compressed formats where this cannot be directly determined from samples/sample_rate int64_t timestamp = -1; + std::vector tx_channels; friend class audio_frame2_resampler; friend class soxr_resampler; diff --git a/src/transmit.cpp b/src/transmit.cpp index 818484740..4be791e77 100644 --- a/src/transmit.cpp +++ b/src/transmit.cpp @@ -772,10 +772,10 @@ tx_send_base(struct tx *tx, struct video_frame *frame, struct rtp *rtp_session, free(rtp_headers); } -static void audio_tx_send_pkt(struct tx *tx, struct rtp *rtp_session, - uint32_t timestamp, - const struct audio_tx_data *buffer, int channel, - int packet, int buflen, int pktoff, bool send_m); +static void audio_tx_send_chan(struct tx *tx, struct rtp *rtp_session, + uint32_t timestamp, + const struct audio_tx_data *buffer, int channel, + int packet, bool send_m); /* * This multiplication scheme relies upon the fact, that our RTP/pbuf implementation is @@ -798,37 +798,20 @@ audio_tx_send(struct tx *tx, struct rtp *rtp_session, for (int iter = 0; iter < tx->mult_count; ++iter) { for (int chan = 0; chan < buffer->desc.ch_count; ++chan) { - int buflen = 0; - for (int pkt = 0; pkt < buffer->channels[chan].pkt_count; - ++pkt) { - buflen += buffer->channels[chan].pkts[pkt].len; - } - int pktoff = 0; - for (int pkt = 0; pkt < buffer->channels[chan].pkt_count; - ++pkt) { - bool send_m = - iter == tx->mult_count - 1 && - chan == buffer->desc.ch_count - 1 && - pkt == buffer->channels[chan].pkt_count - 1; - audio_tx_send_pkt(tx, rtp_session, timestamp, - buffer, chan, pkt, buflen, - pktoff, send_m); - pktoff += buffer->channels[chan].pkts[pkt].len; - } + bool send_m = iter == tx->mult_count - 1 && + chan == buffer->desc.ch_count - 1; + assert(buffer->channels[chan].pkt_count == 1); + audio_tx_send_chan(tx, rtp_session, timestamp, buffer, + chan, 0, send_m); } } tx->buffer++; } -/** - * @param buflen aggregate size of all audio packages to be sent - * @param pktoff offset of the audio packet inside the buffer -*/ static void -audio_tx_send_pkt(struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, - const struct audio_tx_data *buffer, int channel, int packet, - int buflen, int pktoff, bool send_m) +audio_tx_send_chan(struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, + const struct audio_tx_data *buffer, int channel, int packet, bool send_m) { const struct audio_tx_pkt *pkt = &buffer->channels[channel].pkts[packet]; @@ -850,7 +833,7 @@ audio_tx_send_pkt(struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, if (pkt->fec_desc.type == FEC_NONE) { hdrs_len += (sizeof(audio_payload_hdr_t)); rtp_hdr_len = sizeof(audio_payload_hdr_t); - format_audio_header(buffer->desc, channel, buflen, tx->buffer, + format_audio_header(buffer->desc, channel, len, tx->buffer, rtp_hdr); } else { hdrs_len += (sizeof(fec_payload_hdr_t)); @@ -859,7 +842,7 @@ audio_tx_send_pkt(struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, tmp |= 0x3fffff & tx->buffer; // see definition in rtp_callback.h rtp_hdr[0] = htonl(tmp); - rtp_hdr[2] = htonl(buflen); + rtp_hdr[2] = htonl(len); rtp_hdr[3] = htonl(pkt->fec_desc.k << 19 | pkt->fec_desc.m << 6 | pkt->fec_desc.c); @@ -888,7 +871,7 @@ audio_tx_send_pkt(struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, m = 1; } } - rtp_hdr[1] = htonl(pktoff + pos); + rtp_hdr[1] = htonl(pos); pos += data_len; char encrypted_data[data_len + MAX_CRYPTO_EXCEED];