From f6d1284c3c1cd188ca52a7a41dcc9920785c24b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Mill=C3=A1n?= Date: Wed, 29 Jun 2022 17:56:16 +0200 Subject: [PATCH] SimpleConsumer: Opus DTX ignore capabilities (#846) * SimpleConsumer: Opus DTX ignore capabilities --- node/lib/Consumer.d.ts | 5 ++ node/lib/Consumer.d.ts.map | 2 +- node/lib/Transport.d.ts | 2 +- node/lib/Transport.d.ts.map | 2 +- node/lib/Transport.js | 5 +- node/lib/types.js | 6 +- node/src/Consumer.ts | 6 ++ node/src/Transport.ts | 6 +- rust/src/messages.rs | 1 + rust/src/router/consumer.rs | 4 + rust/src/router/transport.rs | 2 + worker/include/RTC/Codecs/Opus.hpp | 89 +++++++++++++++++++ .../RTC/Codecs/PayloadDescriptorHandler.hpp | 9 ++ worker/include/RTC/Codecs/Tools.hpp | 31 ++++++- worker/include/RTC/SimpleConsumer.hpp | 1 + worker/meson.build | 1 + worker/src/RTC/Codecs/Opus.cpp | 77 ++++++++++++++++ worker/src/RTC/SimpleConsumer.cpp | 37 ++++++++ 18 files changed, 272 insertions(+), 14 deletions(-) create mode 100644 worker/include/RTC/Codecs/Opus.hpp create mode 100644 worker/src/RTC/Codecs/Opus.cpp diff --git a/node/lib/Consumer.d.ts b/node/lib/Consumer.d.ts index d5f37d0438..6f57790c77 100644 --- a/node/lib/Consumer.d.ts +++ b/node/lib/Consumer.d.ts @@ -38,6 +38,11 @@ export declare type ConsumerOptions = { * If unset, the highest ones are selected. */ preferredLayers?: ConsumerLayers; + /** + * Whether this Consumer should ignore DTX packets (only valid for Opus codec). + * If set, DTX packets are not forwarded to the remote Consumer. + */ + ignoreDtx?: Boolean; /** * Whether this Consumer should consume all RTP streams generated by the * Producer. diff --git a/node/lib/Consumer.d.ts.map b/node/lib/Consumer.d.ts.map index efb4fe9fd9..88f54a8092 100644 --- a/node/lib/Consumer.d.ts.map +++ b/node/lib/Consumer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Consumer.d.ts","sourceRoot":"","sources":["../src/Consumer.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Consumer.d.ts","sourceRoot":"","sources":["../src/Consumer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Transport.d.ts b/node/lib/Transport.d.ts index e7df227e19..45eff1d93d 100644 --- a/node/lib/Transport.d.ts +++ b/node/lib/Transport.d.ts @@ -176,7 +176,7 @@ export declare class Transport; + consume({ producerId, rtpCapabilities, paused, mid, preferredLayers, ignoreDtx, pipe, appData }: ConsumerOptions): Promise; /** * Create a DataProducer. */ diff --git a/node/lib/Transport.d.ts.map b/node/lib/Transport.d.ts.map index 294a0a3500..bd7d986c5d 100644 --- a/node/lib/Transport.d.ts.map +++ b/node/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/lib/Transport.js b/node/lib/Transport.js index 4491d7f62a..07dd92a46d 100644 --- a/node/lib/Transport.js +++ b/node/lib/Transport.js @@ -345,7 +345,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { * * @virtual */ - async consume({ producerId, rtpCapabilities, paused = false, mid, preferredLayers, pipe = false, appData }) { + async consume({ producerId, rtpCapabilities, paused = false, mid, preferredLayers, ignoreDtx = false, pipe = false, appData }) { logger.debug('consume()'); if (!producerId || typeof producerId !== 'string') throw new TypeError('missing producerId'); @@ -381,7 +381,8 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { type: pipe ? 'pipe' : producer.type, consumableRtpEncodings: producer.consumableRtpParameters.encodings, paused, - preferredLayers + preferredLayers, + ignoreDtx }; const status = await this.channel.request('transport.consume', internal, reqData); const data = { diff --git a/node/lib/types.js b/node/lib/types.js index 65d74efd03..8036245dae 100644 --- a/node/lib/types.js +++ b/node/lib/types.js @@ -1,11 +1,7 @@ "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; diff --git a/node/src/Consumer.ts b/node/src/Consumer.ts index 90bf44bfb6..6853deb0e1 100644 --- a/node/src/Consumer.ts +++ b/node/src/Consumer.ts @@ -49,6 +49,12 @@ export type ConsumerOptions = */ preferredLayers?: ConsumerLayers; + /** + * Whether this Consumer should ignore DTX packets (only valid for Opus codec). + * If set, DTX packets are not forwarded to the remote Consumer. + */ + ignoreDtx?: Boolean; + /** * Whether this Consumer should consume all RTP streams generated by the * Producer. diff --git a/node/src/Transport.ts b/node/src/Transport.ts index f07a5aef4b..ccb2b34b3d 100644 --- a/node/src/Transport.ts +++ b/node/src/Transport.ts @@ -623,6 +623,7 @@ export class Transport, pub(crate) paused: bool, pub(crate) preferred_layers: Option, + pub(crate) ignore_dtx: bool, } request_response!( diff --git a/rust/src/router/consumer.rs b/rust/src/router/consumer.rs index b1ae108e71..2e5a54de82 100644 --- a/rust/src/router/consumer.rs +++ b/rust/src/router/consumer.rs @@ -78,6 +78,9 @@ pub struct ConsumerOptions { /// Preferred spatial and temporal layer for simulcast or SVC media sources. /// If `None`, the highest ones are selected. pub preferred_layers: Option, + /// Whether this Consumer should ignore DTX packets (only valid for Opus codec). + /// If set, DTX packets are not forwarded to the remote Consumer. + pub ignore_dtx: bool, /// Whether this Consumer should consume all RTP streams generated by the Producer. pub pipe: bool, /// Custom application data. @@ -93,6 +96,7 @@ impl ConsumerOptions { rtp_capabilities, paused: false, preferred_layers: None, + ignore_dtx: false, pipe: false, mid: None, app_data: AppData::default(), diff --git a/rust/src/router/transport.rs b/rust/src/router/transport.rs index 99f093b167..013a027c13 100644 --- a/rust/src/router/transport.rs +++ b/rust/src/router/transport.rs @@ -554,6 +554,7 @@ pub(super) trait TransportImpl: TransportGeneric { paused, mid, preferred_layers, + ignore_dtx, pipe, app_data, } = consumer_options; @@ -621,6 +622,7 @@ pub(super) trait TransportImpl: TransportGeneric { .clone(), paused, preferred_layers, + ignore_dtx, }, }) .await diff --git a/worker/include/RTC/Codecs/Opus.hpp b/worker/include/RTC/Codecs/Opus.hpp new file mode 100644 index 0000000000..a703e224de --- /dev/null +++ b/worker/include/RTC/Codecs/Opus.hpp @@ -0,0 +1,89 @@ +#ifndef MS_RTC_CODECS_OPUS_HPP +#define MS_RTC_CODECS_OPUS_HPP + +#include "common.hpp" +#include "RTC/Codecs/PayloadDescriptorHandler.hpp" +#include "RTC/RtpPacket.hpp" +#include "RTC/SeqManager.hpp" + +namespace RTC +{ + namespace Codecs + { + class Opus + { + public: + struct PayloadDescriptor : public RTC::Codecs::PayloadDescriptor + { + /* Pure virtual methods inherited from RTC::Codecs::PayloadDescriptor. */ + ~PayloadDescriptor() = default; + + void Dump() const override; + + // Parsed values. + bool isDtx{ false }; + }; + + public: + static Opus::PayloadDescriptor* Parse(const uint8_t* data, size_t len); + static void ProcessRtpPacket(RTC::RtpPacket* packet); + + public: + class EncodingContext : public RTC::Codecs::EncodingContext + { + public: + explicit EncodingContext(RTC::Codecs::EncodingContext::Params& params) + : RTC::Codecs::EncodingContext(params) + { + } + ~EncodingContext() = default; + + /* Pure virtual methods inherited from RTC::Codecs::EncodingContext. */ + public: + void SyncRequired() override + { + this->syncRequired = true; + } + + public: + bool syncRequired{ false }; + }; + + public: + class PayloadDescriptorHandler : public RTC::Codecs::PayloadDescriptorHandler + { + public: + explicit PayloadDescriptorHandler(PayloadDescriptor* payloadDescriptor); + ~PayloadDescriptorHandler() = default; + + public: + void Dump() const override + { + this->payloadDescriptor->Dump(); + } + bool Process(RTC::Codecs::EncodingContext* encodingContext, uint8_t* data, bool& marker) override; + void Restore(uint8_t* data) override + { + return; + }; + uint8_t GetSpatialLayer() const override + { + return 0u; + } + uint8_t GetTemporalLayer() const override + { + return 0u; + } + bool IsKeyFrame() const override + { + return false; + } + + private: + std::unique_ptr payloadDescriptor; + }; + }; + } // namespace Codecs +} // namespace RTC + +#endif diff --git a/worker/include/RTC/Codecs/PayloadDescriptorHandler.hpp b/worker/include/RTC/Codecs/PayloadDescriptorHandler.hpp index a15cff9d62..d2f2846b02 100644 --- a/worker/include/RTC/Codecs/PayloadDescriptorHandler.hpp +++ b/worker/include/RTC/Codecs/PayloadDescriptorHandler.hpp @@ -61,6 +61,10 @@ namespace RTC { return this->currentTemporalLayer; } + bool GetIgnoreDtx() const + { + return this->ignoreDtx; + } void SetTargetSpatialLayer(int16_t spatialLayer) { this->targetSpatialLayer = spatialLayer; @@ -77,6 +81,10 @@ namespace RTC { this->currentTemporalLayer = temporalLayer; } + void SetIgnoreDtx(bool ignoreDtx) + { + this->ignoreDtx = ignoreDtx; + } virtual void SyncRequired() = 0; private: @@ -85,6 +93,7 @@ namespace RTC int16_t targetTemporalLayer{ -1 }; int16_t currentSpatialLayer{ -1 }; int16_t currentTemporalLayer{ -1 }; + bool ignoreDtx{ false }; }; class PayloadDescriptorHandler diff --git a/worker/include/RTC/Codecs/Tools.hpp b/worker/include/RTC/Codecs/Tools.hpp index 6f9d837486..33c9d0768a 100644 --- a/worker/include/RTC/Codecs/Tools.hpp +++ b/worker/include/RTC/Codecs/Tools.hpp @@ -4,6 +4,7 @@ #include "common.hpp" #include "RTC/Codecs/H264.hpp" #include "RTC/Codecs/H264_SVC.hpp" +#include "RTC/Codecs/Opus.hpp" #include "RTC/Codecs/PayloadDescriptorHandler.hpp" #include "RTC/Codecs/VP8.hpp" #include "RTC/Codecs/VP9.hpp" @@ -19,8 +20,6 @@ namespace RTC public: static bool CanBeKeyFrame(const RTC::RtpCodecMimeType& mimeType) { - MS_TRACE(); - switch (mimeType.type) { case RTC::RtpCodecMimeType::Type::VIDEO: @@ -83,6 +82,22 @@ namespace RTC } } + case RTC::RtpCodecMimeType::Type::AUDIO: + { + switch (mimeType.subtype) + { + case RTC::RtpCodecMimeType::Subtype::OPUS: + case RTC::RtpCodecMimeType::Subtype::MULTIOPUS: + { + RTC::Codecs::Opus::ProcessRtpPacket(packet); + + break; + } + + default:; + } + } + default:; } } @@ -181,6 +196,18 @@ namespace RTC } } + case RTC::RtpCodecMimeType::Type::AUDIO: + { + switch (mimeType.subtype) + { + case RTC::RtpCodecMimeType::Subtype::OPUS: + case RTC::RtpCodecMimeType::Subtype::MULTIOPUS: + return new RTC::Codecs::Opus::EncodingContext(params); + default: + return nullptr; + } + } + default: { return nullptr; diff --git a/worker/include/RTC/SimpleConsumer.hpp b/worker/include/RTC/SimpleConsumer.hpp index a26f293a14..4448b5c41c 100644 --- a/worker/include/RTC/SimpleConsumer.hpp +++ b/worker/include/RTC/SimpleConsumer.hpp @@ -78,6 +78,7 @@ namespace RTC bool syncRequired{ false }; RTC::SeqManager rtpSeqManager; bool managingBitrate{ false }; + std::unique_ptr encodingContext; }; } // namespace RTC diff --git a/worker/meson.build b/worker/meson.build index 92abdd7a09..4dc6e3d69c 100644 --- a/worker/meson.build +++ b/worker/meson.build @@ -115,6 +115,7 @@ common_sources = [ 'src/RTC/Codecs/H264_SVC.cpp', 'src/RTC/Codecs/VP8.cpp', 'src/RTC/Codecs/VP9.cpp', + 'src/RTC/Codecs/Opus.cpp', 'src/RTC/RtpDictionaries/Media.cpp', 'src/RTC/RtpDictionaries/Parameters.cpp', 'src/RTC/RtpDictionaries/RtcpFeedback.cpp', diff --git a/worker/src/RTC/Codecs/Opus.cpp b/worker/src/RTC/Codecs/Opus.cpp new file mode 100644 index 0000000000..90dd986d4d --- /dev/null +++ b/worker/src/RTC/Codecs/Opus.cpp @@ -0,0 +1,77 @@ +#define MS_CLASS "RTC::Codecs::Opus" +// #define MS_LOG_DEV_LEVEL 3 + +#include "RTC/Codecs/Opus.hpp" +#include "Logger.hpp" + +namespace RTC +{ + namespace Codecs + { + /* Class methods. */ + + Opus::PayloadDescriptor* Opus::Parse(const uint8_t* data, size_t len) + { + MS_TRACE(); + + std::unique_ptr payloadDescriptor(new PayloadDescriptor()); + + // libopus generates a single byte payload (TOC, no frames) to generate DTX. + if (len == 1) + { + payloadDescriptor->isDtx = true; + } + + return payloadDescriptor.release(); + } + + void Opus::ProcessRtpPacket(RTC::RtpPacket* packet) + { + MS_TRACE(); + + auto* data = packet->GetPayload(); + auto len = packet->GetPayloadLength(); + + PayloadDescriptor* payloadDescriptor = Opus::Parse(data, len); + + auto* payloadDescriptorHandler = new PayloadDescriptorHandler(payloadDescriptor); + + packet->SetPayloadDescriptorHandler(payloadDescriptorHandler); + } + + /* Instance methods. */ + + void Opus::PayloadDescriptor::Dump() const + { + MS_TRACE(); + + MS_DUMP(""); + MS_DUMP(" isDtx : %s", this->isDtx ? "true" : "false"); + MS_DUMP(""); + } + + Opus::PayloadDescriptorHandler::PayloadDescriptorHandler(Opus::PayloadDescriptor* payloadDescriptor) + { + MS_TRACE(); + + this->payloadDescriptor.reset(payloadDescriptor); + } + + bool Opus::PayloadDescriptorHandler::Process( + RTC::Codecs::EncodingContext* encodingContext, uint8_t* data, bool& /*marker*/) + { + MS_TRACE(); + + auto* context = static_cast(encodingContext); + + if (this->payloadDescriptor->isDtx && context->GetIgnoreDtx()) + { + return false; + } + else + { + return true; + } + }; + } // namespace Codecs +} // namespace RTC diff --git a/worker/src/RTC/SimpleConsumer.cpp b/worker/src/RTC/SimpleConsumer.cpp index 9c8cd450cd..9f71e0727d 100644 --- a/worker/src/RTC/SimpleConsumer.cpp +++ b/worker/src/RTC/SimpleConsumer.cpp @@ -29,6 +29,26 @@ namespace RTC // Create RtpStreamSend instance for sending a single stream to the remote. CreateRtpStream(); + + RTC::Codecs::EncodingContext::Params params; + + // Create the encoding context if needed. + this->encodingContext.reset(RTC::Codecs::Tools::GetEncodingContext(mediaCodec->mimeType, params)); + + if ( + mediaCodec->mimeType.type == RTC::RtpCodecMimeType::Type::AUDIO && + (mediaCodec->mimeType.subtype == RTC::RtpCodecMimeType::Subtype::OPUS || + mediaCodec->mimeType.subtype == RTC::RtpCodecMimeType::Subtype::MULTIOPUS)) + { + auto jsonIgnoreDtx = data.find("ignoreDtx"); + + if (jsonIgnoreDtx != data.end() && jsonIgnoreDtx->is_boolean()) + { + auto ignoreDtx = jsonIgnoreDtx->get(); + + this->encodingContext->SetIgnoreDtx(ignoreDtx); + } + } } SimpleConsumer::~SimpleConsumer() @@ -246,6 +266,23 @@ namespace RTC return; } + bool marker; + + // Process the payload if needed. Drop packet if necessary. + if (!packet->ProcessPayload(this->encodingContext.get(), marker)) + { + MS_DEBUG_TAG( + rtp, + "discarding packet [ssrc:%" PRIu32 ", seq:%" PRIu16 ", ts:%" PRIu32 "]", + packet->GetSsrc(), + packet->GetSequenceNumber(), + packet->GetTimestamp()); + + this->rtpSeqManager.Drop(packet->GetSequenceNumber()); + + return; + } + // If we need to sync, support key frames and this is not a key frame, ignore // the packet. if (this->syncRequired && this->keyFrameSupported && !packet->IsKeyFrame())