mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
Stop using TransformableAudioFrameInterface::GetHeader() within webrtc
Instead switch to specific getters, or methods only defined on specific implementations rather than part of the public API. Once uses are removed from Chromium, I'll mark GetHeader() deprecated and eventually remove it. Bug: chromium:1456628 Change-Id: I19b80489b3a0322c201e24994494cfbb742ee13e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/309780 Commit-Queue: Tony Herre <herre@google.com> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40344}
This commit is contained in:
parent
589ee5ae62
commit
fc68f1f7d9
4 changed files with 80 additions and 17 deletions
|
@ -83,6 +83,18 @@ class TransformableAudioFrameInterface : public TransformableFrameInterface {
|
|||
virtual const absl::optional<uint16_t> SequenceNumber() const {
|
||||
return absl::nullopt;
|
||||
}
|
||||
|
||||
// TODO(crbug.com/1456628): Change this to pure virtual after it
|
||||
// is implemented everywhere.
|
||||
virtual absl::optional<uint64_t> AbsoluteCaptureTimestamp() const {
|
||||
return absl::nullopt;
|
||||
}
|
||||
|
||||
enum class FrameType { kEmptyFrame, kAudioFrameSpeech, kAudioFrameCN };
|
||||
|
||||
// TODO(crbug.com/1456628): Change this to pure virtual after it
|
||||
// is implemented everywhere.
|
||||
virtual FrameType Type() const { return FrameType::kEmptyFrame; }
|
||||
};
|
||||
|
||||
// Objects implement this interface to be notified with the transformed frame.
|
||||
|
|
|
@ -37,6 +37,14 @@ class MockTransformableAudioFrame : public TransformableAudioFrameInterface {
|
|||
GetDirection,
|
||||
(),
|
||||
(const, override));
|
||||
MOCK_METHOD(absl::optional<uint64_t>,
|
||||
AbsoluteCaptureTimestamp,
|
||||
(),
|
||||
(const, override));
|
||||
MOCK_METHOD(TransformableAudioFrameInterface::FrameType,
|
||||
Type,
|
||||
(),
|
||||
(const, override));
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
|
@ -50,6 +50,18 @@ class TransformableIncomingAudioFrame
|
|||
return header_.sequenceNumber;
|
||||
}
|
||||
|
||||
absl::optional<uint64_t> AbsoluteCaptureTimestamp() const override {
|
||||
// This could be extracted from received header extensions + extrapolation,
|
||||
// if required in future, eg for being able to re-send received frames.
|
||||
return absl::nullopt;
|
||||
}
|
||||
const RTPHeader& Header() const { return header_; }
|
||||
|
||||
FrameType Type() const override {
|
||||
return header_.extension.voiceActivity ? FrameType::kAudioFrameSpeech
|
||||
: FrameType::kAudioFrameCN;
|
||||
}
|
||||
|
||||
private:
|
||||
rtc::Buffer payload_;
|
||||
RTPHeader header_;
|
||||
|
@ -106,6 +118,6 @@ void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
|
|||
auto* transformed_frame =
|
||||
static_cast<TransformableIncomingAudioFrame*>(frame.get());
|
||||
receive_frame_callback_(transformed_frame->GetData(),
|
||||
transformed_frame->GetHeader());
|
||||
transformed_frame->Header());
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
|
|
@ -15,6 +15,36 @@
|
|||
namespace webrtc {
|
||||
namespace {
|
||||
|
||||
using IfaceFrameType = TransformableAudioFrameInterface::FrameType;
|
||||
|
||||
IfaceFrameType InternalFrameTypeToInterfaceFrameType(
|
||||
const AudioFrameType frame_type) {
|
||||
switch (frame_type) {
|
||||
case AudioFrameType::kEmptyFrame:
|
||||
return IfaceFrameType::kEmptyFrame;
|
||||
case AudioFrameType::kAudioFrameSpeech:
|
||||
return IfaceFrameType::kAudioFrameSpeech;
|
||||
case AudioFrameType::kAudioFrameCN:
|
||||
return IfaceFrameType::kAudioFrameCN;
|
||||
}
|
||||
RTC_DCHECK_NOTREACHED();
|
||||
return IfaceFrameType::kEmptyFrame;
|
||||
}
|
||||
|
||||
AudioFrameType InterfaceFrameTypeToInternalFrameType(
|
||||
const IfaceFrameType frame_type) {
|
||||
switch (frame_type) {
|
||||
case IfaceFrameType::kEmptyFrame:
|
||||
return AudioFrameType::kEmptyFrame;
|
||||
case IfaceFrameType::kAudioFrameSpeech:
|
||||
return AudioFrameType::kAudioFrameSpeech;
|
||||
case IfaceFrameType::kAudioFrameCN:
|
||||
return AudioFrameType::kAudioFrameCN;
|
||||
}
|
||||
RTC_DCHECK_NOTREACHED();
|
||||
return AudioFrameType::kEmptyFrame;
|
||||
}
|
||||
|
||||
class TransformableOutgoingAudioFrame
|
||||
: public TransformableAudioFrameInterface {
|
||||
public:
|
||||
|
@ -44,11 +74,11 @@ class TransformableOutgoingAudioFrame
|
|||
uint32_t GetStartTimestamp() const { return rtp_start_timestamp_; }
|
||||
uint32_t GetSsrc() const override { return ssrc_; }
|
||||
|
||||
AudioFrameType GetFrameType() const { return frame_type_; }
|
||||
uint8_t GetPayloadType() const override { return payload_type_; }
|
||||
int64_t GetAbsoluteCaptureTimestampMs() const {
|
||||
return absolute_capture_timestamp_ms_;
|
||||
IfaceFrameType Type() const override {
|
||||
return InternalFrameTypeToInterfaceFrameType(frame_type_);
|
||||
}
|
||||
|
||||
uint8_t GetPayloadType() const override { return payload_type_; }
|
||||
Direction GetDirection() const override { return Direction::kSender; }
|
||||
|
||||
// TODO(crbug.com/1453226): Remove once GetHeader() is removed from
|
||||
|
@ -67,6 +97,10 @@ class TransformableOutgoingAudioFrame
|
|||
rtp_timestamp_ = timestamp - rtp_start_timestamp_;
|
||||
}
|
||||
|
||||
absl::optional<uint64_t> AbsoluteCaptureTimestamp() const override {
|
||||
return absolute_capture_timestamp_ms_;
|
||||
}
|
||||
|
||||
private:
|
||||
AudioFrameType frame_type_;
|
||||
uint8_t payload_type_;
|
||||
|
@ -140,24 +174,21 @@ void ChannelSendFrameTransformerDelegate::SendFrame(
|
|||
return;
|
||||
auto* transformed_frame =
|
||||
static_cast<TransformableOutgoingAudioFrame*>(frame.get());
|
||||
send_frame_callback_(transformed_frame->GetFrameType(),
|
||||
transformed_frame->GetPayloadType(),
|
||||
transformed_frame->GetTimestamp() -
|
||||
transformed_frame->GetStartTimestamp(),
|
||||
transformed_frame->GetData(),
|
||||
transformed_frame->GetAbsoluteCaptureTimestampMs());
|
||||
send_frame_callback_(
|
||||
InterfaceFrameTypeToInternalFrameType(transformed_frame->Type()),
|
||||
transformed_frame->GetPayloadType(),
|
||||
transformed_frame->GetTimestamp() -
|
||||
transformed_frame->GetStartTimestamp(),
|
||||
transformed_frame->GetData(),
|
||||
*transformed_frame->AbsoluteCaptureTimestamp());
|
||||
}
|
||||
|
||||
std::unique_ptr<TransformableAudioFrameInterface> CloneSenderAudioFrame(
|
||||
TransformableAudioFrameInterface* original) {
|
||||
AudioFrameType audio_frame_type =
|
||||
original->GetHeader().extension.voiceActivity
|
||||
? AudioFrameType::kAudioFrameSpeech
|
||||
: AudioFrameType::kAudioFrameCN;
|
||||
|
||||
// TODO(crbug.com/webrtc/14949): Ensure the correct timestamps are passed.
|
||||
return std::make_unique<TransformableOutgoingAudioFrame>(
|
||||
audio_frame_type, original->GetPayloadType(), original->GetTimestamp(),
|
||||
InterfaceFrameTypeToInternalFrameType(original->Type()),
|
||||
original->GetPayloadType(), original->GetTimestamp(),
|
||||
/*rtp_start_timestamp=*/0u, original->GetData().data(),
|
||||
original->GetData().size(), original->GetTimestamp(),
|
||||
original->GetSsrc());
|
||||
|
|
Loading…
Reference in a new issue