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<I420VideoFrame> 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
This commit is contained in:
magjed@webrtc.org 2015-03-11 11:02:52 +00:00
parent e77c9c8df5
commit 4dccdff885

View File

@ -97,8 +97,7 @@ class ViECapturerTest : public ::testing::Test {
void AddOutputFrame(const I420VideoFrame* frame) { void AddOutputFrame(const I420VideoFrame* frame) {
if (frame->native_handle() == NULL) if (frame->native_handle() == NULL)
output_frame_ybuffers_.push_back(frame->buffer(kYPlane)); output_frame_ybuffers_.push_back(frame->buffer(kYPlane));
// Clone the frames because ViECapturer owns the frames. output_frames_.push_back(new I420VideoFrame(*frame));
output_frames_.push_back(frame->CloneFrame());
output_frame_event_->Set(); output_frame_event_->Set();
} }
@ -129,6 +128,33 @@ class ViECapturerTest : public ::testing::Test {
std::vector<const uint8_t*> output_frame_ybuffers_; std::vector<const uint8_t*> output_frame_ybuffers_;
}; };
TEST_F(ViECapturerTest, DoesNotRetainHandleNorCopyBuffer) {
// Indicate an output frame has arrived.
rtc::scoped_ptr<EventWrapper> 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>;
~TestBuffer() override { event_->Set(); }
EventWrapper* event_;
};
I420VideoFrame frame(
new rtc::RefCountedObject<TestBuffer>(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) { TEST_F(ViECapturerTest, TestTextureFrames) {
const int kNumFrame = 3; const int kNumFrame = 3;
for (int i = 0 ; i < kNumFrame; ++i) { for (int i = 0 ; i < kNumFrame; ++i) {