| Index: remoting/host/video_frame_recorder_unittest.cc
|
| diff --git a/remoting/host/video_frame_recorder_unittest.cc b/remoting/host/video_frame_recorder_unittest.cc
|
| index f0f5b9d440295ebe534cb6cb9a7145be5f8e6960..9e4139b0309a590390f000ca644dcd612f7c6754 100644
|
| --- a/remoting/host/video_frame_recorder_unittest.cc
|
| +++ b/remoting/host/video_frame_recorder_unittest.cc
|
| @@ -18,29 +18,34 @@ namespace webrtc {
|
| // Define equality operator for DesktopFrame to allow use of EXPECT_EQ().
|
| static bool operator==(const DesktopFrame& a,
|
| const DesktopFrame& b) {
|
| - if ((a.size().equals(b.size())) &&
|
| - (a.updated_region().Equals(b.updated_region())) &&
|
| - (a.dpi().equals(b.dpi()))) {
|
| - for (int i = 0; i < a.size().height(); ++i) {
|
| - if (memcmp(a.data() + a.stride() * i,
|
| - b.data() + b.stride() * i,
|
| - a.size().width() * DesktopFrame::kBytesPerPixel) != 0) {
|
| - return false;
|
| - }
|
| + if ((!a.size().equals(b.size())) ||
|
| + (!a.updated_region().Equals(b.updated_region())) ||
|
| + (!a.dpi().equals(b.dpi()))) {
|
| + return false;
|
| + }
|
| +
|
| + for (int i = 0; i < a.size().height(); ++i) {
|
| + if (memcmp(a.data() + a.stride() * i,
|
| + b.data() + b.stride() * i,
|
| + a.size().width() * DesktopFrame::kBytesPerPixel) != 0) {
|
| + return false;
|
| }
|
| - return true;
|
| }
|
| - return false;
|
| +
|
| + return true;
|
| }
|
|
|
| } // namespace
|
|
|
| namespace remoting {
|
|
|
| -const int64_t kMaxContentBytes = 10 * 1024 * 1024;
|
| -const int kWidth = 640;
|
| -const int kHeight = 480;
|
| -const int kTestFrameCount = 6;
|
| +namespace {
|
| +const int kFrameWidth = 640;
|
| +const int kFrameHeight = 480;
|
| +const size_t kTestFrameCount = 6;
|
| +const int64 kTestFrameBytes =
|
| + kFrameWidth * kFrameHeight * webrtc::DesktopFrame::kBytesPerPixel;
|
| +} // namespace
|
|
|
| class VideoFrameRecorderTest : public testing::Test {
|
| public:
|
| @@ -49,27 +54,51 @@ class VideoFrameRecorderTest : public testing::Test {
|
| virtual void SetUp() OVERRIDE;
|
| virtual void TearDown() OVERRIDE;
|
|
|
| + // Creates a new VideoEncoder, wraps it using |recorder_|, and stores the
|
| + // newly wrapped encoder in |encoder_|.
|
| void CreateAndWrapEncoder();
|
| +
|
| + // Creates the next test frame to pass to |encoder_|. Each test frame's pixel
|
| + // values are set uniquely, so that tests can verify that the correct set of
|
| + // frames were recorded.
|
| scoped_ptr<webrtc::DesktopFrame> CreateNextFrame();
|
| +
|
| + // Calls CreateNextFrame() to create kTextFrameCount test frames, and stores
|
| + // them to |test_frames_|.
|
| void CreateTestFrames();
|
| +
|
| + // Passes the frames in |test_frames_| to |encoder_|, in order, to encode.
|
| void EncodeTestFrames();
|
| +
|
| + // Creates a frame and passes it to |encoder_| without adding it to
|
| + // |test_frames_|.
|
| void EncodeDummyFrame();
|
| +
|
| + // Configures |recorder_| to start recording, and pumps events to ensure that
|
| + // |encoder_| is ready to record frames.
|
| void StartRecording();
|
| +
|
| + // Reads frames from |recorder_| and compares them to the |test_frames_|.
|
| void VerifyTestFrames();
|
|
|
| protected:
|
| + typedef std::list<webrtc::DesktopFrame*> DesktopFrames;
|
| +
|
| base::MessageLoop message_loop_;
|
|
|
| scoped_ptr<VideoFrameRecorder> recorder_;
|
| scoped_ptr<VideoEncoder> encoder_;
|
|
|
| - std::list<webrtc::DesktopFrame*> test_frames_;
|
| + DesktopFrames test_frames_;
|
| int frame_count_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VideoFrameRecorderTest);
|
| };
|
|
|
| VideoFrameRecorderTest::VideoFrameRecorderTest() : frame_count_(0) {}
|
|
|
| void VideoFrameRecorderTest::SetUp() {
|
| + const int64_t kMaxContentBytes = 10 * 1024 * 1024;
|
| recorder_.reset(new VideoFrameRecorder());
|
| recorder_->SetMaxContentBytes(kMaxContentBytes);
|
| }
|
| @@ -97,11 +126,12 @@ void VideoFrameRecorderTest::CreateAndWrapEncoder() {
|
|
|
| scoped_ptr<webrtc::DesktopFrame> VideoFrameRecorderTest::CreateNextFrame() {
|
| scoped_ptr<webrtc::DesktopFrame> frame(
|
| - new webrtc::BasicDesktopFrame(webrtc::DesktopSize(kWidth, kHeight)));
|
| + new webrtc::BasicDesktopFrame(webrtc::DesktopSize(kFrameWidth,
|
| + kFrameHeight)));
|
|
|
| // Fill content, DPI and updated-region based on |frame_count_| so that each
|
| // generated frame is different.
|
| - memset(frame->data(), frame_count_, frame->stride() * kHeight);
|
| + memset(frame->data(), frame_count_, frame->stride() * kFrameHeight);
|
| frame->set_dpi(webrtc::DesktopVector(frame_count_, frame_count_));
|
| frame->mutable_updated_region()->SetRect(
|
| webrtc::DesktopRect::MakeWH(frame_count_, frame_count_));
|
| @@ -111,15 +141,15 @@ scoped_ptr<webrtc::DesktopFrame> VideoFrameRecorderTest::CreateNextFrame() {
|
| }
|
|
|
| void VideoFrameRecorderTest::CreateTestFrames() {
|
| - for (int i=0; i < kTestFrameCount; ++i) {
|
| + for (size_t i = 0; i < kTestFrameCount; ++i) {
|
| test_frames_.push_back(CreateNextFrame().release());
|
| }
|
| }
|
|
|
| void VideoFrameRecorderTest::EncodeTestFrames() {
|
| - std::list<webrtc::DesktopFrame*>::iterator i;
|
| - for (i = test_frames_.begin(); i != test_frames_.end(); ++i) {
|
| - scoped_ptr<VideoPacket> packet = encoder_->Encode(*(*i));
|
| + for (DesktopFrames::iterator i = test_frames_.begin();
|
| + i != test_frames_.end(); ++i) {
|
| + ASSERT_TRUE(encoder_->Encode(**i));
|
|
|
| // Process tasks to let the recorder pick up the frame.
|
| base::RunLoop().RunUntilIdle();
|
| @@ -127,8 +157,9 @@ void VideoFrameRecorderTest::EncodeTestFrames() {
|
| }
|
|
|
| void VideoFrameRecorderTest::EncodeDummyFrame() {
|
| - webrtc::BasicDesktopFrame dummy_frame(webrtc::DesktopSize(kWidth, kHeight));
|
| - scoped_ptr<VideoPacket> packet = encoder_->Encode(dummy_frame);
|
| + webrtc::BasicDesktopFrame dummy_frame(
|
| + webrtc::DesktopSize(kFrameWidth, kFrameHeight));
|
| + ASSERT_TRUE(encoder_->Encode(dummy_frame));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -158,7 +189,7 @@ TEST_F(VideoFrameRecorderTest, CreateDestroy) {
|
| }
|
|
|
| // Basic test that creating, starting, stopping and destroying a
|
| -// VideoFrameRecorder don't end the world.
|
| +// VideoFrameRecorder succeeds (e.g. does not crash or DCHECK).
|
| TEST_F(VideoFrameRecorderTest, StartStop) {
|
| StartRecording();
|
| recorder_->SetEnableRecording(false);
|
| @@ -218,8 +249,7 @@ TEST_F(VideoFrameRecorderTest, MaxContentBytesEnforced) {
|
| CreateAndWrapEncoder();
|
|
|
| // Configure a maximum content size sufficient for five and a half frames.
|
| - int64 frame_bytes = kWidth * kHeight * webrtc::DesktopFrame::kBytesPerPixel;
|
| - recorder_->SetMaxContentBytes((frame_bytes * 11) / 2);
|
| + recorder_->SetMaxContentBytes((kTestFrameBytes * 11) / 2);
|
|
|
| // Start the recorder, so that the wrapper will push frames to it.
|
| StartRecording();
|
| @@ -238,14 +268,13 @@ TEST_F(VideoFrameRecorderTest, MaxContentBytesEnforced) {
|
| VerifyTestFrames();
|
| }
|
|
|
| -// Test that when asked to record more frames than the maximum content bytes
|
| -// limit allows, the first encoded frames are dropped.
|
| +// Test that when frames are consumed the corresponding space is freed up in
|
| +// the content buffer, allowing subsequent frames to be recorded.
|
| TEST_F(VideoFrameRecorderTest, ContentBytesUpdatedByNextFrame) {
|
| CreateAndWrapEncoder();
|
|
|
| // Configure a maximum content size sufficient for kTestFrameCount frames.
|
| - int64 frame_bytes = kWidth * kHeight * webrtc::DesktopFrame::kBytesPerPixel;
|
| - recorder_->SetMaxContentBytes(frame_bytes * kTestFrameCount);
|
| + recorder_->SetMaxContentBytes(kTestFrameBytes * kTestFrameCount);
|
|
|
| // Start the recorder, so that the wrapper will push frames to it.
|
| StartRecording();
|
|
|