mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
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:
parent
28d07ddbfd
commit
b0e7057e1b
14 changed files with 52 additions and 16 deletions
|
@ -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_
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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_) {
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue