Skip to content

Commit 8d8c0b4

Browse files
Tony HerreWebRTC LUCI CQ
authored andcommitted
[Merge to 95] 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. (cherry picked from commit 8fb41a3) Bug: chromium:1247260 Change-Id: I9cbb66962ea0718ed47c5e5dba19a8ff9635b0b1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232301 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Tony Herre <toprice@chromium.org> Cr-Original-Commit-Position: refs/heads/main@{#35100} Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/233941 Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/branch-heads/4638@{#2} Cr-Branched-From: fb50179-refs/heads/main@{#34960}
1 parent 494c787 commit 8d8c0b4

File tree

5 files changed

+49
-21
lines changed

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)