mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
Expose video mimeType for insertable streams
which allows determining what codec (data format) is used. Chromium CL: https://chromium-review.googlesource.com/c/chromium/src/+/4941907 Split from https://webrtc-review.googlesource.com/c/src/+/318283 to reduce CL size and avoid audio woes. BUG=webrtc:15579 Change-Id: I404107af526df3009c16d2a6148784fe87dfa807 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/323721 Reviewed-by: Tony Herre <herre@google.com> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Philipp Hancke <phancke@microsoft.com> Cr-Commit-Position: refs/heads/main@{#41007}
This commit is contained in:
parent
af0448ceda
commit
0bace22a0b
7 changed files with 33 additions and 1 deletions
|
@ -12,6 +12,7 @@
|
||||||
#define API_FRAME_TRANSFORMER_INTERFACE_H_
|
#define API_FRAME_TRANSFORMER_INTERFACE_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "api/scoped_refptr.h"
|
#include "api/scoped_refptr.h"
|
||||||
|
@ -53,6 +54,11 @@ class TransformableFrameInterface {
|
||||||
// sender frames to allow received frames to be directly re-transmitted on
|
// sender frames to allow received frames to be directly re-transmitted on
|
||||||
// other PeerConnectionss.
|
// other PeerConnectionss.
|
||||||
virtual Direction GetDirection() const { return Direction::kUnknown; }
|
virtual Direction GetDirection() const { return Direction::kUnknown; }
|
||||||
|
virtual std::string GetMimeType() const {
|
||||||
|
// TODO(bugs.webrtc.org/15579): Change this to pure virtual after it
|
||||||
|
// is implemented everywhere.
|
||||||
|
return "unknown/unknown";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TransformableVideoFrameInterface : public TransformableFrameInterface {
|
class TransformableVideoFrameInterface : public TransformableFrameInterface {
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#ifndef API_TEST_MOCK_TRANSFORMABLE_VIDEO_FRAME_H_
|
#ifndef API_TEST_MOCK_TRANSFORMABLE_VIDEO_FRAME_H_
|
||||||
#define API_TEST_MOCK_TRANSFORMABLE_VIDEO_FRAME_H_
|
#define API_TEST_MOCK_TRANSFORMABLE_VIDEO_FRAME_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "api/frame_transformer_interface.h"
|
#include "api/frame_transformer_interface.h"
|
||||||
|
@ -36,6 +37,7 @@ class MockTransformableVideoFrame
|
||||||
GetDirection,
|
GetDirection,
|
||||||
(),
|
(),
|
||||||
(const, override));
|
(const, override));
|
||||||
|
MOCK_METHOD(std::string, GetMimeType, (), (const, override));
|
||||||
MOCK_METHOD(VideoFrameMetadata, Metadata, (), (const, override));
|
MOCK_METHOD(VideoFrameMetadata, Metadata, (), (const, override));
|
||||||
MOCK_METHOD(absl::optional<Timestamp>,
|
MOCK_METHOD(absl::optional<Timestamp>,
|
||||||
GetCaptureTimeIdentifier,
|
GetCaptureTimeIdentifier,
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h"
|
#include "modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -97,6 +98,13 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
Direction GetDirection() const override { return Direction::kSender; }
|
Direction GetDirection() const override { return Direction::kSender; }
|
||||||
|
std::string GetMimeType() const override {
|
||||||
|
if (!codec_type_.has_value()) {
|
||||||
|
return "video/x-unknown";
|
||||||
|
}
|
||||||
|
std::string mime_type = "video/";
|
||||||
|
return mime_type + CodecTypeToPayloadString(*codec_type_);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data_;
|
rtc::scoped_refptr<EncodedImageBufferInterface> encoded_data_;
|
||||||
|
|
|
@ -74,9 +74,15 @@ class RtpSenderVideoFrameTransformerDelegateTest : public ::testing::Test {
|
||||||
frame_to_transform) {
|
frame_to_transform) {
|
||||||
frame = std::move(frame_to_transform);
|
frame = std::move(frame_to_transform);
|
||||||
});
|
});
|
||||||
|
RTPVideoHeader rtp_header;
|
||||||
|
|
||||||
|
VideoFrameMetadata metadata;
|
||||||
|
metadata.SetCodec(VideoCodecType::kVideoCodecVP8);
|
||||||
|
metadata.SetRTPVideoHeaderCodecSpecifics(RTPVideoHeaderVP8());
|
||||||
|
|
||||||
delegate->TransformFrame(
|
delegate->TransformFrame(
|
||||||
/*payload_type=*/1, VideoCodecType::kVideoCodecVP8, /*rtp_timestamp=*/2,
|
/*payload_type=*/1, VideoCodecType::kVideoCodecVP8, /*rtp_timestamp=*/2,
|
||||||
encoded_image, RTPVideoHeader(),
|
encoded_image, RTPVideoHeader::FromMetadata(metadata),
|
||||||
/*expected_retransmission_time=*/TimeDelta::PlusInfinity());
|
/*expected_retransmission_time=*/TimeDelta::PlusInfinity());
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
@ -135,6 +141,7 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest,
|
||||||
std::unique_ptr<TransformableFrameInterface> frame =
|
std::unique_ptr<TransformableFrameInterface> frame =
|
||||||
GetTransformableFrame(delegate);
|
GetTransformableFrame(delegate);
|
||||||
ASSERT_TRUE(frame);
|
ASSERT_TRUE(frame);
|
||||||
|
EXPECT_STRCASEEQ("video/VP8", frame->GetMimeType().c_str());
|
||||||
|
|
||||||
rtc::Event event;
|
rtc::Event event;
|
||||||
EXPECT_CALL(test_sender_, SendVideo).WillOnce(WithoutArgs([&] {
|
EXPECT_CALL(test_sender_, SendVideo).WillOnce(WithoutArgs([&] {
|
||||||
|
@ -162,6 +169,7 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneSenderVideoFrame) {
|
||||||
|
|
||||||
EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame());
|
EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame());
|
||||||
EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType());
|
EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType());
|
||||||
|
EXPECT_EQ(clone->GetMimeType(), video_frame.GetMimeType());
|
||||||
EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc());
|
EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc());
|
||||||
EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp());
|
EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp());
|
||||||
EXPECT_EQ(clone->Metadata(), video_frame.Metadata());
|
EXPECT_EQ(clone->Metadata(), video_frame.Metadata());
|
||||||
|
@ -182,6 +190,7 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneKeyFrame) {
|
||||||
|
|
||||||
EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame());
|
EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame());
|
||||||
EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType());
|
EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType());
|
||||||
|
EXPECT_EQ(clone->GetMimeType(), video_frame.GetMimeType());
|
||||||
EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc());
|
EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc());
|
||||||
EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp());
|
EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp());
|
||||||
EXPECT_EQ(clone->Metadata(), video_frame.Metadata());
|
EXPECT_EQ(clone->Metadata(), video_frame.Metadata());
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.h"
|
#include "modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -75,6 +76,10 @@ class TransformableVideoReceiverFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
Direction GetDirection() const override { return Direction::kReceiver; }
|
Direction GetDirection() const override { return Direction::kReceiver; }
|
||||||
|
std::string GetMimeType() const override {
|
||||||
|
std::string mime_type = "video/";
|
||||||
|
return mime_type + CodecTypeToPayloadString(frame_->codec_type());
|
||||||
|
}
|
||||||
|
|
||||||
const RtpVideoFrameReceiver* Receiver() { return receiver_; }
|
const RtpVideoFrameReceiver* Receiver() { return receiver_; }
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,7 @@ TEST(RtpVideoStreamReceiverFrameTransformerDelegateTest,
|
||||||
ON_CALL(*mock_frame_transformer, Transform)
|
ON_CALL(*mock_frame_transformer, Transform)
|
||||||
.WillByDefault(
|
.WillByDefault(
|
||||||
[&callback](std::unique_ptr<TransformableFrameInterface> frame) {
|
[&callback](std::unique_ptr<TransformableFrameInterface> frame) {
|
||||||
|
EXPECT_STRCASEEQ("video/Generic", frame->GetMimeType().c_str());
|
||||||
callback->OnTransformedFrame(std::move(frame));
|
callback->OnTransformedFrame(std::move(frame));
|
||||||
});
|
});
|
||||||
delegate->TransformFrame(CreateRtpFrameObject(RTPVideoHeader(), csrcs));
|
delegate->TransformFrame(CreateRtpFrameObject(RTPVideoHeader(), csrcs));
|
||||||
|
|
|
@ -33,6 +33,7 @@ class MockTransformableAudioFrame : public TransformableAudioFrameInterface {
|
||||||
MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
|
MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override));
|
||||||
MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override));
|
MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override));
|
||||||
MOCK_METHOD(Direction, GetDirection, (), (const, override));
|
MOCK_METHOD(Direction, GetDirection, (), (const, override));
|
||||||
|
MOCK_METHOD(std::string, GetMimeType, (), (const, override));
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
Loading…
Reference in a new issue