xref: /aosp_15_r20/external/webrtc/api/frame_transformer_interface.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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