Commit 49171163 authored by Markus Handell's avatar Markus Handell Committed by Commit Bot

MediaStreamVideoTrack: fix state propagation for encoded sinks.

This change fixes omitted propagation of changes in
- ready state
- enabled state
- content hint state
to encoded sinks.

Bug: 1013590
Change-Id: I97f73bf2b2732b2411779ea7a0d7a56c2fccef57
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1970553
Commit-Queue: Markus Handell <handellm@google.com>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726554}
parent a503deb1
......@@ -539,6 +539,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) {
frame_deliverer_->SetEnabled(enabled, maybe_await_key_frame);
for (auto* sink : sinks_)
sink->OnEnabledChanged(enabled);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnEnabledChanged(enabled);
}
size_t MediaStreamVideoTrack::CountEncodedSinks() const {
......@@ -551,6 +553,8 @@ void MediaStreamVideoTrack::SetContentHint(
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
for (auto* sink : sinks_)
sink->OnContentHintChanged(content_hint);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnContentHintChanged(content_hint);
}
void MediaStreamVideoTrack::StopAndNotify(base::OnceClosure callback) {
......@@ -611,6 +615,8 @@ void MediaStreamVideoTrack::OnReadyStateChanged(
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
for (auto* sink : sinks_)
sink->OnReadyStateChanged(state);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnReadyStateChanged(state);
}
void MediaStreamVideoTrack::SetTrackAdapterSettings(
......
......@@ -31,6 +31,9 @@ using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::Mock;
using ::testing::Return;
using ::testing::Values;
using ContentHintType = WebMediaStreamTrack::ContentHintType;
const uint8_t kBlackValue = 0x00;
const uint8_t kColorValue = 0xAB;
......@@ -41,7 +44,8 @@ ACTION_P(RunClosure, closure) {
closure.Run();
}
class MediaStreamVideoTrackTest : public testing::Test {
class MediaStreamVideoTrackTest
: public testing::TestWithParam<ContentHintType> {
public:
MediaStreamVideoTrackTest() : mock_source_(nullptr), source_started_(false) {}
......@@ -385,6 +389,16 @@ TEST_F(MediaStreamVideoTrackTest, DeliverFramesAndGetSettings) {
sink.DisconnectFromTrack();
}
TEST_P(MediaStreamVideoTrackTest, PropagatesContentHintType) {
InitializeSource();
MockMediaStreamVideoSink sink;
WebMediaStreamTrack track = CreateTrack();
sink.ConnectToTrack(track);
MediaStreamVideoTrack::GetVideoTrack(track)->SetContentHint(GetParam());
EXPECT_EQ(sink.content_hint(), GetParam());
sink.DisconnectFromTrack();
}
class MediaStreamVideoTrackEncodedTest : public MediaStreamVideoTrackTest {
public:
void InitializeSource() override {
......@@ -466,6 +480,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
// Key frame when disabled -> shouldn't get dispatched
MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(false);
EXPECT_FALSE(sink.enabled());
{
EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0);
mock_source()->DeliverEncodedVideoFrame(key_frame);
......@@ -476,6 +491,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
// appears.
EXPECT_CALL(*mock_source(), OnRequestRefreshFrame);
MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(true);
EXPECT_TRUE(sink.enabled());
{
EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0);
mock_source()->DeliverEncodedVideoFrame(delta_frame);
......@@ -490,5 +506,39 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
sink.DisconnectEncodedFromTrack();
}
TEST_P(MediaStreamVideoTrackEncodedTest, PropagatesContentHintType) {
InitializeSource();
MockMediaStreamVideoSink sink;
WebMediaStreamTrack track = CreateTrack();
sink.ConnectEncodedToTrack(track);
MediaStreamVideoTrack::GetVideoTrack(track)->SetContentHint(GetParam());
EXPECT_EQ(sink.content_hint(), GetParam());
sink.DisconnectEncodedFromTrack();
}
TEST_F(MediaStreamVideoTrackEncodedTest, SourceStopped) {
InitializeSource();
MockMediaStreamVideoSink sink;
WebMediaStreamTrack track = CreateTrack();
sink.ConnectEncodedToTrack(track);
EXPECT_EQ(WebMediaStreamSource::kReadyStateLive, sink.state());
mock_source()->StopSource();
EXPECT_EQ(WebMediaStreamSource::kReadyStateEnded, sink.state());
sink.DisconnectEncodedFromTrack();
}
INSTANTIATE_TEST_SUITE_P(,
MediaStreamVideoTrackTest,
Values(ContentHintType::kVideoMotion,
ContentHintType::kVideoDetail,
ContentHintType::kVideoText));
INSTANTIATE_TEST_SUITE_P(,
MediaStreamVideoTrackEncodedTest,
Values(ContentHintType::kVideoMotion,
ContentHintType::kVideoDetail,
ContentHintType::kVideoText));
} // namespace media_stream_video_track_test
} // namespace blink
......@@ -55,4 +55,9 @@ void MockMediaStreamVideoSink::OnEnabledChanged(bool enabled) {
enabled_ = enabled;
}
void MockMediaStreamVideoSink::OnContentHintChanged(
WebMediaStreamTrack::ContentHintType content_hint) {
content_hint_ = content_hint;
}
} // namespace blink
......@@ -38,6 +38,8 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
void OnReadyStateChanged(WebMediaStreamSource::ReadyState state) override;
void OnEnabledChanged(bool enabled) override;
void OnContentHintChanged(
WebMediaStreamTrack::ContentHintType content_hint) override;
// Triggered when OnVideoFrame(scoped_refptr<media::VideoFrame> frame)
// is called.
......@@ -54,6 +56,9 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
bool enabled() const { return enabled_; }
WebMediaStreamSource::ReadyState state() const { return state_; }
base::Optional<WebMediaStreamTrack::ContentHintType> content_hint() const {
return content_hint_;
}
private:
void DeliverVideoFrame(scoped_refptr<media::VideoFrame> frame,
......@@ -67,6 +72,7 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
WebMediaStreamSource::ReadyState state_;
gfx::Size frame_size_;
scoped_refptr<media::VideoFrame> last_frame_;
base::Optional<WebMediaStreamTrack::ContentHintType> content_hint_;
base::WeakPtrFactory<MockMediaStreamVideoSink> weak_factory_{this};
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment