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 "audio/channel_receive_frame_transformer_delegate.h"
12
13 #include <utility>
14
15 #include "rtc_base/buffer.h"
16
17 namespace webrtc {
18 namespace {
19
20 class TransformableIncomingAudioFrame
21 : public TransformableAudioFrameInterface {
22 public:
TransformableIncomingAudioFrame(rtc::ArrayView<const uint8_t> payload,const RTPHeader & header,uint32_t ssrc)23 TransformableIncomingAudioFrame(rtc::ArrayView<const uint8_t> payload,
24 const RTPHeader& header,
25 uint32_t ssrc)
26 : payload_(payload.data(), payload.size()),
27 header_(header),
28 ssrc_(ssrc) {}
29 ~TransformableIncomingAudioFrame() override = default;
GetData() const30 rtc::ArrayView<const uint8_t> GetData() const override { return payload_; }
31
SetData(rtc::ArrayView<const uint8_t> data)32 void SetData(rtc::ArrayView<const uint8_t> data) override {
33 payload_.SetData(data.data(), data.size());
34 }
35
GetPayloadType() const36 uint8_t GetPayloadType() const override { return header_.payloadType; }
GetSsrc() const37 uint32_t GetSsrc() const override { return ssrc_; }
GetTimestamp() const38 uint32_t GetTimestamp() const override { return header_.timestamp; }
GetHeader() const39 const RTPHeader& GetHeader() const override { return header_; }
GetContributingSources() const40 rtc::ArrayView<const uint32_t> GetContributingSources() const override {
41 return rtc::ArrayView<const uint32_t>(header_.arrOfCSRCs, header_.numCSRCs);
42 }
GetDirection() const43 Direction GetDirection() const override { return Direction::kReceiver; }
44
45 private:
46 rtc::Buffer payload_;
47 RTPHeader header_;
48 uint32_t ssrc_;
49 };
50 } // namespace
51
ChannelReceiveFrameTransformerDelegate(ReceiveFrameCallback receive_frame_callback,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,TaskQueueBase * channel_receive_thread)52 ChannelReceiveFrameTransformerDelegate::ChannelReceiveFrameTransformerDelegate(
53 ReceiveFrameCallback receive_frame_callback,
54 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
55 TaskQueueBase* channel_receive_thread)
56 : receive_frame_callback_(receive_frame_callback),
57 frame_transformer_(std::move(frame_transformer)),
58 channel_receive_thread_(channel_receive_thread) {}
59
Init()60 void ChannelReceiveFrameTransformerDelegate::Init() {
61 RTC_DCHECK_RUN_ON(&sequence_checker_);
62 frame_transformer_->RegisterTransformedFrameCallback(
63 rtc::scoped_refptr<TransformedFrameCallback>(this));
64 }
65
Reset()66 void ChannelReceiveFrameTransformerDelegate::Reset() {
67 RTC_DCHECK_RUN_ON(&sequence_checker_);
68 frame_transformer_->UnregisterTransformedFrameCallback();
69 frame_transformer_ = nullptr;
70 receive_frame_callback_ = ReceiveFrameCallback();
71 }
72
Transform(rtc::ArrayView<const uint8_t> packet,const RTPHeader & header,uint32_t ssrc)73 void ChannelReceiveFrameTransformerDelegate::Transform(
74 rtc::ArrayView<const uint8_t> packet,
75 const RTPHeader& header,
76 uint32_t ssrc) {
77 RTC_DCHECK_RUN_ON(&sequence_checker_);
78 frame_transformer_->Transform(
79 std::make_unique<TransformableIncomingAudioFrame>(packet, header, ssrc));
80 }
81
OnTransformedFrame(std::unique_ptr<TransformableFrameInterface> frame)82 void ChannelReceiveFrameTransformerDelegate::OnTransformedFrame(
83 std::unique_ptr<TransformableFrameInterface> frame) {
84 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate(this);
85 channel_receive_thread_->PostTask(
86 [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
87 delegate->ReceiveFrame(std::move(frame));
88 });
89 }
90
ReceiveFrame(std::unique_ptr<TransformableFrameInterface> frame) const91 void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
92 std::unique_ptr<TransformableFrameInterface> frame) const {
93 RTC_DCHECK_RUN_ON(&sequence_checker_);
94 if (!receive_frame_callback_)
95 return;
96 RTC_CHECK_EQ(frame->GetDirection(),
97 TransformableFrameInterface::Direction::kReceiver);
98 auto* transformed_frame =
99 static_cast<TransformableIncomingAudioFrame*>(frame.get());
100 receive_frame_callback_(transformed_frame->GetData(),
101 transformed_frame->GetHeader());
102 }
103 } // namespace webrtc
104