xref: /aosp_15_r20/external/webrtc/video/rtp_video_stream_receiver_frame_transformer_delegate.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "video/rtp_video_stream_receiver_frame_transformer_delegate.h"
12 
13 #include <utility>
14 #include <vector>
15 
16 #include "absl/memory/memory.h"
17 #include "modules/rtp_rtcp/source/rtp_descriptor_authentication.h"
18 #include "rtc_base/thread.h"
19 
20 namespace webrtc {
21 
22 namespace {
23 class TransformableVideoReceiverFrame
24     : public TransformableVideoFrameInterface {
25  public:
TransformableVideoReceiverFrame(std::unique_ptr<RtpFrameObject> frame,uint32_t ssrc)26   TransformableVideoReceiverFrame(std::unique_ptr<RtpFrameObject> frame,
27                                   uint32_t ssrc)
28       : frame_(std::move(frame)),
29         metadata_(frame_->GetRtpVideoHeader().GetAsMetadata()),
30         ssrc_(ssrc) {}
31   ~TransformableVideoReceiverFrame() override = default;
32 
33   // Implements TransformableVideoFrameInterface.
GetData() const34   rtc::ArrayView<const uint8_t> GetData() const override {
35     return *frame_->GetEncodedData();
36   }
37 
SetData(rtc::ArrayView<const uint8_t> data)38   void SetData(rtc::ArrayView<const uint8_t> data) override {
39     frame_->SetEncodedData(
40         EncodedImageBuffer::Create(data.data(), data.size()));
41   }
42 
GetPayloadType() const43   uint8_t GetPayloadType() const override { return frame_->PayloadType(); }
GetSsrc() const44   uint32_t GetSsrc() const override { return ssrc_; }
GetTimestamp() const45   uint32_t GetTimestamp() const override { return frame_->Timestamp(); }
46 
IsKeyFrame() const47   bool IsKeyFrame() const override {
48     return frame_->FrameType() == VideoFrameType::kVideoFrameKey;
49   }
50 
GetAdditionalData() const51   std::vector<uint8_t> GetAdditionalData() const override {
52     return RtpDescriptorAuthentication(frame_->GetRtpVideoHeader());
53   }
54 
GetMetadata() const55   const VideoFrameMetadata& GetMetadata() const override { return metadata_; }
56 
ExtractFrame()57   std::unique_ptr<RtpFrameObject> ExtractFrame() && {
58     return std::move(frame_);
59   }
60 
GetDirection() const61   Direction GetDirection() const override { return Direction::kReceiver; }
62 
63  private:
64   std::unique_ptr<RtpFrameObject> frame_;
65   const VideoFrameMetadata metadata_;
66   const uint32_t ssrc_;
67 };
68 }  // namespace
69 
70 RtpVideoStreamReceiverFrameTransformerDelegate::
RtpVideoStreamReceiverFrameTransformerDelegate(RtpVideoFrameReceiver * receiver,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,rtc::Thread * network_thread,uint32_t ssrc)71     RtpVideoStreamReceiverFrameTransformerDelegate(
72         RtpVideoFrameReceiver* receiver,
73         rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
74         rtc::Thread* network_thread,
75         uint32_t ssrc)
76     : receiver_(receiver),
77       frame_transformer_(std::move(frame_transformer)),
78       network_thread_(network_thread),
79       ssrc_(ssrc) {}
80 
Init()81 void RtpVideoStreamReceiverFrameTransformerDelegate::Init() {
82   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
83   frame_transformer_->RegisterTransformedFrameSinkCallback(
84       rtc::scoped_refptr<TransformedFrameCallback>(this), ssrc_);
85 }
86 
Reset()87 void RtpVideoStreamReceiverFrameTransformerDelegate::Reset() {
88   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
89   frame_transformer_->UnregisterTransformedFrameSinkCallback(ssrc_);
90   frame_transformer_ = nullptr;
91   receiver_ = nullptr;
92 }
93 
TransformFrame(std::unique_ptr<RtpFrameObject> frame)94 void RtpVideoStreamReceiverFrameTransformerDelegate::TransformFrame(
95     std::unique_ptr<RtpFrameObject> frame) {
96   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
97   frame_transformer_->Transform(
98       std::make_unique<TransformableVideoReceiverFrame>(std::move(frame),
99                                                         ssrc_));
100 }
101 
OnTransformedFrame(std::unique_ptr<TransformableFrameInterface> frame)102 void RtpVideoStreamReceiverFrameTransformerDelegate::OnTransformedFrame(
103     std::unique_ptr<TransformableFrameInterface> frame) {
104   rtc::scoped_refptr<RtpVideoStreamReceiverFrameTransformerDelegate> delegate(
105       this);
106   network_thread_->PostTask(
107       [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
108         delegate->ManageFrame(std::move(frame));
109       });
110 }
111 
ManageFrame(std::unique_ptr<TransformableFrameInterface> frame)112 void RtpVideoStreamReceiverFrameTransformerDelegate::ManageFrame(
113     std::unique_ptr<TransformableFrameInterface> frame) {
114   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
115   RTC_CHECK_EQ(frame->GetDirection(),
116                TransformableFrameInterface::Direction::kReceiver);
117   if (!receiver_)
118     return;
119   auto transformed_frame = absl::WrapUnique(
120       static_cast<TransformableVideoReceiverFrame*>(frame.release()));
121   receiver_->ManageFrame(std::move(*transformed_frame).ExtractFrame());
122 }
123 
124 }  // namespace webrtc
125