Index: content/renderer/media/media_stream_video_capturer_source_unittest.cc |
diff --git a/content/renderer/media/media_stream_video_capturer_source_unittest.cc b/content/renderer/media/media_stream_video_capturer_source_unittest.cc |
index bdae3481b36f5b0c3e77428376dcffc2bbbc142e..b33d5e2cb725a0c3d04a722eaac331d22f475710 100644 |
--- a/content/renderer/media/media_stream_video_capturer_source_unittest.cc |
+++ b/content/renderer/media/media_stream_video_capturer_source_unittest.cc |
@@ -31,6 +31,8 @@ using ::testing::WithArgs; |
namespace content { |
+namespace { |
+ |
class MockVideoCapturerSource : public media::VideoCapturerSource { |
public: |
MockVideoCapturerSource() { |
@@ -64,13 +66,51 @@ class MockVideoCapturerSource : public media::VideoCapturerSource { |
} |
}; |
+class FakeMediaStreamVideoSink : public MediaStreamVideoSink { |
+ public: |
+ FakeMediaStreamVideoSink(base::TimeTicks* capture_time, |
+ media::VideoFrameMetadata* metadata, |
+ base::Closure got_frame_cb) |
+ : capture_time_(capture_time), |
+ metadata_(metadata), |
+ got_frame_cb_(got_frame_cb) {} |
+ |
+ void ConnectToTrack(const blink::WebMediaStreamTrack& track) { |
+ MediaStreamVideoSink::ConnectToTrack( |
+ track, |
+ base::Bind(&FakeMediaStreamVideoSink::OnVideoFrame, |
+ base::Unretained(this)), |
+ true); |
+ } |
+ |
+ void DisconnectFromTrack() { MediaStreamVideoSink::DisconnectFromTrack(); } |
+ |
+ void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, |
+ base::TimeTicks capture_time) { |
+ *capture_time_ = capture_time; |
+ metadata_->Clear(); |
+ metadata_->MergeMetadataFrom(frame->metadata()); |
+ base::ResetAndReturn(&got_frame_cb_).Run(); |
+ } |
+ |
+ private: |
+ base::TimeTicks* const capture_time_; |
+ media::VideoFrameMetadata* const metadata_; |
+ base::Closure got_frame_cb_; |
+}; |
+ |
+} // namespace |
+ |
class MediaStreamVideoCapturerSourceTest : public testing::Test { |
public: |
MediaStreamVideoCapturerSourceTest() |
: child_process_(new ChildProcess()), |
source_(nullptr), |
delegate_(nullptr), |
- source_stopped_(false) {} |
+ source_stopped_(false) { |
+ scoped_feature_list_.InitAndDisableFeature( |
+ features::kMediaStreamOldVideoConstraints); |
+ } |
void TearDown() override { |
webkit_source_.reset(); |
@@ -150,15 +190,197 @@ class MediaStreamVideoCapturerSourceTest : public testing::Test { |
blink::WebString webkit_source_id_; |
bool source_stopped_; |
MockConstraintFactory constraint_factory_; |
+ base::test::ScopedFeatureList scoped_feature_list_; |
+}; |
+ |
+TEST_F(MediaStreamVideoCapturerSourceTest, StartAndStop) { |
+ std::unique_ptr<MockVideoCapturerSource> delegate( |
+ new MockVideoCapturerSource()); |
+ delegate_ = delegate.get(); |
+ EXPECT_CALL(*delegate_, GetPreferredFormats()); |
+ source_ = new MediaStreamVideoCapturerSource( |
+ base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped, |
+ base::Unretained(this)), |
+ std::move(delegate)); |
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
+ blink::WebMediaStreamSource::TypeVideo, |
+ blink::WebString::fromASCII("dummy_source_name"), |
+ false /* remote */); |
+ webkit_source_.setExtraData(source_); |
+ webkit_source_id_ = webkit_source_.id(); |
+ |
+ InSequence s; |
+ EXPECT_CALL(mock_delegate(), StartCapture(_, _, _)); |
+ blink::WebMediaStreamTrack track = StartSource( |
+ VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ OnStarted(true); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
+ webkit_source_.getReadyState()); |
+ |
+ EXPECT_FALSE(source_stopped_); |
+ |
+ EXPECT_CALL(mock_delegate(), StopCapture()); |
+ OnStarted(false); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, |
+ webkit_source_.getReadyState()); |
+ // Verify that MediaStreamSource::SourceStoppedCallback has been triggered. |
+ EXPECT_TRUE(source_stopped_); |
+} |
+ |
+TEST_F(MediaStreamVideoCapturerSourceTest, CaptureTimeAndMetadataPlumbing) { |
+ std::unique_ptr<MockVideoCapturerSource> delegate( |
+ new MockVideoCapturerSource()); |
+ delegate_ = delegate.get(); |
+ EXPECT_CALL(*delegate_, GetPreferredFormats()); |
+ source_ = new MediaStreamVideoCapturerSource( |
+ base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped, |
+ base::Unretained(this)), |
+ std::move(delegate)); |
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
+ blink::WebMediaStreamSource::TypeVideo, |
+ blink::WebString::fromASCII("dummy_source_name"), |
+ false /* remote */); |
+ webkit_source_.setExtraData(source_); |
+ webkit_source_id_ = webkit_source_.id(); |
+ |
+ VideoCaptureDeliverFrameCB deliver_frame_cb; |
+ media::VideoCapturerSource::RunningCallback running_cb; |
+ |
+ InSequence s; |
+ // EXPECT_CALL(mock_delegate(), GetCurrentSupportedFormats(_, _, _, _)); |
+ EXPECT_CALL(mock_delegate(), StartCapture(_, _, _)) |
+ .WillOnce(testing::DoAll(testing::SaveArg<1>(&deliver_frame_cb), |
+ testing::SaveArg<2>(&running_cb))); |
+ EXPECT_CALL(mock_delegate(), RequestRefreshFrame()); |
+ EXPECT_CALL(mock_delegate(), StopCapture()); |
+ blink::WebMediaStreamTrack track = StartSource( |
+ VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0); |
+ running_cb.Run(true); |
+ |
+ base::RunLoop run_loop; |
+ base::TimeTicks reference_capture_time = |
+ base::TimeTicks::FromInternalValue(60013); |
+ base::TimeTicks capture_time; |
+ media::VideoFrameMetadata metadata; |
+ FakeMediaStreamVideoSink fake_sink( |
+ &capture_time, &metadata, |
+ media::BindToCurrentLoop(run_loop.QuitClosure())); |
+ fake_sink.ConnectToTrack(track); |
+ const scoped_refptr<media::VideoFrame> frame = |
+ media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)); |
+ frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE, 30.0); |
+ child_process_->io_task_runner()->PostTask( |
+ FROM_HERE, base::Bind(deliver_frame_cb, frame, reference_capture_time)); |
+ run_loop.Run(); |
+ fake_sink.DisconnectFromTrack(); |
+ EXPECT_EQ(reference_capture_time, capture_time); |
+ double metadata_value; |
+ EXPECT_TRUE(metadata.GetDouble(media::VideoFrameMetadata::FRAME_RATE, |
+ &metadata_value)); |
+ EXPECT_EQ(30.0, metadata_value); |
+} |
+ |
+class MediaStreamVideoCapturerSourceOldConstraintsTest : public testing::Test { |
+ public: |
+ MediaStreamVideoCapturerSourceOldConstraintsTest() |
+ : child_process_(new ChildProcess()), |
+ source_(nullptr), |
+ delegate_(nullptr), |
+ source_stopped_(false) { |
+ scoped_feature_list_.InitAndEnableFeature( |
+ features::kMediaStreamOldVideoConstraints); |
+ } |
+ |
+ void TearDown() override { |
+ webkit_source_.reset(); |
+ blink::WebHeap::collectAllGarbageForTesting(); |
+ } |
+ |
+ void InitWithDeviceInfo(const StreamDeviceInfo& device_info) { |
+ std::unique_ptr<MockVideoCapturerSource> delegate( |
+ new MockVideoCapturerSource()); |
+ delegate_ = delegate.get(); |
+ source_ = new MediaStreamVideoCapturerSource( |
+ base::Bind( |
+ &MediaStreamVideoCapturerSourceOldConstraintsTest::OnSourceStopped, |
+ base::Unretained(this)), |
+ std::move(delegate)); |
+ source_->SetDeviceInfo(device_info); |
+ |
+ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
+ blink::WebMediaStreamSource::TypeVideo, |
+ blink::WebString::fromASCII("dummy_source_name"), |
+ false /* remote */); |
+ webkit_source_.setExtraData(source_); |
+ webkit_source_id_ = webkit_source_.id(); |
+ } |
+ |
+ MockConstraintFactory* constraint_factory() { return &constraint_factory_; } |
+ |
+ blink::WebMediaStreamTrack StartSource() { |
+ bool enabled = true; |
+ // CreateVideoTrack will trigger OnConstraintsApplied. |
+ return MediaStreamVideoTrack::CreateVideoTrack( |
+ source_, constraint_factory_.CreateWebMediaConstraints(), |
+ base::Bind(&MediaStreamVideoCapturerSourceOldConstraintsTest:: |
+ OnConstraintsApplied, |
+ base::Unretained(this)), |
+ enabled); |
+ } |
+ |
+ blink::WebMediaStreamTrack StartSource( |
+ const VideoTrackAdapterSettings& adapter_settings, |
+ const base::Optional<bool>& noise_reduction, |
+ bool is_screencast, |
+ double min_frame_rate) { |
+ bool enabled = true; |
+ // CreateVideoTrack will trigger OnConstraintsApplied. |
+ return MediaStreamVideoTrack::CreateVideoTrack( |
+ source_, adapter_settings, noise_reduction, is_screencast, |
+ min_frame_rate, |
+ base::Bind(&MediaStreamVideoCapturerSourceOldConstraintsTest:: |
+ OnConstraintsApplied, |
+ base::Unretained(this)), |
+ enabled); |
+ } |
+ |
+ MockVideoCapturerSource& mock_delegate() { return *delegate_; } |
+ |
+ const char* GetPowerLineFrequencyForTesting() const { |
+ return source_->GetPowerLineFrequencyForTesting(); |
+ } |
+ |
+ void OnSourceStopped(const blink::WebMediaStreamSource& source) { |
+ source_stopped_ = true; |
+ EXPECT_EQ(source.id(), webkit_source_id_); |
+ } |
+ void OnStarted(bool result) { source_->OnRunStateChanged(result); } |
+ |
+ protected: |
+ void OnConstraintsApplied(MediaStreamSource* source, |
+ MediaStreamRequestResult result, |
+ const blink::WebString& result_name) {} |
+ |
+ // A ChildProcess and a MessageLoopForUI are both needed to fool the Tracks |
+ // and Sources below into believing they are on the right threads. |
+ base::MessageLoopForUI message_loop_; |
+ std::unique_ptr<ChildProcess> child_process_; |
+ |
+ blink::WebMediaStreamSource webkit_source_; |
+ MediaStreamVideoCapturerSource* source_; // owned by |webkit_source_|. |
+ MockVideoCapturerSource* delegate_; // owned by |source|. |
+ blink::WebString webkit_source_id_; |
+ bool source_stopped_; |
+ MockConstraintFactory constraint_factory_; |
+ base::test::ScopedFeatureList scoped_feature_list_; |
}; |
-// This test does not apply with spec-compliant constraints. |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- TabCaptureFixedResolutionByDefaultOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ TabCaptureFixedResolutionByDefault) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE; |
InitWithDeviceInfo(device_info); |
@@ -183,13 +405,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
EXPECT_CALL(mock_delegate(), StopCapture()); |
} |
-// This test does not apply with spec-compliant constraints. |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- DesktopCaptureAllowAnyResolutionChangeByDefaultOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ DesktopCaptureAllowAnyResolutionChangeByDefault) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE; |
InitWithDeviceInfo(device_info); |
@@ -214,13 +431,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
EXPECT_CALL(mock_delegate(), StopCapture()); |
} |
-// This test does not apply with spec-compliant constraints. |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- TabCaptureConstraintsImplyFixedAspectRatioOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ TabCaptureConstraintsImplyFixedAspectRatio) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE; |
InitWithDeviceInfo(device_info); |
@@ -252,13 +464,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
EXPECT_CALL(mock_delegate(), StopCapture()); |
} |
-// This test does not apply with spec-compliant constraints. |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- TabCaptureConstraintsImplyAllowingAnyResolutionChangeOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ TabCaptureConstraintsImplyAllowingAnyResolutionChange) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE; |
InitWithDeviceInfo(device_info); |
@@ -290,13 +497,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
EXPECT_CALL(mock_delegate(), StopCapture()); |
} |
-// This test does not apply with spec-compliant constraints. |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- DeviceCaptureConstraintsSupportPowerLineFrequencyOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ DeviceCaptureConstraintsSupportPowerLineFrequency) { |
for (int frequency = -100; frequency < 100; ++frequency) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_DEVICE_VIDEO_CAPTURE; |
@@ -335,17 +537,14 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
} |
} |
-// TODO(guidou): Remove this test. http://crbug.com/706408 |
-TEST_F(MediaStreamVideoCapturerSourceTest, EndedOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, Ended) { |
std::unique_ptr<MockVideoCapturerSource> delegate( |
new MockVideoCapturerSource()); |
delegate_ = delegate.get(); |
source_ = new MediaStreamVideoCapturerSource( |
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped, |
- base::Unretained(this)), |
+ base::Bind( |
+ &MediaStreamVideoCapturerSourceOldConstraintsTest::OnSourceStopped, |
+ base::Unretained(this)), |
std::move(delegate)); |
webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
blink::WebMediaStreamSource::TypeVideo, |
@@ -376,86 +575,8 @@ TEST_F(MediaStreamVideoCapturerSourceTest, EndedOldConstraints) { |
EXPECT_TRUE(source_stopped_); |
} |
-TEST_F(MediaStreamVideoCapturerSourceTest, StartAndStop) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndDisableFeature( |
- features::kMediaStreamOldVideoConstraints); |
- std::unique_ptr<MockVideoCapturerSource> delegate( |
- new MockVideoCapturerSource()); |
- delegate_ = delegate.get(); |
- EXPECT_CALL(*delegate_, GetPreferredFormats()); |
- source_ = new MediaStreamVideoCapturerSource( |
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped, |
- base::Unretained(this)), |
- std::move(delegate)); |
- webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
- blink::WebMediaStreamSource::TypeVideo, |
- blink::WebString::fromASCII("dummy_source_name"), |
- false /* remote */); |
- webkit_source_.setExtraData(source_); |
- webkit_source_id_ = webkit_source_.id(); |
- |
- InSequence s; |
- EXPECT_CALL(mock_delegate(), StartCapture(_, _, _)); |
- blink::WebMediaStreamTrack track = StartSource( |
- VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0); |
- base::RunLoop().RunUntilIdle(); |
- |
- OnStarted(true); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
- webkit_source_.getReadyState()); |
- |
- EXPECT_FALSE(source_stopped_); |
- |
- EXPECT_CALL(mock_delegate(), StopCapture()); |
- OnStarted(false); |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, |
- webkit_source_.getReadyState()); |
- // Verify that MediaStreamSource::SourceStoppedCallback has been triggered. |
- EXPECT_TRUE(source_stopped_); |
-} |
- |
-class FakeMediaStreamVideoSink : public MediaStreamVideoSink { |
- public: |
- FakeMediaStreamVideoSink(base::TimeTicks* capture_time, |
- media::VideoFrameMetadata* metadata, |
- base::Closure got_frame_cb) |
- : capture_time_(capture_time), |
- metadata_(metadata), |
- got_frame_cb_(got_frame_cb) {} |
- |
- void ConnectToTrack(const blink::WebMediaStreamTrack& track) { |
- MediaStreamVideoSink::ConnectToTrack( |
- track, base::Bind(&FakeMediaStreamVideoSink::OnVideoFrame, |
- base::Unretained(this)), |
- true); |
- } |
- |
- void DisconnectFromTrack() { |
- MediaStreamVideoSink::DisconnectFromTrack(); |
- } |
- |
- void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, |
- base::TimeTicks capture_time) { |
- *capture_time_ = capture_time; |
- metadata_->Clear(); |
- metadata_->MergeMetadataFrom(frame->metadata()); |
- base::ResetAndReturn(&got_frame_cb_).Run(); |
- } |
- |
- private: |
- base::TimeTicks* const capture_time_; |
- media::VideoFrameMetadata* const metadata_; |
- base::Closure got_frame_cb_; |
-}; |
- |
-TEST_F(MediaStreamVideoCapturerSourceTest, |
- CaptureTimeAndMetadataPlumbingOldConstraints) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndEnableFeature( |
- features::kMediaStreamOldVideoConstraints); |
+TEST_F(MediaStreamVideoCapturerSourceOldConstraintsTest, |
+ CaptureTimeAndMetadataPlumbing) { |
StreamDeviceInfo device_info; |
device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE; |
InitWithDeviceInfo(device_info); |
@@ -496,60 +617,4 @@ TEST_F(MediaStreamVideoCapturerSourceTest, |
EXPECT_EQ(30.0, metadata_value); |
} |
-TEST_F(MediaStreamVideoCapturerSourceTest, CaptureTimeAndMetadataPlumbing) { |
- base::test::ScopedFeatureList scoped_feature_list; |
- scoped_feature_list.InitAndDisableFeature( |
- features::kMediaStreamOldVideoConstraints); |
- std::unique_ptr<MockVideoCapturerSource> delegate( |
- new MockVideoCapturerSource()); |
- delegate_ = delegate.get(); |
- EXPECT_CALL(*delegate_, GetPreferredFormats()); |
- source_ = new MediaStreamVideoCapturerSource( |
- base::Bind(&MediaStreamVideoCapturerSourceTest::OnSourceStopped, |
- base::Unretained(this)), |
- std::move(delegate)); |
- webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), |
- blink::WebMediaStreamSource::TypeVideo, |
- blink::WebString::fromASCII("dummy_source_name"), |
- false /* remote */); |
- webkit_source_.setExtraData(source_); |
- webkit_source_id_ = webkit_source_.id(); |
- |
- VideoCaptureDeliverFrameCB deliver_frame_cb; |
- media::VideoCapturerSource::RunningCallback running_cb; |
- |
- InSequence s; |
- // EXPECT_CALL(mock_delegate(), GetCurrentSupportedFormats(_, _, _, _)); |
- EXPECT_CALL(mock_delegate(), StartCapture(_, _, _)) |
- .WillOnce(testing::DoAll(testing::SaveArg<1>(&deliver_frame_cb), |
- testing::SaveArg<2>(&running_cb))); |
- EXPECT_CALL(mock_delegate(), RequestRefreshFrame()); |
- EXPECT_CALL(mock_delegate(), StopCapture()); |
- blink::WebMediaStreamTrack track = StartSource( |
- VideoTrackAdapterSettings(), base::Optional<bool>(), false, 0.0); |
- running_cb.Run(true); |
- |
- base::RunLoop run_loop; |
- base::TimeTicks reference_capture_time = |
- base::TimeTicks::FromInternalValue(60013); |
- base::TimeTicks capture_time; |
- media::VideoFrameMetadata metadata; |
- FakeMediaStreamVideoSink fake_sink( |
- &capture_time, &metadata, |
- media::BindToCurrentLoop(run_loop.QuitClosure())); |
- fake_sink.ConnectToTrack(track); |
- const scoped_refptr<media::VideoFrame> frame = |
- media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)); |
- frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE, 30.0); |
- child_process_->io_task_runner()->PostTask( |
- FROM_HERE, base::Bind(deliver_frame_cb, frame, reference_capture_time)); |
- run_loop.Run(); |
- fake_sink.DisconnectFromTrack(); |
- EXPECT_EQ(reference_capture_time, capture_time); |
- double metadata_value; |
- EXPECT_TRUE(metadata.GetDouble(media::VideoFrameMetadata::FRAME_RATE, |
- &metadata_value)); |
- EXPECT_EQ(30.0, metadata_value); |
-} |
- |
} // namespace content |