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:
Tony Herre 2023-06-22 13:32:24 +00:00 committed by WebRTC LUCI CQ
parent 589ee5ae62
commit fc68f1f7d9
4 changed files with 80 additions and 17 deletions

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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());