webrtc_m130/audio/channel_receive_frame_transformer_delegate.h
Tommi e2e046452a Remove a couple of locks from ChannelReceive and add thread checks.
* Removes playing_lock_, sync_info_lock_ and video_sync_lock_.
* Also remove video_capture_thread_race_checker_ which was redundant.

Only video_sync_lock_ was actually needed. The other two aren't needed
anymore because of changes made to RtpStreamsSynchronizer class last
year (see webrtc:11489).

In the one case where we had a lock, we post a task to the thread
where the state is maintained. This task is for capturing histograms
which I'm not sure we should have been capturing on the audio thread
anyway.

Also making ChannelReceiveFrameTransformerDelegate compatible with more
tests by using TaskQueueBase instead of rtc::Thread. A number of tests
that instantiate ChannelReceive (and thereby CRFTD) set the worker
thread as a TQ and not actually an rtc::Thread instance. In those cases
CRFTD would previously have gotten a nullptr for the worker thread.

Bug: webrtc:11993
Change-Id: I59f4b2afbfedb06f241d9a613f8538adc19cd6d8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221364
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Reviewed-by: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34257}
2021-06-09 16:07:02 +00:00

75 lines
2.8 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_RECEIVE_FRAME_TRANSFORMER_DELEGATE_H_
#define AUDIO_CHANNEL_RECEIVE_FRAME_TRANSFORMER_DELEGATE_H_
#include <memory>
#include "api/frame_transformer_interface.h"
#include "api/sequence_checker.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/task_queue.h"
#include "rtc_base/thread.h"
namespace webrtc {
// Delegates calls to FrameTransformerInterface to transform frames, and to
// ChannelReceive to receive the transformed frames using the
// |receive_frame_callback_| on the |channel_receive_thread_|.
class ChannelReceiveFrameTransformerDelegate : public TransformedFrameCallback {
public:
using ReceiveFrameCallback =
std::function<void(rtc::ArrayView<const uint8_t> packet,
const RTPHeader& header)>;
ChannelReceiveFrameTransformerDelegate(
ReceiveFrameCallback receive_frame_callback,
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
TaskQueueBase* channel_receive_thread);
// Registers |this| as callback for |frame_transformer_|, to get the
// transformed frames.
void Init();
// Unregisters and releases the |frame_transformer_| reference, and resets
// |receive_frame_callback_| on |channel_receive_thread_|. Called from
// ChannelReceive destructor to prevent running the callback on a dangling
// channel.
void Reset();
// Delegates the call to FrameTransformerInterface::Transform, to transform
// the frame asynchronously.
void Transform(rtc::ArrayView<const uint8_t> packet,
const RTPHeader& header,
uint32_t ssrc);
// Implements TransformedFrameCallback. Can be called on any thread.
void OnTransformedFrame(
std::unique_ptr<TransformableFrameInterface> frame) override;
// Delegates the call to ChannelReceive::OnReceivedPayloadData on the
// |channel_receive_thread_|, by calling |receive_frame_callback_|.
void ReceiveFrame(std::unique_ptr<TransformableFrameInterface> frame) const;
protected:
~ChannelReceiveFrameTransformerDelegate() override = default;
private:
RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_;
ReceiveFrameCallback receive_frame_callback_
RTC_GUARDED_BY(sequence_checker_);
rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_
RTC_GUARDED_BY(sequence_checker_);
TaskQueueBase* const channel_receive_thread_;
};
} // namespace webrtc
#endif // AUDIO_CHANNEL_RECEIVE_FRAME_TRANSFORMER_DELEGATE_H_