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