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;
};
// 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
#endif // API_FRAME_TRANSFORMER_INTERFACE_H_

View file

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

View file

@ -15,8 +15,10 @@
#define API_RTP_RECEIVER_INTERFACE_H_
#include <string>
#include <utility>
#include <vector>
#include "absl/types/optional.h"
#include "api/crypto/frame_decryptor_interface.h"
#include "api/dtls_transport_interface.h"
#include "api/frame_transformer_interface.h"
@ -44,7 +46,8 @@ class RtpReceiverObserverInterface {
virtual ~RtpReceiverObserverInterface() {}
};
class RTC_EXPORT RtpReceiverInterface : public webrtc::RefCountInterface {
class RTC_EXPORT RtpReceiverInterface : public webrtc::RefCountInterface,
public FrameTransformerHost {
public:
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
// client code to transform received frames according to their own processing
// logic.
// TODO: bugs.webrtc.org/15929 - add [[deprecated("Use SetFrameTransformer")]]
// when usage in Chrome is removed
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:
~RtpReceiverInterface() override = default;

View file

@ -14,8 +14,10 @@
#ifndef API_RTP_SENDER_INTERFACE_H_
#define API_RTP_SENDER_INTERFACE_H_
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
@ -36,7 +38,8 @@ namespace webrtc {
using SetParametersCallback = absl::AnyInvocable<void(RTCError) &&>;
class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface {
class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface,
public FrameTransformerHost {
public:
// Returns true if successful in setting the track.
// 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()
const = 0;
// TODO: bugs.webrtc.org/15929 - add [[deprecated("Use SetFrameTransformer")]]
// when usage in Chrome is removed
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.
// Overrides selector that is (optionally) provided by VideoEncoderFactory.
@ -109,6 +116,11 @@ class RTC_EXPORT RtpSenderInterface : public webrtc::RefCountInterface {
std::unique_ptr<VideoEncoderFactory::EncoderSelectorInterface>
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:
~RtpSenderInterface() override = default;
};

View file

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

View file

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

View file

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

View file

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

View file

@ -506,7 +506,7 @@ void RtpSenderBase::SetSsrc(uint32_t ssrc) {
SetFrameEncryptor(frame_encryptor_);
}
if (frame_transformer_) {
SetEncoderToPacketizerFrameTransformer(frame_transformer_);
SetFrameTransformer(frame_transformer_);
}
if (encoder_selector_) {
SetEncoderSelectorOnChannel();
@ -580,7 +580,7 @@ RTCError RtpSenderBase::DisableEncodingLayers(
return result;
}
void RtpSenderBase::SetEncoderToPacketizerFrameTransformer(
void RtpSenderBase::SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
RTC_DCHECK_RUN_ON(signaling_thread_);
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.
RTCError DisableEncodingLayers(const std::vector<std::string>& rid) override;
void SetEncoderToPacketizerFrameTransformer(
void SetFrameTransformer(
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) override;
void SetEncoderSelector(

View file

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

View file

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

View file

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

View file

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