• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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