1/*
2 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <string>
12
13#include "testing/gtest/include/gtest/gtest.h"
14#include "webrtc/common_video/include/i420_buffer_pool.h"
15
16namespace webrtc {
17
18TEST(TestI420BufferPool, SimpleFrameReuse) {
19  I420BufferPool pool;
20  rtc::scoped_refptr<VideoFrameBuffer> buffer = pool.CreateBuffer(16, 16);
21  EXPECT_EQ(16, buffer->width());
22  EXPECT_EQ(16, buffer->height());
23  // Extract non-refcounted pointers for testing.
24  const uint8_t* y_ptr = buffer->data(kYPlane);
25  const uint8_t* u_ptr = buffer->data(kUPlane);
26  const uint8_t* v_ptr = buffer->data(kVPlane);
27  // Release buffer so that it is returned to the pool.
28  buffer = nullptr;
29  // Check that the memory is resued.
30  buffer = pool.CreateBuffer(16, 16);
31  EXPECT_EQ(y_ptr, buffer->data(kYPlane));
32  EXPECT_EQ(u_ptr, buffer->data(kUPlane));
33  EXPECT_EQ(v_ptr, buffer->data(kVPlane));
34  EXPECT_EQ(16, buffer->width());
35  EXPECT_EQ(16, buffer->height());
36}
37
38TEST(TestI420BufferPool, FailToReuse) {
39  I420BufferPool pool;
40  rtc::scoped_refptr<VideoFrameBuffer> buffer = pool.CreateBuffer(16, 16);
41  // Extract non-refcounted pointers for testing.
42  const uint8_t* u_ptr = buffer->data(kUPlane);
43  const uint8_t* v_ptr = buffer->data(kVPlane);
44  // Release buffer so that it is returned to the pool.
45  buffer = nullptr;
46  // Check that the pool doesn't try to reuse buffers of incorrect size.
47  buffer = pool.CreateBuffer(32, 16);
48  EXPECT_EQ(32, buffer->width());
49  EXPECT_EQ(16, buffer->height());
50  EXPECT_NE(u_ptr, buffer->data(kUPlane));
51  EXPECT_NE(v_ptr, buffer->data(kVPlane));
52}
53
54TEST(TestI420BufferPool, ExclusiveOwner) {
55  // Check that created buffers are exclusive so that they can be written to.
56  I420BufferPool pool;
57  rtc::scoped_refptr<VideoFrameBuffer> buffer = pool.CreateBuffer(16, 16);
58  EXPECT_TRUE(buffer->HasOneRef());
59}
60
61TEST(TestI420BufferPool, FrameValidAfterPoolDestruction) {
62  rtc::scoped_refptr<VideoFrameBuffer> buffer;
63  {
64    I420BufferPool pool;
65    buffer = pool.CreateBuffer(16, 16);
66  }
67  EXPECT_TRUE(buffer->HasOneRef());
68  EXPECT_EQ(16, buffer->width());
69  EXPECT_EQ(16, buffer->height());
70  // Try to trigger use-after-free errors by writing to y-plane.
71  memset(buffer->MutableData(kYPlane), 0xA5, 16 * buffer->stride(kYPlane));
72}
73
74}  // namespace webrtc
75