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/task_utils/to_queued_task.h"
19 #include "rtc_base/thread.h"
20 
21 namespace webrtc {
22 
23 namespace {
24 class TransformableVideoReceiverFrame
25     : public TransformableVideoFrameInterface {
26  public:
TransformableVideoReceiverFrame(std::unique_ptr<video_coding::RtpFrameObject> frame,uint32_t ssrc)27   TransformableVideoReceiverFrame(
28       std::unique_ptr<video_coding::RtpFrameObject> frame,
29       uint32_t ssrc)
30       : frame_(std::move(frame)),
31         metadata_(frame_->GetRtpVideoHeader()),
32         ssrc_(ssrc) {}
33   ~TransformableVideoReceiverFrame() override = default;
34 
35   // Implements TransformableVideoFrameInterface.
GetData() const36   rtc::ArrayView<const uint8_t> GetData() const override {
37     return *frame_->GetEncodedData();
38   }
39 
SetData(rtc::ArrayView<const uint8_t> data)40   void SetData(rtc::ArrayView<const uint8_t> data) override {
41     frame_->SetEncodedData(
42         EncodedImageBuffer::Create(data.data(), data.size()));
43   }
44 
GetTimestamp() const45   uint32_t GetTimestamp() const override { return frame_->Timestamp(); }
GetSsrc() const46   uint32_t GetSsrc() const override { return ssrc_; }
47 
IsKeyFrame() const48   bool IsKeyFrame() const override {
49     return frame_->FrameType() == VideoFrameType::kVideoFrameKey;
50   }
51 
GetAdditionalData() const52   std::vector<uint8_t> GetAdditionalData() const override {
53     return RtpDescriptorAuthentication(frame_->GetRtpVideoHeader());
54   }
55 
GetMetadata() const56   const VideoFrameMetadata& GetMetadata() const override { return metadata_; }
57 
ExtractFrame()58   std::unique_ptr<video_coding::RtpFrameObject> ExtractFrame() && {
59     return std::move(frame_);
60   }
61 
62  private:
63   std::unique_ptr<video_coding::RtpFrameObject> frame_;
64   const VideoFrameMetadata metadata_;
65   const uint32_t ssrc_;
66 };
67 }  // namespace
68 
69 RtpVideoStreamReceiverFrameTransformerDelegate::
RtpVideoStreamReceiverFrameTransformerDelegate(RtpVideoFrameReceiver * receiver,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,rtc::Thread * network_thread,uint32_t ssrc)70     RtpVideoStreamReceiverFrameTransformerDelegate(
71         RtpVideoFrameReceiver* receiver,
72         rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
73         rtc::Thread* network_thread,
74         uint32_t ssrc)
75     : receiver_(receiver),
76       frame_transformer_(std::move(frame_transformer)),
77       network_thread_(network_thread),
78       ssrc_(ssrc) {}
79 
Init()80 void RtpVideoStreamReceiverFrameTransformerDelegate::Init() {
81   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
82   frame_transformer_->RegisterTransformedFrameSinkCallback(
83       rtc::scoped_refptr<TransformedFrameCallback>(this), ssrc_);
84 }
85 
Reset()86 void RtpVideoStreamReceiverFrameTransformerDelegate::Reset() {
87   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
88   frame_transformer_->UnregisterTransformedFrameSinkCallback(ssrc_);
89   frame_transformer_ = nullptr;
90   receiver_ = nullptr;
91 }
92 
TransformFrame(std::unique_ptr<video_coding::RtpFrameObject> frame)93 void RtpVideoStreamReceiverFrameTransformerDelegate::TransformFrame(
94     std::unique_ptr<video_coding::RtpFrameObject> frame) {
95   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
96   frame_transformer_->Transform(
97       std::make_unique<TransformableVideoReceiverFrame>(std::move(frame),
98                                                         ssrc_));
99 }
100 
OnTransformedFrame(std::unique_ptr<TransformableFrameInterface> frame)101 void RtpVideoStreamReceiverFrameTransformerDelegate::OnTransformedFrame(
102     std::unique_ptr<TransformableFrameInterface> frame) {
103   rtc::scoped_refptr<RtpVideoStreamReceiverFrameTransformerDelegate> delegate =
104       this;
105   network_thread_->PostTask(ToQueuedTask(
106       [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
107         delegate->ManageFrame(std::move(frame));
108       }));
109 }
110 
ManageFrame(std::unique_ptr<TransformableFrameInterface> frame)111 void RtpVideoStreamReceiverFrameTransformerDelegate::ManageFrame(
112     std::unique_ptr<TransformableFrameInterface> frame) {
113   RTC_DCHECK_RUN_ON(&network_sequence_checker_);
114   if (!receiver_)
115     return;
116   auto transformed_frame = absl::WrapUnique(
117       static_cast<TransformableVideoReceiverFrame*>(frame.release()));
118   receiver_->ManageFrame(std::move(*transformed_frame).ExtractFrame());
119 }
120 
121 }  // namespace webrtc
122