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 #include "rtc_base/task_utils/to_queued_task.h"
17
18 namespace webrtc {
19 namespace {
20
21 class TransformableAudioFrame : public TransformableAudioFrameInterface {
22 public:
TransformableAudioFrame(rtc::ArrayView<const uint8_t> payload,const RTPHeader & header,uint32_t ssrc)23 TransformableAudioFrame(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 ~TransformableAudioFrame() 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
GetTimestamp() const36 uint32_t GetTimestamp() const override { return header_.timestamp; }
GetSsrc() const37 uint32_t GetSsrc() const override { return ssrc_; }
GetHeader() const38 const RTPHeader& GetHeader() const override { return header_; }
39
40 private:
41 rtc::Buffer payload_;
42 RTPHeader header_;
43 uint32_t ssrc_;
44 };
45 } // namespace
46
ChannelReceiveFrameTransformerDelegate(ReceiveFrameCallback receive_frame_callback,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,rtc::Thread * channel_receive_thread)47 ChannelReceiveFrameTransformerDelegate::ChannelReceiveFrameTransformerDelegate(
48 ReceiveFrameCallback receive_frame_callback,
49 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
50 rtc::Thread* channel_receive_thread)
51 : receive_frame_callback_(receive_frame_callback),
52 frame_transformer_(std::move(frame_transformer)),
53 channel_receive_thread_(channel_receive_thread) {}
54
Init()55 void ChannelReceiveFrameTransformerDelegate::Init() {
56 RTC_DCHECK_RUN_ON(&sequence_checker_);
57 frame_transformer_->RegisterTransformedFrameCallback(
58 rtc::scoped_refptr<TransformedFrameCallback>(this));
59 }
60
Reset()61 void ChannelReceiveFrameTransformerDelegate::Reset() {
62 RTC_DCHECK_RUN_ON(&sequence_checker_);
63 frame_transformer_->UnregisterTransformedFrameCallback();
64 frame_transformer_ = nullptr;
65 receive_frame_callback_ = ReceiveFrameCallback();
66 }
67
Transform(rtc::ArrayView<const uint8_t> packet,const RTPHeader & header,uint32_t ssrc)68 void ChannelReceiveFrameTransformerDelegate::Transform(
69 rtc::ArrayView<const uint8_t> packet,
70 const RTPHeader& header,
71 uint32_t ssrc) {
72 RTC_DCHECK_RUN_ON(&sequence_checker_);
73 frame_transformer_->Transform(
74 std::make_unique<TransformableAudioFrame>(packet, header, ssrc));
75 }
76
OnTransformedFrame(std::unique_ptr<TransformableFrameInterface> frame)77 void ChannelReceiveFrameTransformerDelegate::OnTransformedFrame(
78 std::unique_ptr<TransformableFrameInterface> frame) {
79 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate = this;
80 channel_receive_thread_->PostTask(ToQueuedTask(
81 [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
82 delegate->ReceiveFrame(std::move(frame));
83 }));
84 }
85
ReceiveFrame(std::unique_ptr<TransformableFrameInterface> frame) const86 void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
87 std::unique_ptr<TransformableFrameInterface> frame) const {
88 RTC_DCHECK_RUN_ON(&sequence_checker_);
89 if (!receive_frame_callback_)
90 return;
91 auto* transformed_frame = static_cast<TransformableAudioFrame*>(frame.get());
92 receive_frame_callback_(transformed_frame->GetData(),
93 transformed_frame->GetHeader());
94 }
95 } // namespace webrtc
96