blob: 7e617df78018ece3f619c7fb3288aa180468135d [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
21class TransformableAudioFrame : public TransformableAudioFrameInterface {
22 public:
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;
30 rtc::ArrayView<const uint8_t> GetData() const override { return payload_; }
31
32 void SetData(rtc::ArrayView<const uint8_t> data) override {
33 payload_.SetData(data.data(), data.size());
34 }
35
36 uint32_t GetTimestamp() const override { return header_.timestamp; }
37 uint32_t GetSsrc() const override { return ssrc_; }
38 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
47ChannelReceiveFrameTransformerDelegate::ChannelReceiveFrameTransformerDelegate(
48 ReceiveFrameCallback receive_frame_callback,
49 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Tommie2e04642021-06-09 16:11:11 +020050 TaskQueueBase* channel_receive_thread)
Marina Ciocea48623202020-04-01 10:19:44 +020051 : receive_frame_callback_(receive_frame_callback),
52 frame_transformer_(std::move(frame_transformer)),
53 channel_receive_thread_(channel_receive_thread) {}
54
55void ChannelReceiveFrameTransformerDelegate::Init() {
56 RTC_DCHECK_RUN_ON(&sequence_checker_);
57 frame_transformer_->RegisterTransformedFrameCallback(
58 rtc::scoped_refptr<TransformedFrameCallback>(this));
59}
60
61void ChannelReceiveFrameTransformerDelegate::Reset() {
62 RTC_DCHECK_RUN_ON(&sequence_checker_);
63 frame_transformer_->UnregisterTransformedFrameCallback();
64 frame_transformer_ = nullptr;
65 receive_frame_callback_ = ReceiveFrameCallback();
66}
67
68void 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
77void 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
86void 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