Introduce the TransformerHost interface

This is the first step in implementing custom codecs in SDP.

Bug: none
Change-Id: I7789478208a769eaefd58b410ae6f488c604594d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/348662
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Tony Herre <herre@google.com>
Cr-Commit-Position: refs/heads/main@{#42171}
This commit is contained in:
Harald Alvestrand 2024-04-23 14:04:18 +00:00 committed by WebRTC LUCI CQ
parent 28d07ddbfd
commit b0e7057e1b
14 changed files with 52 additions and 16 deletions

View file

@ -120,6 +120,18 @@ class FrameTransformerInterface : public rtc::RefCountInterface {
~FrameTransformerInterface() override = default; ~FrameTransformerInterface() override = default;
}; };
// An interface implemented by classes that can host a transform.
// Currently this is implemented by the RTCRtpSender and RTCRtpReceiver.
class FrameTransformerHost {
public:
virtual ~FrameTransformerHost() {}
virtual void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) = 0;
// TODO: bugs.webrtc.org/15929 - To be added:
// virtual AddIncomingMediaType(RtpCodec codec) = 0;
// virtual AddOutgoingMediaType(RtpCodec codec) = 0;
};
} // namespace webrtc } // namespace webrtc
#endif // API_FRAME_TRANSFORMER_INTERFACE_H_ #endif // API_FRAME_TRANSFORMER_INTERFACE_H_

View file

@ -38,7 +38,7 @@ RtpReceiverInterface::dtls_transport() const {
return nullptr; return nullptr;
} }
void RtpReceiverInterface::SetDepacketizerToDecoderFrameTransformer( void RtpReceiverInterface::SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {} rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {}
} // namespace webrtc } // namespace webrtc

View file

@ -15,8 +15,10 @@
#define API_RTP_RECEIVER_INTERFACE_H_ #define API_RTP_RECEIVER_INTERFACE_H_
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#include "absl/types/optional.h"
#include "api/crypto/frame_decryptor_interface.h" #include "api/crypto/frame_decryptor_interface.h"
#include "api/dtls_transport_interface.h" #include "api/dtls_transport_interface.h"
#include "api/frame_transformer_interface.h" #include "api/frame_transformer_interface.h"
@ -44,7 +46,8 @@ class RtpReceiverObserverInterface {
virtual ~RtpReceiverObserverInterface() {} virtual ~RtpReceiverObserverInterface() {}
}; };
class RTC_EXPORT RtpReceiverInterface : public webrtc::RefCountInterface { class RTC_EXPORT RtpReceiverInterface : public webrtc::RefCountInterface,
public FrameTransformerHost {
public: public:
virtual rtc::scoped_refptr<MediaStreamTrackInterface> track() const = 0; virtual rtc::scoped_refptr<MediaStreamTrackInterface> track() const = 0;
@ -111,8 +114,17 @@ class RTC_EXPORT RtpReceiverInterface : public webrtc::RefCountInterface {
// Sets a frame transformer between the depacketizer and the decoder to enable // Sets a frame transformer between the depacketizer and the decoder to enable
// client code to transform received frames according to their own processing // client code to transform received frames according to their own processing
// logic. // logic.
// TODO: bugs.webrtc.org/15929 - add [[deprecated("Use SetFrameTransformer")]]
// when usage in Chrome is removed
virtual void SetDepacketizerToDecoderFrameTransformer( virtual void SetDepacketizerToDecoderFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer); rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
SetFrameTransformer(std::move(frame_transformer));
}
// Default implementation of SetFrameTransformer.
// TODO: bugs.webrtc.org/15929 - Make pure virtual.
void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
protected: protected:
~RtpReceiverInterface() override = default; ~RtpReceiverInterface() override = default;

View file

@ -14,8 +14,10 @@
#ifndef API_RTP_SENDER_INTERFACE_H_ #ifndef API_RTP_SENDER_INTERFACE_H_
#define API_RTP_SENDER_INTERFACE_H_ #define API_RTP_SENDER_INTERFACE_H_
#include <cstdint>
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#include "absl/functional/any_invocable.h" #include "absl/functional/any_invocable.h"
@ -36,7 +38,8 @@ namespace webrtc {
using SetParametersCallback = absl::AnyInvocable<void(RTCError) &&>; using SetParametersCallback = absl::AnyInvocable<void(RTCError) &&>;
class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface { class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface,
public FrameTransformerHost {
public: public:
// Returns true if successful in setting the track. // Returns true if successful in setting the track.
// Fails if an audio track is set on a video RtpSender, or vice-versa. // Fails if an audio track is set on a video RtpSender, or vice-versa.
@ -100,8 +103,12 @@ class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface {
virtual rtc::scoped_refptr<FrameEncryptorInterface> GetFrameEncryptor() virtual rtc::scoped_refptr<FrameEncryptorInterface> GetFrameEncryptor()
const = 0; const = 0;
// TODO: bugs.webrtc.org/15929 - add [[deprecated("Use SetFrameTransformer")]]
// when usage in Chrome is removed
virtual void SetEncoderToPacketizerFrameTransformer( virtual void SetEncoderToPacketizerFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) = 0; rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
SetFrameTransformer(std::move(frame_transformer));
}
// Sets a user defined encoder selector. // Sets a user defined encoder selector.
// Overrides selector that is (optionally) provided by VideoEncoderFactory. // Overrides selector that is (optionally) provided by VideoEncoderFactory.
@ -109,6 +116,11 @@ class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface {
std::unique_ptr<VideoEncoderFactory::EncoderSelectorInterface> std::unique_ptr<VideoEncoderFactory::EncoderSelectorInterface>
encoder_selector) = 0; encoder_selector) = 0;
// Default implementation of SetFrameTransformer.
// TODO: bugs.webrtc.org/15929 - remove when all implementations are good
void SetFrameTransformer(rtc::scoped_refptr<FrameTransformerInterface>
frame_transformer) override {}
protected: protected:
~RtpSenderInterface() override = default; ~RtpSenderInterface() override = default;
}; };

View file

@ -63,7 +63,7 @@ class MockRtpSender : public RtpSenderInterface {
(), (),
(const, override)); (const, override));
MOCK_METHOD(void, MOCK_METHOD(void,
SetEncoderToPacketizerFrameTransformer, SetFrameTransformer,
(rtc::scoped_refptr<FrameTransformerInterface>), (rtc::scoped_refptr<FrameTransformerInterface>),
(override)); (override));
MOCK_METHOD(void, MOCK_METHOD(void,

View file

@ -277,7 +277,7 @@ std::vector<RtpSource> AudioRtpReceiver::GetSources() const {
return media_channel_->GetSources(current_ssrc.value()); return media_channel_->GetSources(current_ssrc.value());
} }
void AudioRtpReceiver::SetDepacketizerToDecoderFrameTransformer( void AudioRtpReceiver::SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) { rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
RTC_DCHECK_RUN_ON(worker_thread_); RTC_DCHECK_RUN_ON(worker_thread_);
if (media_channel_) { if (media_channel_) {

View file

@ -117,7 +117,7 @@ class AudioRtpReceiver : public ObserverInterface,
std::vector<RtpSource> GetSources() const override; std::vector<RtpSource> GetSources() const override;
int AttachmentId() const override { return attachment_id_; } int AttachmentId() const override { return attachment_id_; }
void SetDepacketizerToDecoderFrameTransformer( void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override; rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
private: private:

View file

@ -45,7 +45,7 @@ PROXY_SECONDARY_METHOD1(void,
PROXY_SECONDARY_CONSTMETHOD0(rtc::scoped_refptr<FrameDecryptorInterface>, PROXY_SECONDARY_CONSTMETHOD0(rtc::scoped_refptr<FrameDecryptorInterface>,
GetFrameDecryptor) GetFrameDecryptor)
PROXY_SECONDARY_METHOD1(void, PROXY_SECONDARY_METHOD1(void,
SetDepacketizerToDecoderFrameTransformer, SetFrameTransformer,
rtc::scoped_refptr<FrameTransformerInterface>) rtc::scoped_refptr<FrameTransformerInterface>)
END_PROXY_MAP(RtpReceiver) END_PROXY_MAP(RtpReceiver)

View file

@ -506,7 +506,7 @@ void RtpSenderBase::SetSsrc(uint32_t ssrc) {
SetFrameEncryptor(frame_encryptor_); SetFrameEncryptor(frame_encryptor_);
} }
if (frame_transformer_) { if (frame_transformer_) {
SetEncoderToPacketizerFrameTransformer(frame_transformer_); SetFrameTransformer(frame_transformer_);
} }
if (encoder_selector_) { if (encoder_selector_) {
SetEncoderSelectorOnChannel(); SetEncoderSelectorOnChannel();
@ -580,7 +580,7 @@ RTCError RtpSenderBase::DisableEncodingLayers(
return result; return result;
} }
void RtpSenderBase::SetEncoderToPacketizerFrameTransformer( void RtpSenderBase::SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) { rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
RTC_DCHECK_RUN_ON(signaling_thread_); RTC_DCHECK_RUN_ON(signaling_thread_);
frame_transformer_ = std::move(frame_transformer); frame_transformer_ = std::move(frame_transformer);

View file

@ -206,7 +206,7 @@ class RtpSenderBase : public RtpSenderInternal, public ObserverInterface {
// If the specified list is empty, this is a no-op. // If the specified list is empty, this is a no-op.
RTCError DisableEncodingLayers(const std::vector<std::string>& rid) override; RTCError DisableEncodingLayers(const std::vector<std::string>& rid) override;
void SetEncoderToPacketizerFrameTransformer( void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override; rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
void SetEncoderSelector( void SetEncoderSelector(

View file

@ -47,7 +47,7 @@ PROXY_CONSTMETHOD0(rtc::scoped_refptr<FrameEncryptorInterface>,
GetFrameEncryptor) GetFrameEncryptor)
PROXY_METHOD1(void, SetStreams, const std::vector<std::string>&) PROXY_METHOD1(void, SetStreams, const std::vector<std::string>&)
PROXY_METHOD1(void, PROXY_METHOD1(void,
SetEncoderToPacketizerFrameTransformer, SetFrameTransformer,
rtc::scoped_refptr<FrameTransformerInterface>) rtc::scoped_refptr<FrameTransformerInterface>)
PROXY_METHOD1(void, PROXY_METHOD1(void,
SetEncoderSelector, SetEncoderSelector,

View file

@ -85,7 +85,7 @@ class MockRtpSenderInternal : public RtpSenderInternal {
(), (),
(const, override)); (const, override));
MOCK_METHOD(void, MOCK_METHOD(void,
SetEncoderToPacketizerFrameTransformer, SetFrameTransformer,
(rtc::scoped_refptr<FrameTransformerInterface>), (rtc::scoped_refptr<FrameTransformerInterface>),
(override)); (override));
MOCK_METHOD(void, MOCK_METHOD(void,

View file

@ -98,7 +98,7 @@ VideoRtpReceiver::GetFrameDecryptor() const {
return frame_decryptor_; return frame_decryptor_;
} }
void VideoRtpReceiver::SetDepacketizerToDecoderFrameTransformer( void VideoRtpReceiver::SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) { rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
RTC_DCHECK_RUN_ON(worker_thread_); RTC_DCHECK_RUN_ON(worker_thread_);
frame_transformer_ = std::move(frame_transformer); frame_transformer_ = std::move(frame_transformer);

View file

@ -82,7 +82,7 @@ class VideoRtpReceiver : public RtpReceiverInternal {
rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor()
const override; const override;
void SetDepacketizerToDecoderFrameTransformer( void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override; rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
// RtpReceiverInternal implementation. // RtpReceiverInternal implementation.