Skip to content

Commit 8fb41a3

Browse files
Tony HerreWebRTC LUCI CQ
authored andcommitted
Add Direction indicator to TransformableFrames
Currently the implementation of FrameTransformers uses distinct, incompatible types for recevied vs about-to-be-sent frames. This adds a flag in the interface so we can at least check that we are being given the correct type. crbug.com/1250638 tracks removing the need for this. Chrome will be updated after this to check the direction flag and provide a javascript error if the wrong type of frame is written into the encoded insertable streams writable stream, rather than crashing. Bug: chromium:1247260 Change-Id: I9cbb66962ea0718ed47c5e5dba19a8ff9635b0b1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232301 Reviewed-by: Harald Alvestrand <[email protected]> Commit-Queue: Tony Herre <[email protected]> Cr-Commit-Position: refs/heads/main@{#35100}
1 parent 6ee9734 commit 8fb41a3

5 files changed

+49
-21
lines changed

api/frame_transformer_interface.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ class TransformableFrameInterface {
3636
virtual uint8_t GetPayloadType() const = 0;
3737
virtual uint32_t GetSsrc() const = 0;
3838
virtual uint32_t GetTimestamp() const = 0;
39+
40+
enum class Direction {
41+
kUnknown,
42+
kReceiver,
43+
kSender,
44+
};
45+
// TODO(crbug.com/1250638): Remove this distinction between receiver and
46+
// sender frames to allow received frames to be directly re-transmitted on
47+
// other PeerConnectionss.
48+
virtual Direction GetDirection() const { return Direction::kUnknown; }
3949
};
4050

4151
class TransformableVideoFrameInterface : public TransformableFrameInterface {

audio/channel_receive_frame_transformer_delegate.cc

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
namespace webrtc {
1919
namespace {
2020

21-
class TransformableAudioFrame : public TransformableAudioFrameInterface {
21+
class TransformableIncomingAudioFrame
22+
: public TransformableAudioFrameInterface {
2223
public:
23-
TransformableAudioFrame(rtc::ArrayView<const uint8_t> payload,
24-
const RTPHeader& header,
25-
uint32_t ssrc)
24+
TransformableIncomingAudioFrame(rtc::ArrayView<const uint8_t> payload,
25+
const RTPHeader& header,
26+
uint32_t ssrc)
2627
: payload_(payload.data(), payload.size()),
2728
header_(header),
2829
ssrc_(ssrc) {}
29-
~TransformableAudioFrame() override = default;
30+
~TransformableIncomingAudioFrame() override = default;
3031
rtc::ArrayView<const uint8_t> GetData() const override { return payload_; }
3132

3233
void SetData(rtc::ArrayView<const uint8_t> data) override {
@@ -37,6 +38,7 @@ class TransformableAudioFrame : public TransformableAudioFrameInterface {
3738
uint32_t GetSsrc() const override { return ssrc_; }
3839
uint32_t GetTimestamp() const override { return header_.timestamp; }
3940
const RTPHeader& GetHeader() const override { return header_; }
41+
Direction GetDirection() const override { return Direction::kReceiver; }
4042

4143
private:
4244
rtc::Buffer payload_;
@@ -72,7 +74,7 @@ void ChannelReceiveFrameTransformerDelegate::Transform(
7274
uint32_t ssrc) {
7375
RTC_DCHECK_RUN_ON(&sequence_checker_);
7476
frame_transformer_->Transform(
75-
std::make_unique<TransformableAudioFrame>(packet, header, ssrc));
77+
std::make_unique<TransformableIncomingAudioFrame>(packet, header, ssrc));
7678
}
7779

7880
void ChannelReceiveFrameTransformerDelegate::OnTransformedFrame(
@@ -89,7 +91,10 @@ void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
8991
RTC_DCHECK_RUN_ON(&sequence_checker_);
9092
if (!receive_frame_callback_)
9193
return;
92-
auto* transformed_frame = static_cast<TransformableAudioFrame*>(frame.get());
94+
RTC_CHECK_EQ(frame->GetDirection(),
95+
TransformableFrameInterface::Direction::kReceiver);
96+
auto* transformed_frame =
97+
static_cast<TransformableIncomingAudioFrame*>(frame.get());
9398
receive_frame_callback_(transformed_frame->GetData(),
9499
transformed_frame->GetHeader());
95100
}

audio/channel_send_frame_transformer_delegate.cc

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@
1515
namespace webrtc {
1616
namespace {
1717

18-
class TransformableAudioFrame : public TransformableFrameInterface {
18+
class TransformableOutgoingAudioFrame : public TransformableFrameInterface {
1919
public:
20-
TransformableAudioFrame(AudioFrameType frame_type,
21-
uint8_t payload_type,
22-
uint32_t rtp_timestamp,
23-
uint32_t rtp_start_timestamp,
24-
const uint8_t* payload_data,
25-
size_t payload_size,
26-
int64_t absolute_capture_timestamp_ms,
27-
uint32_t ssrc)
20+
TransformableOutgoingAudioFrame(AudioFrameType frame_type,
21+
uint8_t payload_type,
22+
uint32_t rtp_timestamp,
23+
uint32_t rtp_start_timestamp,
24+
const uint8_t* payload_data,
25+
size_t payload_size,
26+
int64_t absolute_capture_timestamp_ms,
27+
uint32_t ssrc)
2828
: frame_type_(frame_type),
2929
payload_type_(payload_type),
3030
rtp_timestamp_(rtp_timestamp),
3131
rtp_start_timestamp_(rtp_start_timestamp),
3232
payload_(payload_data, payload_size),
3333
absolute_capture_timestamp_ms_(absolute_capture_timestamp_ms),
3434
ssrc_(ssrc) {}
35-
~TransformableAudioFrame() override = default;
35+
~TransformableOutgoingAudioFrame() override = default;
3636
rtc::ArrayView<const uint8_t> GetData() const override { return payload_; }
3737
void SetData(rtc::ArrayView<const uint8_t> data) override {
3838
payload_.SetData(data.data(), data.size());
@@ -48,6 +48,7 @@ class TransformableAudioFrame : public TransformableFrameInterface {
4848
int64_t GetAbsoluteCaptureTimestampMs() const {
4949
return absolute_capture_timestamp_ms_;
5050
}
51+
Direction GetDirection() const override { return Direction::kSender; }
5152

5253
private:
5354
AudioFrameType frame_type_;
@@ -90,9 +91,10 @@ void ChannelSendFrameTransformerDelegate::Transform(
9091
size_t payload_size,
9192
int64_t absolute_capture_timestamp_ms,
9293
uint32_t ssrc) {
93-
frame_transformer_->Transform(std::make_unique<TransformableAudioFrame>(
94-
frame_type, payload_type, rtp_timestamp, rtp_start_timestamp,
95-
payload_data, payload_size, absolute_capture_timestamp_ms, ssrc));
94+
frame_transformer_->Transform(
95+
std::make_unique<TransformableOutgoingAudioFrame>(
96+
frame_type, payload_type, rtp_timestamp, rtp_start_timestamp,
97+
payload_data, payload_size, absolute_capture_timestamp_ms, ssrc));
9698
}
9799

98100
void ChannelSendFrameTransformerDelegate::OnTransformedFrame(
@@ -111,9 +113,12 @@ void ChannelSendFrameTransformerDelegate::SendFrame(
111113
std::unique_ptr<TransformableFrameInterface> frame) const {
112114
MutexLock lock(&send_lock_);
113115
RTC_DCHECK_RUN_ON(encoder_queue_);
116+
RTC_CHECK_EQ(frame->GetDirection(),
117+
TransformableFrameInterface::Direction::kSender);
114118
if (!send_frame_callback_)
115119
return;
116-
auto* transformed_frame = static_cast<TransformableAudioFrame*>(frame.get());
120+
auto* transformed_frame =
121+
static_cast<TransformableOutgoingAudioFrame*>(frame.get());
117122
send_frame_callback_(transformed_frame->GetFrameType(),
118123
transformed_frame->GetPayloadType(),
119124
transformed_frame->GetTimestamp() -

modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
7878
return expected_retransmission_time_ms_;
7979
}
8080

81+
Direction GetDirection() const override { return Direction::kSender; }
82+
8183
private:
8284
rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data_;
8385
const RTPVideoHeader header_;
@@ -147,6 +149,8 @@ void RTPSenderVideoFrameTransformerDelegate::OnTransformedFrame(
147149
void RTPSenderVideoFrameTransformerDelegate::SendVideo(
148150
std::unique_ptr<TransformableFrameInterface> transformed_frame) const {
149151
RTC_CHECK(encoder_queue_->IsCurrent());
152+
RTC_CHECK_EQ(transformed_frame->GetDirection(),
153+
TransformableFrameInterface::Direction::kSender);
150154
MutexLock lock(&sender_lock_);
151155
if (!sender_)
152156
return;

video/rtp_video_stream_receiver_frame_transformer_delegate.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class TransformableVideoReceiverFrame
5959
return std::move(frame_);
6060
}
6161

62+
Direction GetDirection() const override { return Direction::kReceiver; }
63+
6264
private:
6365
std::unique_ptr<RtpFrameObject> frame_;
6466
const VideoFrameMetadata metadata_;
@@ -111,6 +113,8 @@ void RtpVideoStreamReceiverFrameTransformerDelegate::OnTransformedFrame(
111113
void RtpVideoStreamReceiverFrameTransformerDelegate::ManageFrame(
112114
std::unique_ptr<TransformableFrameInterface> frame) {
113115
RTC_DCHECK_RUN_ON(&network_sequence_checker_);
116+
RTC_CHECK_EQ(frame->GetDirection(),
117+
TransformableFrameInterface::Direction::kReceiver);
114118
if (!receiver_)
115119
return;
116120
auto transformed_frame = absl::WrapUnique(

0 commit comments

Comments
 (0)