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