xref: /aosp_15_r20/external/webrtc/audio/channel_receive_frame_transformer_delegate.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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