blob: c9865cbe19446807695b3fcaf9e8f46b1b74dfc1 [file] [log] [blame]
Marina Ciocea48623202020-04-01 10:19:44 +02001/*
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
18namespace webrtc {
19namespace {
20
Tony Herre8fb41a32021-09-24 12:05:20 +000021class TransformableIncomingAudioFrame
22 : public TransformableAudioFrameInterface {
Marina Ciocea48623202020-04-01 10:19:44 +020023 public:
Tony Herre8fb41a32021-09-24 12:05:20 +000024 TransformableIncomingAudioFrame(rtc::ArrayView<const uint8_t> payload,
25 const RTPHeader& header,
26 uint32_t ssrc)
Marina Ciocea48623202020-04-01 10:19:44 +020027 : payload_(payload.data(), payload.size()),
28 header_(header),
29 ssrc_(ssrc) {}
Tony Herre8fb41a32021-09-24 12:05:20 +000030 ~TransformableIncomingAudioFrame() override = default;
Marina Ciocea48623202020-04-01 10:19:44 +020031 rtc::ArrayView<const uint8_t> GetData() const override { return payload_; }
32
33 void SetData(rtc::ArrayView<const uint8_t> data) override {
34 payload_.SetData(data.data(), data.size());
35 }
36
Philipp Hancke2ace42f2021-08-24 10:40:12 +020037 uint8_t GetPayloadType() const override { return header_.payloadType; }
Marina Ciocea48623202020-04-01 10:19:44 +020038 uint32_t GetSsrc() const override { return ssrc_; }
Philipp Hancke2ace42f2021-08-24 10:40:12 +020039 uint32_t GetTimestamp() const override { return header_.timestamp; }
Marina Ciocea48623202020-04-01 10:19:44 +020040 const RTPHeader& GetHeader() const override { return header_; }
Tony Herre8fb41a32021-09-24 12:05:20 +000041 Direction GetDirection() const override { return Direction::kReceiver; }
Marina Ciocea48623202020-04-01 10:19:44 +020042
43 private:
44 rtc::Buffer payload_;
45 RTPHeader header_;
46 uint32_t ssrc_;
47};
48} // namespace
49
50ChannelReceiveFrameTransformerDelegate::ChannelReceiveFrameTransformerDelegate(
51 ReceiveFrameCallback receive_frame_callback,
52 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Tommie2e04642021-06-09 16:11:11 +020053 TaskQueueBase* channel_receive_thread)
Marina Ciocea48623202020-04-01 10:19:44 +020054 : receive_frame_callback_(receive_frame_callback),
55 frame_transformer_(std::move(frame_transformer)),
56 channel_receive_thread_(channel_receive_thread) {}
57
58void ChannelReceiveFrameTransformerDelegate::Init() {
59 RTC_DCHECK_RUN_ON(&sequence_checker_);
60 frame_transformer_->RegisterTransformedFrameCallback(
61 rtc::scoped_refptr<TransformedFrameCallback>(this));
62}
63
64void ChannelReceiveFrameTransformerDelegate::Reset() {
65 RTC_DCHECK_RUN_ON(&sequence_checker_);
66 frame_transformer_->UnregisterTransformedFrameCallback();
67 frame_transformer_ = nullptr;
68 receive_frame_callback_ = ReceiveFrameCallback();
69}
70
71void ChannelReceiveFrameTransformerDelegate::Transform(
72 rtc::ArrayView<const uint8_t> packet,
73 const RTPHeader& header,
74 uint32_t ssrc) {
75 RTC_DCHECK_RUN_ON(&sequence_checker_);
76 frame_transformer_->Transform(
Tony Herre8fb41a32021-09-24 12:05:20 +000077 std::make_unique<TransformableIncomingAudioFrame>(packet, header, ssrc));
Marina Ciocea48623202020-04-01 10:19:44 +020078}
79
80void ChannelReceiveFrameTransformerDelegate::OnTransformedFrame(
81 std::unique_ptr<TransformableFrameInterface> frame) {
Niels Möllera3361ff2022-01-13 14:05:38 +010082 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate(this);
Marina Ciocea48623202020-04-01 10:19:44 +020083 channel_receive_thread_->PostTask(ToQueuedTask(
84 [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
85 delegate->ReceiveFrame(std::move(frame));
86 }));
87}
88
89void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
90 std::unique_ptr<TransformableFrameInterface> frame) const {
91 RTC_DCHECK_RUN_ON(&sequence_checker_);
92 if (!receive_frame_callback_)
93 return;
Tony Herre8fb41a32021-09-24 12:05:20 +000094 RTC_CHECK_EQ(frame->GetDirection(),
95 TransformableFrameInterface::Direction::kReceiver);
96 auto* transformed_frame =
97 static_cast<TransformableIncomingAudioFrame*>(frame.get());
Marina Ciocea48623202020-04-01 10:19:44 +020098 receive_frame_callback_(transformed_frame->GetData(),
99 transformed_frame->GetHeader());
100}
101} // namespace webrtc