Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 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_send_frame_transformer_delegate.h" |
| 12 | |
| 13 | #include <utility> |
| 14 | |
| 15 | namespace webrtc { |
| 16 | namespace { |
| 17 | |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 18 | class TransformableOutgoingAudioFrame : public TransformableFrameInterface { |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 19 | public: |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 20 | TransformableOutgoingAudioFrame(AudioFrameType frame_type, |
| 21 | uint8_t payload_type, |
| 22 | uint32_t rtp_timestamp, |
| 23 | uint32_t rtp_start_timestamp, |
| 24 | const uint8_t* payload_data, |
| 25 | size_t payload_size, |
| 26 | int64_t absolute_capture_timestamp_ms, |
| 27 | uint32_t ssrc) |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 28 | : frame_type_(frame_type), |
| 29 | payload_type_(payload_type), |
| 30 | rtp_timestamp_(rtp_timestamp), |
Philipp Hancke | b9d4685 | 2020-04-14 15:26:05 +0200 | [diff] [blame] | 31 | rtp_start_timestamp_(rtp_start_timestamp), |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 32 | payload_(payload_data, payload_size), |
| 33 | absolute_capture_timestamp_ms_(absolute_capture_timestamp_ms), |
| 34 | ssrc_(ssrc) {} |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 35 | ~TransformableOutgoingAudioFrame() override = default; |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 36 | rtc::ArrayView<const uint8_t> GetData() const override { return payload_; } |
| 37 | void SetData(rtc::ArrayView<const uint8_t> data) override { |
| 38 | payload_.SetData(data.data(), data.size()); |
| 39 | } |
Philipp Hancke | b9d4685 | 2020-04-14 15:26:05 +0200 | [diff] [blame] | 40 | uint32_t GetTimestamp() const override { |
| 41 | return rtp_timestamp_ + rtp_start_timestamp_; |
| 42 | } |
| 43 | uint32_t GetStartTimestamp() const { return rtp_start_timestamp_; } |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 44 | uint32_t GetSsrc() const override { return ssrc_; } |
| 45 | |
| 46 | AudioFrameType GetFrameType() const { return frame_type_; } |
Philipp Hancke | 2ace42f | 2021-08-24 10:40:12 +0200 | [diff] [blame] | 47 | uint8_t GetPayloadType() const override { return payload_type_; } |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 48 | int64_t GetAbsoluteCaptureTimestampMs() const { |
| 49 | return absolute_capture_timestamp_ms_; |
| 50 | } |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 51 | Direction GetDirection() const override { return Direction::kSender; } |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 52 | |
| 53 | private: |
| 54 | AudioFrameType frame_type_; |
| 55 | uint8_t payload_type_; |
| 56 | uint32_t rtp_timestamp_; |
Philipp Hancke | b9d4685 | 2020-04-14 15:26:05 +0200 | [diff] [blame] | 57 | uint32_t rtp_start_timestamp_; |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 58 | rtc::Buffer payload_; |
| 59 | int64_t absolute_capture_timestamp_ms_; |
| 60 | uint32_t ssrc_; |
| 61 | }; |
| 62 | } // namespace |
| 63 | |
| 64 | ChannelSendFrameTransformerDelegate::ChannelSendFrameTransformerDelegate( |
| 65 | SendFrameCallback send_frame_callback, |
| 66 | rtc::scoped_refptr<FrameTransformerInterface> frame_transformer, |
| 67 | rtc::TaskQueue* encoder_queue) |
| 68 | : send_frame_callback_(send_frame_callback), |
| 69 | frame_transformer_(std::move(frame_transformer)), |
| 70 | encoder_queue_(encoder_queue) {} |
| 71 | |
| 72 | void ChannelSendFrameTransformerDelegate::Init() { |
| 73 | frame_transformer_->RegisterTransformedFrameCallback( |
| 74 | rtc::scoped_refptr<TransformedFrameCallback>(this)); |
| 75 | } |
| 76 | |
| 77 | void ChannelSendFrameTransformerDelegate::Reset() { |
| 78 | frame_transformer_->UnregisterTransformedFrameCallback(); |
| 79 | frame_transformer_ = nullptr; |
| 80 | |
Markus Handell | 6287280 | 2020-07-06 15:15:07 +0200 | [diff] [blame] | 81 | MutexLock lock(&send_lock_); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 82 | send_frame_callback_ = SendFrameCallback(); |
| 83 | } |
| 84 | |
| 85 | void ChannelSendFrameTransformerDelegate::Transform( |
| 86 | AudioFrameType frame_type, |
| 87 | uint8_t payload_type, |
| 88 | uint32_t rtp_timestamp, |
Philipp Hancke | b9d4685 | 2020-04-14 15:26:05 +0200 | [diff] [blame] | 89 | uint32_t rtp_start_timestamp, |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 90 | const uint8_t* payload_data, |
| 91 | size_t payload_size, |
| 92 | int64_t absolute_capture_timestamp_ms, |
| 93 | uint32_t ssrc) { |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 94 | frame_transformer_->Transform( |
| 95 | std::make_unique<TransformableOutgoingAudioFrame>( |
| 96 | frame_type, payload_type, rtp_timestamp, rtp_start_timestamp, |
| 97 | payload_data, payload_size, absolute_capture_timestamp_ms, ssrc)); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 98 | } |
| 99 | |
| 100 | void ChannelSendFrameTransformerDelegate::OnTransformedFrame( |
| 101 | std::unique_ptr<TransformableFrameInterface> frame) { |
Markus Handell | 6287280 | 2020-07-06 15:15:07 +0200 | [diff] [blame] | 102 | MutexLock lock(&send_lock_); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 103 | if (!send_frame_callback_) |
| 104 | return; |
Niels Möller | a3361ff | 2022-01-13 14:05:38 +0100 | [diff] [blame] | 105 | rtc::scoped_refptr<ChannelSendFrameTransformerDelegate> delegate(this); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 106 | encoder_queue_->PostTask( |
| 107 | [delegate = std::move(delegate), frame = std::move(frame)]() mutable { |
| 108 | delegate->SendFrame(std::move(frame)); |
| 109 | }); |
| 110 | } |
| 111 | |
| 112 | void ChannelSendFrameTransformerDelegate::SendFrame( |
| 113 | std::unique_ptr<TransformableFrameInterface> frame) const { |
Markus Handell | 6287280 | 2020-07-06 15:15:07 +0200 | [diff] [blame] | 114 | MutexLock lock(&send_lock_); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 115 | RTC_DCHECK_RUN_ON(encoder_queue_); |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 116 | RTC_CHECK_EQ(frame->GetDirection(), |
| 117 | TransformableFrameInterface::Direction::kSender); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 118 | if (!send_frame_callback_) |
| 119 | return; |
Tony Herre | 8fb41a3 | 2021-09-24 12:05:20 +0000 | [diff] [blame] | 120 | auto* transformed_frame = |
| 121 | static_cast<TransformableOutgoingAudioFrame*>(frame.get()); |
Philipp Hancke | b9d4685 | 2020-04-14 15:26:05 +0200 | [diff] [blame] | 122 | send_frame_callback_(transformed_frame->GetFrameType(), |
| 123 | transformed_frame->GetPayloadType(), |
| 124 | transformed_frame->GetTimestamp() - |
| 125 | transformed_frame->GetStartTimestamp(), |
| 126 | transformed_frame->GetData(), |
| 127 | transformed_frame->GetAbsoluteCaptureTimestampMs()); |
Marina Ciocea | 65674d8 | 2020-03-31 22:41:30 +0200 | [diff] [blame] | 128 | } |
| 129 | |
| 130 | } // namespace webrtc |