Skip to content

Commit fc68f1f

Browse files
tonyherreWebRTC LUCI CQ
authored andcommitted
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 <[email protected]> Reviewed-by: Harald Alvestrand <[email protected]> Cr-Commit-Position: refs/heads/main@{#40344}
1 parent 589ee5a commit fc68f1f

File tree

4 files changed

+80
-17
lines changed

4 files changed

+80
-17
lines changed

api/frame_transformer_interface.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ class TransformableAudioFrameInterface : public TransformableFrameInterface {
8383
virtual const absl::optional<uint16_t> SequenceNumber() const {
8484
return absl::nullopt;
8585
}
86+
87+
// TODO(crbug.com/1456628): Change this to pure virtual after it
88+
// is implemented everywhere.
89+
virtual absl::optional<uint64_t> AbsoluteCaptureTimestamp() const {
90+
return absl::nullopt;
91+
}
92+
93+
enum class FrameType { kEmptyFrame, kAudioFrameSpeech, kAudioFrameCN };
94+
95+
// TODO(crbug.com/1456628): Change this to pure virtual after it
96+
// is implemented everywhere.
97+
virtual FrameType Type() const { return FrameType::kEmptyFrame; }
8698
};
8799

88100
// Objects implement this interface to be notified with the transformed frame.

api/test/mock_transformable_audio_frame.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class MockTransformableAudioFrame : public TransformableAudioFrameInterface {
3737
GetDirection,
3838
(),
3939
(const, override));
40+
MOCK_METHOD(absl::optional<uint64_t>,
41+
AbsoluteCaptureTimestamp,
42+
(),
43+
(const, override));
44+
MOCK_METHOD(TransformableAudioFrameInterface::FrameType,
45+
Type,
46+
(),
47+
(const, override));
4048
};
4149

4250
} // namespace webrtc

audio/channel_receive_frame_transformer_delegate.cc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ class TransformableIncomingAudioFrame
5050
return header_.sequenceNumber;
5151
}
5252

53+
absl::optional<uint64_t> AbsoluteCaptureTimestamp() const override {
54+
// This could be extracted from received header extensions + extrapolation,
55+
// if required in future, eg for being able to re-send received frames.
56+
return absl::nullopt;
57+
}
58+
const RTPHeader& Header() const { return header_; }
59+
60+
FrameType Type() const override {
61+
return header_.extension.voiceActivity ? FrameType::kAudioFrameSpeech
62+
: FrameType::kAudioFrameCN;
63+
}
64+
5365
private:
5466
rtc::Buffer payload_;
5567
RTPHeader header_;
@@ -106,6 +118,6 @@ void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
106118
auto* transformed_frame =
107119
static_cast<TransformableIncomingAudioFrame*>(frame.get());
108120
receive_frame_callback_(transformed_frame->GetData(),
109-
transformed_frame->GetHeader());
121+
transformed_frame->Header());
110122
}
111123
} // namespace webrtc

audio/channel_send_frame_transformer_delegate.cc

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,36 @@
1515
namespace webrtc {
1616
namespace {
1717

18+
using IfaceFrameType = TransformableAudioFrameInterface::FrameType;
19+
20+
IfaceFrameType InternalFrameTypeToInterfaceFrameType(
21+
const AudioFrameType frame_type) {
22+
switch (frame_type) {
23+
case AudioFrameType::kEmptyFrame:
24+
return IfaceFrameType::kEmptyFrame;
25+
case AudioFrameType::kAudioFrameSpeech:
26+
return IfaceFrameType::kAudioFrameSpeech;
27+
case AudioFrameType::kAudioFrameCN:
28+
return IfaceFrameType::kAudioFrameCN;
29+
}
30+
RTC_DCHECK_NOTREACHED();
31+
return IfaceFrameType::kEmptyFrame;
32+
}
33+
34+
AudioFrameType InterfaceFrameTypeToInternalFrameType(
35+
const IfaceFrameType frame_type) {
36+
switch (frame_type) {
37+
case IfaceFrameType::kEmptyFrame:
38+
return AudioFrameType::kEmptyFrame;
39+
case IfaceFrameType::kAudioFrameSpeech:
40+
return AudioFrameType::kAudioFrameSpeech;
41+
case IfaceFrameType::kAudioFrameCN:
42+
return AudioFrameType::kAudioFrameCN;
43+
}
44+
RTC_DCHECK_NOTREACHED();
45+
return AudioFrameType::kEmptyFrame;
46+
}
47+
1848
class TransformableOutgoingAudioFrame
1949
: public TransformableAudioFrameInterface {
2050
public:
@@ -44,11 +74,11 @@ class TransformableOutgoingAudioFrame
4474
uint32_t GetStartTimestamp() const { return rtp_start_timestamp_; }
4575
uint32_t GetSsrc() const override { return ssrc_; }
4676

47-
AudioFrameType GetFrameType() const { return frame_type_; }
48-
uint8_t GetPayloadType() const override { return payload_type_; }
49-
int64_t GetAbsoluteCaptureTimestampMs() const {
50-
return absolute_capture_timestamp_ms_;
77+
IfaceFrameType Type() const override {
78+
return InternalFrameTypeToInterfaceFrameType(frame_type_);
5179
}
80+
81+
uint8_t GetPayloadType() const override { return payload_type_; }
5282
Direction GetDirection() const override { return Direction::kSender; }
5383

5484
// TODO(crbug.com/1453226): Remove once GetHeader() is removed from
@@ -67,6 +97,10 @@ class TransformableOutgoingAudioFrame
6797
rtp_timestamp_ = timestamp - rtp_start_timestamp_;
6898
}
6999

100+
absl::optional<uint64_t> AbsoluteCaptureTimestamp() const override {
101+
return absolute_capture_timestamp_ms_;
102+
}
103+
70104
private:
71105
AudioFrameType frame_type_;
72106
uint8_t payload_type_;
@@ -140,24 +174,21 @@ void ChannelSendFrameTransformerDelegate::SendFrame(
140174
return;
141175
auto* transformed_frame =
142176
static_cast<TransformableOutgoingAudioFrame*>(frame.get());
143-
send_frame_callback_(transformed_frame->GetFrameType(),
144-
transformed_frame->GetPayloadType(),
145-
transformed_frame->GetTimestamp() -
146-
transformed_frame->GetStartTimestamp(),
147-
transformed_frame->GetData(),
148-
transformed_frame->GetAbsoluteCaptureTimestampMs());
177+
send_frame_callback_(
178+
InterfaceFrameTypeToInternalFrameType(transformed_frame->Type()),
179+
transformed_frame->GetPayloadType(),
180+
transformed_frame->GetTimestamp() -
181+
transformed_frame->GetStartTimestamp(),
182+
transformed_frame->GetData(),
183+
*transformed_frame->AbsoluteCaptureTimestamp());
149184
}
150185

151186
std::unique_ptr<TransformableAudioFrameInterface> CloneSenderAudioFrame(
152187
TransformableAudioFrameInterface* original) {
153-
AudioFrameType audio_frame_type =
154-
original->GetHeader().extension.voiceActivity
155-
? AudioFrameType::kAudioFrameSpeech
156-
: AudioFrameType::kAudioFrameCN;
157-
158188
// TODO(crbug.com/webrtc/14949): Ensure the correct timestamps are passed.
159189
return std::make_unique<TransformableOutgoingAudioFrame>(
160-
audio_frame_type, original->GetPayloadType(), original->GetTimestamp(),
190+
InterfaceFrameTypeToInternalFrameType(original->Type()),
191+
original->GetPayloadType(), original->GetTimestamp(),
161192
/*rtp_start_timestamp=*/0u, original->GetData().data(),
162193
original->GetData().size(), original->GetTimestamp(),
163194
original->GetSsrc());

0 commit comments

Comments
 (0)