OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Unit test for VideoCaptureBufferPool. | 5 // Unit test for VideoCaptureBufferPool. |
6 | 6 |
7 #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" | 7 #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
8 | 8 |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 scoped_refptr<media::VideoFrame> frame1 = pool->ReserveForProducer(0); | 28 scoped_refptr<media::VideoFrame> frame1 = pool->ReserveForProducer(0); |
29 ASSERT_TRUE(NULL != frame1.get()); | 29 ASSERT_TRUE(NULL != frame1.get()); |
30 ASSERT_EQ(size, frame1->coded_size()); | 30 ASSERT_EQ(size, frame1->coded_size()); |
31 scoped_refptr<media::VideoFrame> frame2 = pool->ReserveForProducer(0); | 31 scoped_refptr<media::VideoFrame> frame2 = pool->ReserveForProducer(0); |
32 ASSERT_TRUE(NULL != frame2.get()); | 32 ASSERT_TRUE(NULL != frame2.get()); |
33 ASSERT_EQ(size, frame2->coded_size()); | 33 ASSERT_EQ(size, frame2->coded_size()); |
34 scoped_refptr<media::VideoFrame> frame3 = pool->ReserveForProducer(0); | 34 scoped_refptr<media::VideoFrame> frame3 = pool->ReserveForProducer(0); |
35 ASSERT_TRUE(NULL != frame3.get()); | 35 ASSERT_TRUE(NULL != frame3.get()); |
36 | 36 |
37 // Touch the memory. | 37 // Touch the memory. |
38 media::FillYUV(frame1, 0x11, 0x22, 0x33); | 38 media::FillYUV(frame1.get(), 0x11, 0x22, 0x33); |
39 media::FillYUV(frame2, 0x44, 0x55, 0x66); | 39 media::FillYUV(frame2.get(), 0x44, 0x55, 0x66); |
40 media::FillYUV(frame3, 0x77, 0x88, 0x99); | 40 media::FillYUV(frame3.get(), 0x77, 0x88, 0x99); |
41 | 41 |
42 // Fourth frame should fail. | 42 // Fourth frame should fail. |
43 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 43 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
44 | 44 |
45 // Release 1st frame and retry; this should succeed. | 45 // Release 1st frame and retry; this should succeed. |
46 frame1 = NULL; | 46 frame1 = NULL; |
47 scoped_refptr<media::VideoFrame> frame4 = pool->ReserveForProducer(0); | 47 scoped_refptr<media::VideoFrame> frame4 = pool->ReserveForProducer(0); |
48 ASSERT_TRUE(NULL != frame4.get()); | 48 ASSERT_TRUE(NULL != frame4.get()); |
49 | 49 |
50 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 50 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
(...skipping 29 matching lines...) Expand all Loading... |
80 | 80 |
81 // First consumer finishes. | 81 // First consumer finishes. |
82 pool->RelinquishConsumerHold(buffer_id3, 1); | 82 pool->RelinquishConsumerHold(buffer_id3, 1); |
83 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 83 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
84 ASSERT_TRUE(pool->IsAnyBufferHeldForConsumers()); | 84 ASSERT_TRUE(pool->IsAnyBufferHeldForConsumers()); |
85 | 85 |
86 // Second consumer finishes. This should free that frame. | 86 // Second consumer finishes. This should free that frame. |
87 pool->RelinquishConsumerHold(buffer_id3, 1); | 87 pool->RelinquishConsumerHold(buffer_id3, 1); |
88 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); | 88 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); |
89 frame3 = pool->ReserveForProducer(0); | 89 frame3 = pool->ReserveForProducer(0); |
90 ASSERT_TRUE(NULL != frame3); | 90 ASSERT_TRUE(NULL != frame3.get()); |
91 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); | 91 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); |
92 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 92 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
93 | 93 |
94 // Now deliver & consume frame1, but don't release the VideoFrame. | 94 // Now deliver & consume frame1, but don't release the VideoFrame. |
95 int buffer_id1 = pool->RecognizeReservedBuffer(frame1); | 95 int buffer_id1 = pool->RecognizeReservedBuffer(frame1); |
96 ASSERT_NE(0, buffer_id1); | 96 ASSERT_NE(0, buffer_id1); |
97 pool->HoldForConsumers(frame1, buffer_id1, 5); | 97 pool->HoldForConsumers(frame1, buffer_id1, 5); |
98 ASSERT_TRUE(pool->IsAnyBufferHeldForConsumers()); | 98 ASSERT_TRUE(pool->IsAnyBufferHeldForConsumers()); |
99 pool->RelinquishConsumerHold(buffer_id1, 5); | 99 pool->RelinquishConsumerHold(buffer_id1, 5); |
100 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); | 100 ASSERT_FALSE(pool->IsAnyBufferHeldForConsumers()); |
101 | 101 |
102 // Even though the consumer is done with the buffer at |buffer_id1|, it cannot | 102 // Even though the consumer is done with the buffer at |buffer_id1|, it cannot |
103 // be re-allocated to the producer, because |frame1| still references it. But | 103 // be re-allocated to the producer, because |frame1| still references it. But |
104 // when |frame1| goes away, we should be able to re-reserve the buffer (and | 104 // when |frame1| goes away, we should be able to re-reserve the buffer (and |
105 // the ID ought to be the same). | 105 // the ID ought to be the same). |
106 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 106 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
107 frame1 = NULL; // Should free the frame. | 107 frame1 = NULL; // Should free the frame. |
108 frame2 = pool->ReserveForProducer(0); | 108 frame2 = pool->ReserveForProducer(0); |
109 ASSERT_TRUE(NULL != frame2); | 109 ASSERT_TRUE(NULL != frame2.get()); |
110 ASSERT_EQ(buffer_id1, pool->RecognizeReservedBuffer(frame2)); | 110 ASSERT_EQ(buffer_id1, pool->RecognizeReservedBuffer(frame2)); |
111 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 111 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
112 | 112 |
113 // For good measure, do one more cycle of free/realloc without delivery, now | 113 // For good measure, do one more cycle of free/realloc without delivery, now |
114 // that this buffer has been through the consumer-hold cycle. | 114 // that this buffer has been through the consumer-hold cycle. |
115 frame2 = NULL; | 115 frame2 = NULL; |
116 frame1 = pool->ReserveForProducer(0); | 116 frame1 = pool->ReserveForProducer(0); |
117 ASSERT_TRUE(NULL != frame1); | 117 ASSERT_TRUE(NULL != frame1.get()); |
118 ASSERT_EQ(buffer_id1, pool->RecognizeReservedBuffer(frame1)); | 118 ASSERT_EQ(buffer_id1, pool->RecognizeReservedBuffer(frame1)); |
119 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; | 119 ASSERT_EQ(NULL, pool->ReserveForProducer(0).get()) << "Pool should be empty"; |
120 | 120 |
121 // Tear down the pool, writing into the frames. The VideoFrame should | 121 // Tear down the pool, writing into the frames. The VideoFrame should |
122 // preserve the lifetime of the underlying memory. | 122 // preserve the lifetime of the underlying memory. |
123 frame3 = NULL; | 123 frame3 = NULL; |
124 pool = NULL; | 124 pool = NULL; |
125 | 125 |
126 // Touch the memory. | 126 // Touch the memory. |
127 media::FillYUV(frame1, 0x11, 0x22, 0x33); | 127 media::FillYUV(frame1.get(), 0x11, 0x22, 0x33); |
128 media::FillYUV(frame4, 0x44, 0x55, 0x66); | 128 media::FillYUV(frame4.get(), 0x44, 0x55, 0x66); |
129 | 129 |
130 frame1 = NULL; | 130 frame1 = NULL; |
131 | 131 |
132 media::FillYUV(frame4, 0x44, 0x55, 0x66); | 132 media::FillYUV(frame4.get(), 0x44, 0x55, 0x66); |
133 frame4 = NULL; | 133 frame4 = NULL; |
134 } | 134 } |
135 | 135 |
136 } // namespace content | 136 } // namespace content |
OLD | NEW |