mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00

Keep the logic managing whether audio RTP timestamps have the random start offset added or not inside ChannelSend, so that the ChannelSendFrameTransformerDelegate doesn't need to worry about it. Crucially, this means that frames moved between senders by encoded transforms clients will always use the correct offset for the channel where we actually get sent. Also rename TS variables throughout both classes to be explicit over whether the offset has been added or not. Bug: chromium:1464847 Change-Id: I19955ec4c1cb834161b00dd74622725a070b713a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317900 Commit-Queue: Tony Herre <herre@google.com> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40655}
84 lines
3.3 KiB
C++
84 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef AUDIO_CHANNEL_SEND_FRAME_TRANSFORMER_DELEGATE_H_
|
|
#define AUDIO_CHANNEL_SEND_FRAME_TRANSFORMER_DELEGATE_H_
|
|
|
|
#include <memory>
|
|
|
|
#include "api/frame_transformer_interface.h"
|
|
#include "api/sequence_checker.h"
|
|
#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
|
|
#include "rtc_base/buffer.h"
|
|
#include "rtc_base/synchronization/mutex.h"
|
|
#include "rtc_base/task_queue.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// Delegates calls to FrameTransformerInterface to transform frames, and to
|
|
// ChannelSend to send the transformed frames using `send_frame_callback_` on
|
|
// the `encoder_queue_`.
|
|
// OnTransformedFrame() can be called from any thread, the delegate ensures
|
|
// thread-safe access to the ChannelSend callback.
|
|
class ChannelSendFrameTransformerDelegate : public TransformedFrameCallback {
|
|
public:
|
|
using SendFrameCallback =
|
|
std::function<int32_t(AudioFrameType frameType,
|
|
uint8_t payloadType,
|
|
uint32_t rtp_timestamp_with_offset,
|
|
rtc::ArrayView<const uint8_t> payload,
|
|
int64_t absolute_capture_timestamp_ms)>;
|
|
ChannelSendFrameTransformerDelegate(
|
|
SendFrameCallback send_frame_callback,
|
|
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
|
|
rtc::TaskQueue* encoder_queue);
|
|
|
|
// Registers `this` as callback for `frame_transformer_`, to get the
|
|
// transformed frames.
|
|
void Init();
|
|
|
|
// Unregisters and releases the `frame_transformer_` reference, and resets
|
|
// `send_frame_callback_` under lock. Called from ChannelSend destructor to
|
|
// prevent running the callback on a dangling channel.
|
|
void Reset();
|
|
|
|
// Delegates the call to FrameTransformerInterface::TransformFrame, to
|
|
// transform the frame asynchronously.
|
|
void Transform(AudioFrameType frame_type,
|
|
uint8_t payload_type,
|
|
uint32_t rtp_timestamp,
|
|
const uint8_t* payload_data,
|
|
size_t payload_size,
|
|
int64_t absolute_capture_timestamp_ms,
|
|
uint32_t ssrc);
|
|
|
|
// Implements TransformedFrameCallback. Can be called on any thread.
|
|
void OnTransformedFrame(
|
|
std::unique_ptr<TransformableFrameInterface> frame) override;
|
|
|
|
// Delegates the call to ChannelSend::SendRtpAudio on the `encoder_queue_`,
|
|
// by calling `send_audio_callback_`.
|
|
void SendFrame(std::unique_ptr<TransformableFrameInterface> frame) const;
|
|
|
|
protected:
|
|
~ChannelSendFrameTransformerDelegate() override = default;
|
|
|
|
private:
|
|
mutable Mutex send_lock_;
|
|
SendFrameCallback send_frame_callback_ RTC_GUARDED_BY(send_lock_);
|
|
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_;
|
|
rtc::TaskQueue* encoder_queue_ RTC_GUARDED_BY(send_lock_);
|
|
};
|
|
|
|
std::unique_ptr<TransformableAudioFrameInterface> CloneSenderAudioFrame(
|
|
TransformableAudioFrameInterface* original);
|
|
|
|
} // namespace webrtc
|
|
#endif // AUDIO_CHANNEL_SEND_FRAME_TRANSFORMER_DELEGATE_H_
|