12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Unit test for VideoCaptureBufferPool.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/media/video_capture_buffer_pool.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/media/video_capture_controller.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/video_frame.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/video_util.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class VideoCaptureBufferPoolTest : public testing::Test {
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Buffer {
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Buffer(const scoped_refptr<VideoCaptureBufferPool> pool,
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           int id,
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           void* data,
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           size_t size)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        : pool_(pool), id_(id), data_(data), size_(size) {}
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ~Buffer() { pool_->RelinquishProducerReservation(id()); }
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int id() const { return id_; }
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    void* data() const { return data_; }
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    size_t size() const { return size_; }
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   private:
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<VideoCaptureBufferPool> pool_;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const int id_;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    void* const data_;
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const size_t size_;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  VideoCaptureBufferPoolTest()
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : expected_dropped_id_(0),
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        pool_(new VideoCaptureBufferPool(3)) {}
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ExpectDroppedId(int expected_dropped_id) {
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    expected_dropped_id_ = expected_dropped_id;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<Buffer> ReserveI420Buffer(const gfx::Size& dimensions) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const size_t frame_bytes =
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        media::VideoFrame::AllocationSize(media::VideoFrame::I420, dimensions);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // To verify that ReserveI420Buffer always sets |buffer_id_to_drop|,
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // initialize it to something different than the expected value.
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int buffer_id_to_drop = ~expected_dropped_id_;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int buffer_id = pool_->ReserveForProducer(frame_bytes, &buffer_id_to_drop);
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (buffer_id == VideoCaptureBufferPool::kInvalidId)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return scoped_ptr<Buffer>();
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    void* memory;
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    size_t size;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    pool_->GetBufferInfo(buffer_id, &memory, &size);
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(expected_dropped_id_, buffer_id_to_drop);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return scoped_ptr<Buffer>(new Buffer(pool_, buffer_id, memory, size));
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int expected_dropped_id_;
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<VideoCaptureBufferPool> pool_;
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoCaptureBufferPoolTest);
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(VideoCaptureBufferPoolTest, BufferPool) {
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::Size size_lo = gfx::Size(640, 480);
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::Size size_hi = gfx::Size(1024, 768);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<media::VideoFrame> non_pool_frame =
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      media::VideoFrame::CreateFrame(media::VideoFrame::YV12, size_lo,
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     gfx::Rect(size_lo), size_lo,
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     base::TimeDelta());
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Reallocation won't happen for the first part of the test.
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExpectDroppedId(VideoCaptureBufferPool::kInvalidId);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<Buffer> buffer1 = ReserveI420Buffer(size_lo);
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer1.get());
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_LE(media::VideoFrame::AllocationSize(media::VideoFrame::I420, size_lo),
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buffer1->size());
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<Buffer> buffer2 = ReserveI420Buffer(size_lo);
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer2.get());
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_LE(media::VideoFrame::AllocationSize(media::VideoFrame::I420, size_lo),
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buffer2->size());
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<Buffer> buffer3 = ReserveI420Buffer(size_lo);
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer3.get());
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_LE(media::VideoFrame::AllocationSize(media::VideoFrame::I420, size_lo),
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buffer3->size());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Touch the memory.
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer1->data(), 0x11, buffer1->size());
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer2->data(), 0x44, buffer2->size());
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer3->data(), 0x77, buffer3->size());
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Fourth buffer should fail.
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Release 1st buffer and retry; this should succeed.
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer1.reset();
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<Buffer> buffer4 = ReserveI420Buffer(size_lo);
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer4.get());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_hi)) << "Pool should be empty";
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Validate the IDs
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int buffer_id2 = buffer2->id();
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(1, buffer_id2);
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int buffer_id3 = buffer3->id();
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(2, buffer_id3);
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* const memory_pointer3 = buffer3->data();
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int buffer_id4 = buffer4->id();
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(0, buffer_id4);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Deliver a buffer.
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_->HoldForConsumers(buffer_id3, 2);
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer3.reset();  // Old producer releases buffer. Should be a noop.
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_hi)) << "Pool should be empty";
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2.reset();  // Active producer releases buffer. Should free a buffer.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer1 = ReserveI420Buffer(size_lo);
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer1.get());
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First consumer finishes.
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_->RelinquishConsumerHold(buffer_id3, 1);
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Second consumer finishes. This should free that buffer.
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_->RelinquishConsumerHold(buffer_id3, 1);
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer3 = ReserveI420Buffer(size_lo);
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer3.get());
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(buffer_id3, buffer3->id()) << "Buffer ID should be reused.";
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(memory_pointer3, buffer3->data());
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now deliver & consume buffer1, but don't release the buffer.
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int buffer_id1 = buffer1->id();
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(1, buffer_id1);
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_->HoldForConsumers(buffer_id1, 5);
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_->RelinquishConsumerHold(buffer_id1, 5);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Even though the consumer is done with the buffer at |buffer_id1|, it cannot
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // be re-allocated to the producer, because |buffer1| still references it. But
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // when |buffer1| goes away, we should be able to re-reserve the buffer (and
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the ID ought to be the same).
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer1.reset();  // Should free the buffer.
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2 = ReserveI420Buffer(size_lo);
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer2.get());
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(buffer_id1, buffer2->id());
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  buffer_id2 = buffer_id1;
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Now try reallocation with different resolutions. We expect reallocation
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // to occur only when the old buffer is too small.
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2.reset();
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExpectDroppedId(buffer_id2);
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2 = ReserveI420Buffer(size_hi);
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer2.get());
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_LE(media::VideoFrame::AllocationSize(media::VideoFrame::I420, size_hi),
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buffer2->size());
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3, buffer2->id());
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* const memory_pointer_hi = buffer2->data();
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2.reset();  // Frees it.
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExpectDroppedId(VideoCaptureBufferPool::kInvalidId);
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2 = ReserveI420Buffer(size_lo);
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* const memory_pointer_lo = buffer2->data();
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(memory_pointer_hi, memory_pointer_lo)
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      << "Decrease in resolution should not reallocate buffer";
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(NULL != buffer2.get());
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3, buffer2->id());
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_LE(media::VideoFrame::AllocationSize(media::VideoFrame::I420, size_lo),
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buffer2->size());
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(ReserveI420Buffer(size_lo)) << "Pool should be empty";
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Tear down the pool_, writing into the buffers. The buffer should preserve
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the lifetime of the underlying memory.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer3.reset();
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  pool_ = NULL;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Touch the memory.
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer2->data(), 0x22, buffer2->size());
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer4->data(), 0x55, buffer4->size());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer2.reset();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(buffer4->data(), 0x77, buffer4->size());
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  buffer4.reset();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content
203