1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2020 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef API_FRAME_TRANSFORMER_INTERFACE_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_FRAME_TRANSFORMER_INTERFACE_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <vector> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 18*d9f75844SAndroid Build Coastguard Worker #include "api/video/encoded_frame.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame_metadata.h" 20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Worker // Owns the frame payload data. 25*d9f75844SAndroid Build Coastguard Worker class TransformableFrameInterface { 26*d9f75844SAndroid Build Coastguard Worker public: 27*d9f75844SAndroid Build Coastguard Worker virtual ~TransformableFrameInterface() = default; 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker // Returns the frame payload data. The data is valid until the next non-const 30*d9f75844SAndroid Build Coastguard Worker // method call. 31*d9f75844SAndroid Build Coastguard Worker virtual rtc::ArrayView<const uint8_t> GetData() const = 0; 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker // Copies `data` into the owned frame payload data. 34*d9f75844SAndroid Build Coastguard Worker virtual void SetData(rtc::ArrayView<const uint8_t> data) = 0; 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker virtual uint8_t GetPayloadType() const = 0; 37*d9f75844SAndroid Build Coastguard Worker virtual uint32_t GetSsrc() const = 0; 38*d9f75844SAndroid Build Coastguard Worker virtual uint32_t GetTimestamp() const = 0; 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker enum class Direction { 41*d9f75844SAndroid Build Coastguard Worker kUnknown, 42*d9f75844SAndroid Build Coastguard Worker kReceiver, 43*d9f75844SAndroid Build Coastguard Worker kSender, 44*d9f75844SAndroid Build Coastguard Worker }; 45*d9f75844SAndroid Build Coastguard Worker // TODO(crbug.com/1250638): Remove this distinction between receiver and 46*d9f75844SAndroid Build Coastguard Worker // sender frames to allow received frames to be directly re-transmitted on 47*d9f75844SAndroid Build Coastguard Worker // other PeerConnectionss. GetDirection()48*d9f75844SAndroid Build Coastguard Worker virtual Direction GetDirection() const { return Direction::kUnknown; } 49*d9f75844SAndroid Build Coastguard Worker }; 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Worker class TransformableVideoFrameInterface : public TransformableFrameInterface { 52*d9f75844SAndroid Build Coastguard Worker public: 53*d9f75844SAndroid Build Coastguard Worker virtual ~TransformableVideoFrameInterface() = default; 54*d9f75844SAndroid Build Coastguard Worker virtual bool IsKeyFrame() const = 0; 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker // Returns data needed in the frame transformation logic; for example, 57*d9f75844SAndroid Build Coastguard Worker // when the transformation applied to the frame is encryption/decryption, the 58*d9f75844SAndroid Build Coastguard Worker // additional data holds the serialized generic frame descriptor extension 59*d9f75844SAndroid Build Coastguard Worker // calculated in webrtc::RtpDescriptorAuthentication. 60*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11380) remove from interface once 61*d9f75844SAndroid Build Coastguard Worker // webrtc::RtpDescriptorAuthentication is exposed in api/. 62*d9f75844SAndroid Build Coastguard Worker virtual std::vector<uint8_t> GetAdditionalData() const = 0; 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker virtual const VideoFrameMetadata& GetMetadata() const = 0; 65*d9f75844SAndroid Build Coastguard Worker }; 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker // Extends the TransformableFrameInterface to expose audio-specific information. 68*d9f75844SAndroid Build Coastguard Worker class TransformableAudioFrameInterface : public TransformableFrameInterface { 69*d9f75844SAndroid Build Coastguard Worker public: 70*d9f75844SAndroid Build Coastguard Worker virtual ~TransformableAudioFrameInterface() = default; 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker // Exposes the frame header, enabling the interface clients to use the 73*d9f75844SAndroid Build Coastguard Worker // information in the header as needed, for example to compile the list of 74*d9f75844SAndroid Build Coastguard Worker // csrcs. 75*d9f75844SAndroid Build Coastguard Worker virtual const RTPHeader& GetHeader() const = 0; 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker virtual rtc::ArrayView<const uint32_t> GetContributingSources() const = 0; 78*d9f75844SAndroid Build Coastguard Worker }; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker // Objects implement this interface to be notified with the transformed frame. 81*d9f75844SAndroid Build Coastguard Worker class TransformedFrameCallback : public rtc::RefCountInterface { 82*d9f75844SAndroid Build Coastguard Worker public: 83*d9f75844SAndroid Build Coastguard Worker virtual void OnTransformedFrame( 84*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<TransformableFrameInterface> frame) = 0; 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker protected: 87*d9f75844SAndroid Build Coastguard Worker ~TransformedFrameCallback() override = default; 88*d9f75844SAndroid Build Coastguard Worker }; 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker // Transforms encoded frames. The transformed frame is sent in a callback using 91*d9f75844SAndroid Build Coastguard Worker // the TransformedFrameCallback interface (see above). 92*d9f75844SAndroid Build Coastguard Worker class FrameTransformerInterface : public rtc::RefCountInterface { 93*d9f75844SAndroid Build Coastguard Worker public: 94*d9f75844SAndroid Build Coastguard Worker // Transforms `frame` using the implementing class' processing logic. 95*d9f75844SAndroid Build Coastguard Worker virtual void Transform( 96*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<TransformableFrameInterface> transformable_frame) = 0; 97*d9f75844SAndroid Build Coastguard Worker RegisterTransformedFrameCallback(rtc::scoped_refptr<TransformedFrameCallback>)98*d9f75844SAndroid Build Coastguard Worker virtual void RegisterTransformedFrameCallback( 99*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<TransformedFrameCallback>) {} RegisterTransformedFrameSinkCallback(rtc::scoped_refptr<TransformedFrameCallback>,uint32_t ssrc)100*d9f75844SAndroid Build Coastguard Worker virtual void RegisterTransformedFrameSinkCallback( 101*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<TransformedFrameCallback>, 102*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc) {} UnregisterTransformedFrameCallback()103*d9f75844SAndroid Build Coastguard Worker virtual void UnregisterTransformedFrameCallback() {} UnregisterTransformedFrameSinkCallback(uint32_t ssrc)104*d9f75844SAndroid Build Coastguard Worker virtual void UnregisterTransformedFrameSinkCallback(uint32_t ssrc) {} 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker protected: 107*d9f75844SAndroid Build Coastguard Worker ~FrameTransformerInterface() override = default; 108*d9f75844SAndroid Build Coastguard Worker }; 109*d9f75844SAndroid Build Coastguard Worker 110*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker #endif // API_FRAME_TRANSFORMER_INTERFACE_H_ 113