frame transformer: expose payload type

spec PR: https://github.com/w3c/webrtc-encoded-transform/pull/117

Bug: webrtc:13077
Change-Id: I81d79201cea353c26ea840e92c0deec7c7253b8b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/229020
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34844}
This commit is contained in:
Philipp Hancke 2021-08-24 10:40:12 +02:00 committed by WebRTC LUCI CQ
parent 525dae03d6
commit 2ace42f084
7 changed files with 43 additions and 8 deletions

View File

@ -33,8 +33,11 @@ class TransformableFrameInterface {
// Copies `data` into the owned frame payload data.
virtual void SetData(rtc::ArrayView<const uint8_t> data) = 0;
virtual uint32_t GetTimestamp() const = 0;
// TODO(bugs.webrtc.org/13077) make pure virtual again after rolling into
// Chrome.
virtual uint8_t GetPayloadType() const { return 255; }
virtual uint32_t GetSsrc() const = 0;
virtual uint32_t GetTimestamp() const = 0;
};
class TransformableVideoFrameInterface : public TransformableFrameInterface {

View File

@ -33,8 +33,9 @@ class TransformableAudioFrame : public TransformableAudioFrameInterface {
payload_.SetData(data.data(), data.size());
}
uint32_t GetTimestamp() const override { return header_.timestamp; }
uint8_t GetPayloadType() const override { return header_.payloadType; }
uint32_t GetSsrc() const override { return ssrc_; }
uint32_t GetTimestamp() const override { return header_.timestamp; }
const RTPHeader& GetHeader() const override { return header_; }
private:

View File

@ -44,7 +44,7 @@ class TransformableAudioFrame : public TransformableFrameInterface {
uint32_t GetSsrc() const override { return ssrc_; }
AudioFrameType GetFrameType() const { return frame_type_; }
uint8_t GetPayloadType() const { return payload_type_; }
uint8_t GetPayloadType() const override { return payload_type_; }
int64_t GetAbsoluteCaptureTimestampMs() const {
return absolute_capture_timestamp_ms_;
}

View File

@ -40,7 +40,10 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
timestamp_(rtp_timestamp),
capture_time_ms_(encoded_image.capture_time_ms_),
expected_retransmission_time_ms_(expected_retransmission_time_ms),
ssrc_(ssrc) {}
ssrc_(ssrc) {
RTC_DCHECK_GE(payload_type_, 0);
RTC_DCHECK_LE(payload_type_, 127);
}
~TransformableVideoSenderFrame() override = default;
@ -67,7 +70,7 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
const VideoFrameMetadata& GetMetadata() const override { return metadata_; }
const RTPVideoHeader& GetHeader() const { return header_; }
int GetPayloadType() const { return payload_type_; }
uint8_t GetPayloadType() const override { return payload_type_; }
absl::optional<VideoCodecType> GetCodecType() const { return codec_type_; }
int64_t GetCaptureTimeMs() const { return capture_time_ms_; }
@ -80,7 +83,7 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
const RTPVideoHeader header_;
const VideoFrameMetadata metadata_;
const VideoFrameType frame_type_;
const int payload_type_;
const uint8_t payload_type_;
const absl::optional<VideoCodecType> codec_type_ = absl::nullopt;
const uint32_t timestamp_;
const int64_t capture_time_ms_;

View File

@ -1348,6 +1348,32 @@ TEST_F(RtpSenderVideoWithFrameTransformerTest,
kDefaultExpectedRetransmissionTimeMs);
}
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST_F(RtpSenderVideoWithFrameTransformerTest, ValidPayloadTypes) {
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
std::unique_ptr<RTPSenderVideo> rtp_sender_video =
CreateSenderWithFrameTransformer(mock_frame_transformer);
auto encoded_image = CreateDefaultEncodedImage();
RTPVideoHeader video_header;
EXPECT_TRUE(rtp_sender_video->SendEncodedImage(
0, kType, kTimestamp, *encoded_image, video_header,
kDefaultExpectedRetransmissionTimeMs));
EXPECT_TRUE(rtp_sender_video->SendEncodedImage(
127, kType, kTimestamp, *encoded_image, video_header,
kDefaultExpectedRetransmissionTimeMs));
EXPECT_DEATH(rtp_sender_video->SendEncodedImage(
-1, kType, kTimestamp, *encoded_image, video_header,
kDefaultExpectedRetransmissionTimeMs),
"");
EXPECT_DEATH(rtp_sender_video->SendEncodedImage(
128, kType, kTimestamp, *encoded_image, video_header,
kDefaultExpectedRetransmissionTimeMs),
"");
}
#endif
TEST_F(RtpSenderVideoWithFrameTransformerTest, OnTransformedFrameSendsVideo) {
rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();

View File

@ -20,8 +20,9 @@ class MockTransformableFrame : public TransformableFrameInterface {
public:
MOCK_METHOD(rtc::ArrayView<const uint8_t>, GetData, (), (const, override));
MOCK_METHOD(void, SetData, (rtc::ArrayView<const uint8_t>), (override));
MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override));
MOCK_METHOD(uint32_t, GetSsrc, (), (const, override));
MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
};
} // namespace webrtc

View File

@ -41,8 +41,9 @@ class TransformableVideoReceiverFrame
EncodedImageBuffer::Create(data.data(), data.size()));
}
uint32_t GetTimestamp() const override { return frame_->Timestamp(); }
uint8_t GetPayloadType() const override { return frame_->PayloadType(); }
uint32_t GetSsrc() const override { return ssrc_; }
uint32_t GetTimestamp() const override { return frame_->Timestamp(); }
bool IsKeyFrame() const override {
return frame_->FrameType() == VideoFrameType::kVideoFrameKey;