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) { ...@@ -539,6 +539,8 @@ void MediaStreamVideoTrack::SetEnabled(bool enabled) {
frame_deliverer_->SetEnabled(enabled, maybe_await_key_frame); frame_deliverer_->SetEnabled(enabled, maybe_await_key_frame);
for (auto* sink : sinks_) for (auto* sink : sinks_)
sink->OnEnabledChanged(enabled); sink->OnEnabledChanged(enabled);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnEnabledChanged(enabled);
} }
size_t MediaStreamVideoTrack::CountEncodedSinks() const { size_t MediaStreamVideoTrack::CountEncodedSinks() const {
...@@ -551,6 +553,8 @@ void MediaStreamVideoTrack::SetContentHint( ...@@ -551,6 +553,8 @@ void MediaStreamVideoTrack::SetContentHint(
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
for (auto* sink : sinks_) for (auto* sink : sinks_)
sink->OnContentHintChanged(content_hint); sink->OnContentHintChanged(content_hint);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnContentHintChanged(content_hint);
} }
void MediaStreamVideoTrack::StopAndNotify(base::OnceClosure callback) { void MediaStreamVideoTrack::StopAndNotify(base::OnceClosure callback) {
...@@ -611,6 +615,8 @@ void MediaStreamVideoTrack::OnReadyStateChanged( ...@@ -611,6 +615,8 @@ void MediaStreamVideoTrack::OnReadyStateChanged(
DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
for (auto* sink : sinks_) for (auto* sink : sinks_)
sink->OnReadyStateChanged(state); sink->OnReadyStateChanged(state);
for (auto* encoded_sink : encoded_sinks_)
encoded_sink->OnReadyStateChanged(state);
} }
void MediaStreamVideoTrack::SetTrackAdapterSettings( void MediaStreamVideoTrack::SetTrackAdapterSettings(
......
...@@ -31,6 +31,9 @@ using ::testing::InSequence; ...@@ -31,6 +31,9 @@ using ::testing::InSequence;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::Mock; using ::testing::Mock;
using ::testing::Return; using ::testing::Return;
using ::testing::Values;
using ContentHintType = WebMediaStreamTrack::ContentHintType;
const uint8_t kBlackValue = 0x00; const uint8_t kBlackValue = 0x00;
const uint8_t kColorValue = 0xAB; const uint8_t kColorValue = 0xAB;
...@@ -41,7 +44,8 @@ ACTION_P(RunClosure, closure) { ...@@ -41,7 +44,8 @@ ACTION_P(RunClosure, closure) {
closure.Run(); closure.Run();
} }
class MediaStreamVideoTrackTest : public testing::Test { class MediaStreamVideoTrackTest
: public testing::TestWithParam<ContentHintType> {
public: public:
MediaStreamVideoTrackTest() : mock_source_(nullptr), source_started_(false) {} MediaStreamVideoTrackTest() : mock_source_(nullptr), source_started_(false) {}
...@@ -385,6 +389,16 @@ TEST_F(MediaStreamVideoTrackTest, DeliverFramesAndGetSettings) { ...@@ -385,6 +389,16 @@ TEST_F(MediaStreamVideoTrackTest, DeliverFramesAndGetSettings) {
sink.DisconnectFromTrack(); 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 { class MediaStreamVideoTrackEncodedTest : public MediaStreamVideoTrackTest {
public: public:
void InitializeSource() override { void InitializeSource() override {
...@@ -466,6 +480,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) { ...@@ -466,6 +480,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
// Key frame when disabled -> shouldn't get dispatched // Key frame when disabled -> shouldn't get dispatched
MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(false); MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(false);
EXPECT_FALSE(sink.enabled());
{ {
EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0); EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0);
mock_source()->DeliverEncodedVideoFrame(key_frame); mock_source()->DeliverEncodedVideoFrame(key_frame);
...@@ -476,6 +491,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) { ...@@ -476,6 +491,7 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
// appears. // appears.
EXPECT_CALL(*mock_source(), OnRequestRefreshFrame); EXPECT_CALL(*mock_source(), OnRequestRefreshFrame);
MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(true); MediaStreamVideoTrack::GetVideoTrack(track)->SetEnabled(true);
EXPECT_TRUE(sink.enabled());
{ {
EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0); EXPECT_CALL(sink, OnEncodedVideoFrame).Times(0);
mock_source()->DeliverEncodedVideoFrame(delta_frame); mock_source()->DeliverEncodedVideoFrame(delta_frame);
...@@ -490,5 +506,39 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) { ...@@ -490,5 +506,39 @@ TEST_F(MediaStreamVideoTrackEncodedTest, SupportsEncodedDisableEnable) {
sink.DisconnectEncodedFromTrack(); 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 media_stream_video_track_test
} // namespace blink } // namespace blink
...@@ -55,4 +55,9 @@ void MockMediaStreamVideoSink::OnEnabledChanged(bool enabled) { ...@@ -55,4 +55,9 @@ void MockMediaStreamVideoSink::OnEnabledChanged(bool enabled) {
enabled_ = enabled; enabled_ = enabled;
} }
void MockMediaStreamVideoSink::OnContentHintChanged(
WebMediaStreamTrack::ContentHintType content_hint) {
content_hint_ = content_hint;
}
} // namespace blink } // namespace blink
...@@ -38,6 +38,8 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink { ...@@ -38,6 +38,8 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
void OnReadyStateChanged(WebMediaStreamSource::ReadyState state) override; void OnReadyStateChanged(WebMediaStreamSource::ReadyState state) override;
void OnEnabledChanged(bool enabled) override; void OnEnabledChanged(bool enabled) override;
void OnContentHintChanged(
WebMediaStreamTrack::ContentHintType content_hint) override;
// Triggered when OnVideoFrame(scoped_refptr<media::VideoFrame> frame) // Triggered when OnVideoFrame(scoped_refptr<media::VideoFrame> frame)
// is called. // is called.
...@@ -54,6 +56,9 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink { ...@@ -54,6 +56,9 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
bool enabled() const { return enabled_; } bool enabled() const { return enabled_; }
WebMediaStreamSource::ReadyState state() const { return state_; } WebMediaStreamSource::ReadyState state() const { return state_; }
base::Optional<WebMediaStreamTrack::ContentHintType> content_hint() const {
return content_hint_;
}
private: private:
void DeliverVideoFrame(scoped_refptr<media::VideoFrame> frame, void DeliverVideoFrame(scoped_refptr<media::VideoFrame> frame,
...@@ -67,6 +72,7 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink { ...@@ -67,6 +72,7 @@ class MockMediaStreamVideoSink : public MediaStreamVideoSink {
WebMediaStreamSource::ReadyState state_; WebMediaStreamSource::ReadyState state_;
gfx::Size frame_size_; gfx::Size frame_size_;
scoped_refptr<media::VideoFrame> last_frame_; scoped_refptr<media::VideoFrame> last_frame_;
base::Optional<WebMediaStreamTrack::ContentHintType> content_hint_;
base::WeakPtrFactory<MockMediaStreamVideoSink> weak_factory_{this}; 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