mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +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;
|
||||
};
|
||||
|
||||
// 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_
|
||||
|
|
|
@ -38,7 +38,7 @@ RtpReceiverInterface::dtls_transport() const {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void RtpReceiverInterface::SetDepacketizerToDecoderFrameTransformer(
|
||||
void RtpReceiverInterface::SetFrameTransformer(
|
||||
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {}
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -63,7 +63,7 @@ class MockRtpSender : public RtpSenderInterface {
|
|||
(),
|
||||
(const, override));
|
||||
MOCK_METHOD(void,
|
||||
SetEncoderToPacketizerFrameTransformer,
|
||||
SetFrameTransformer,
|
||||
(rtc::scoped_refptr<FrameTransformerInterface>),
|
||||
(override));
|
||||
MOCK_METHOD(void,
|
||||
|
|
|
@ -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_) {
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -85,7 +85,7 @@ class MockRtpSenderInternal : public RtpSenderInternal {
|
|||
(),
|
||||
(const, override));
|
||||
MOCK_METHOD(void,
|
||||
SetEncoderToPacketizerFrameTransformer,
|
||||
SetFrameTransformer,
|
||||
(rtc::scoped_refptr<FrameTransformerInterface>),
|
||||
(override));
|
||||
MOCK_METHOD(void,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue