From 4dccdff885a69fb0c42508d2b5859ba5265d8863 Mon Sep 17 00:00:00 2001 From: "magjed@webrtc.org" Date: Wed, 11 Mar 2015 11:02:52 +0000 Subject: [PATCH] Add unittest to check that ViECapturer does not hold on to frames after they have been delivered This should have been part of the CL "Remove the need for scoped_ptr in VieCapturer" https://webrtc-codereview.appspot.com/43669004. TBR=pbos,mflodman BUG=1128 Review URL: https://webrtc-codereview.appspot.com/44629005 Cr-Commit-Position: refs/heads/master@{#8680} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8680 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/video_engine/vie_capturer_unittest.cc | 30 ++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/webrtc/video_engine/vie_capturer_unittest.cc b/webrtc/video_engine/vie_capturer_unittest.cc index fa3a9d213..b0a717293 100644 --- a/webrtc/video_engine/vie_capturer_unittest.cc +++ b/webrtc/video_engine/vie_capturer_unittest.cc @@ -97,8 +97,7 @@ class ViECapturerTest : public ::testing::Test { void AddOutputFrame(const I420VideoFrame* frame) { if (frame->native_handle() == NULL) output_frame_ybuffers_.push_back(frame->buffer(kYPlane)); - // Clone the frames because ViECapturer owns the frames. - output_frames_.push_back(frame->CloneFrame()); + output_frames_.push_back(new I420VideoFrame(*frame)); output_frame_event_->Set(); } @@ -129,6 +128,33 @@ class ViECapturerTest : public ::testing::Test { std::vector output_frame_ybuffers_; }; +TEST_F(ViECapturerTest, DoesNotRetainHandleNorCopyBuffer) { + // Indicate an output frame has arrived. + rtc::scoped_ptr frame_destroyed_event(EventWrapper::Create()); + class TestBuffer : public webrtc::I420Buffer { + public: + TestBuffer(EventWrapper* event) : I420Buffer(5, 5), event_(event) {} + + private: + friend class rtc::RefCountedObject; + ~TestBuffer() override { event_->Set(); } + EventWrapper* event_; + }; + + I420VideoFrame frame( + new rtc::RefCountedObject(frame_destroyed_event.get()), 1, 1, + kVideoRotation_0); + + AddInputFrame(&frame); + WaitOutputFrame(); + + EXPECT_EQ(output_frames_[0]->video_frame_buffer().get(), + frame.video_frame_buffer().get()); + output_frames_.clear(); + frame.Reset(); + EXPECT_EQ(kEventSignaled, frame_destroyed_event->Wait(FRAME_TIMEOUT_MS)); +} + TEST_F(ViECapturerTest, TestTextureFrames) { const int kNumFrame = 3; for (int i = 0 ; i < kNumFrame; ++i) {