1cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai#include <dvr/dvr_api.h>
22d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <dvr/dvr_buffer_queue.h>
3960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai#include <gui/Surface.h>
42d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <private/dvr/buffer_hub_queue_client.h>
52d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
62d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <base/logging.h>
72d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <gtest/gtest.h>
82d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include "../dvr_internal.h"
102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
112d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cainamespace android {
122d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cainamespace dvr {
132d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cainamespace {
152d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr int kBufferWidth = 100;
172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr int kBufferHeight = 1;
18108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaarstatic constexpr int kLayerCount = 1;
192d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr int kBufferFormat = HAL_PIXEL_FORMAT_BLOB;
202d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr int kBufferUsage = GRALLOC_USAGE_SW_READ_RARELY;
212d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr size_t kQueueCapacity = 3;
222d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
232d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caitypedef uint64_t TestMeta;
242d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
252d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caiclass DvrBufferQueueTest : public ::testing::Test {
262d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai protected:
272d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  void SetUp() override {
282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    write_queue_ = CreateDvrWriteBufferQueueFromProducerQueue(
292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        ProducerQueue::Create<TestMeta>(0, 0, 0, 0));
302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    ASSERT_NE(nullptr, write_queue_);
312d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  }
322d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
332d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  void TearDown() override {
342d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    if (write_queue_ != nullptr) {
352d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai      dvrWriteBufferQueueDestroy(write_queue_);
362d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai      write_queue_ = nullptr;
372d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    }
382d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  }
392d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
402d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  void AllocateBuffers(size_t buffer_count) {
412d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    size_t out_slot;
422d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    for (size_t i = 0; i < buffer_count; i++) {
434d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar      int ret = GetProducerQueueFromDvrWriteBufferQueue(write_queue_)
44108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                    ->AllocateBuffer(kBufferWidth, kBufferHeight, kLayerCount,
45108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                                     kBufferFormat, kBufferUsage, &out_slot);
462d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai      ASSERT_EQ(0, ret);
472d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    }
482d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  }
492d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
502d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrWriteBufferQueue* write_queue_{nullptr};
512d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai};
522d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
532d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestWrite_QueueDestroy) {
542d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrWriteBufferQueueDestroy(write_queue_);
552d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  write_queue_ = nullptr;
562d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
572d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
582d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestWrite_QueueGetCapacity) {
592d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  AllocateBuffers(kQueueCapacity);
602d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  size_t capacity = dvrWriteBufferQueueGetCapacity(write_queue_);
612d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
622d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestWrite_QueueGetCapacity, capacity=%zu", capacity);
632d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(kQueueCapacity, capacity);
642d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
662d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestCreateReadQueueFromWriteQueue) {
672d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
682d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  int ret = dvrWriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
702d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
712d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue);
722d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
732d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrReadBufferQueueDestroy(read_queue);
742d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
752d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
762d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestCreateReadQueueFromReadQueue) {
772d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue1 = nullptr;
782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue2 = nullptr;
792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  int ret = dvrWriteBufferQueueCreateReadQueue(write_queue_, &read_queue1);
802d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
812d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
822d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue1);
832d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
842d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ret = dvrReadBufferQueueCreateReadQueue(read_queue1, &read_queue2);
852d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
862d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue2);
872d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(read_queue1, read_queue2);
882d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
892d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrReadBufferQueueDestroy(read_queue1);
902d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrReadBufferQueueDestroy(read_queue2);
912d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
922d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey TabakaTEST_F(DvrBufferQueueTest, CreateEmptyBuffer) {
942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  AllocateBuffers(3);
952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrReadBuffer* read_buffer = nullptr;
972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrWriteBuffer* write_buffer = nullptr;
982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_FALSE(dvrReadBufferIsValid(read_buffer));
1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_FALSE(dvrWriteBufferIsValid(write_buffer));
1012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  dvrReadBufferCreateEmpty(&read_buffer);
1032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_NE(nullptr, read_buffer);
1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  dvrWriteBufferCreateEmpty(&write_buffer);
1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_NE(nullptr, write_buffer);
1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_FALSE(dvrReadBufferIsValid(read_buffer));
1092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_FALSE(dvrWriteBufferIsValid(write_buffer));
1102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrReadBufferQueue* read_queue = nullptr;
1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_EQ(0, dvrWriteBufferQueueCreateReadQueue(write_queue_, &read_queue));
1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  const int kTimeoutMs = 0;
1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int fence_fd = -1;
1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_EQ(0, dvrWriteBufferQueueDequeue(write_queue_, kTimeoutMs,
1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                          write_buffer, &fence_fd));
1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_EQ(-1, fence_fd);
1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_TRUE(dvrWriteBufferIsValid(write_buffer));
1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_EQ(0, dvrWriteBufferClear(write_buffer));
1232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  EXPECT_FALSE(dvrWriteBufferIsValid(write_buffer));
1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1262d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestDequeuePostDequeueRelease) {
1272d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  static constexpr int kTimeout = 0;
1282d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
1292d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBuffer* rb = nullptr;
1302d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrWriteBuffer* wb = nullptr;
1312d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  int fence_fd = -1;
1322d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1332d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  int ret = dvrWriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
1342d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1352d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1362d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue);
1372d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  dvrWriteBufferCreateEmpty(&wb);
1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_NE(nullptr, wb);
1402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  dvrReadBufferCreateEmpty(&rb);
1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_NE(nullptr, rb);
1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1442d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  AllocateBuffers(kQueueCapacity);
1452d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1462d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Gain buffer for writing.
1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ret = dvrWriteBufferQueueDequeue(write_queue_, kTimeout, wb, &fence_fd);
1482d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_TRUE(dvrWriteBufferIsValid(wb));
1502d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, gain buffer %p, fence_fd=%d",
1512d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           wb, fence_fd);
1522d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  pdx::LocalHandle release_fence(fence_fd);
1532d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1542d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Post buffer to the read_queue.
1552d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  TestMeta seq = 42U;
1562d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ret = dvrWriteBufferPost(wb, /* fence */ -1, &seq, sizeof(seq));
1572d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1582d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrWriteBufferDestroy(wb);
1592d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  wb = nullptr;
1602d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1612d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Acquire buffer for reading.
1622d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  TestMeta acquired_seq = 0U;
1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ret = dvrReadBufferQueueDequeue(read_queue, kTimeout, rb, &fence_fd,
1642d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai                                  &acquired_seq, sizeof(acquired_seq));
1652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_TRUE(dvrReadBufferIsValid(rb));
1672d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(seq, acquired_seq);
1682d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE,
1692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           "TestDequeuePostDequeueRelease, acquire buffer %p, fence_fd=%d", rb,
1702d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           fence_fd);
1712d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  pdx::LocalHandle acquire_fence(fence_fd);
1722d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1732d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Release buffer to the write_queue.
1742d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ret = dvrReadBufferRelease(rb, -1);
1752d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1762d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrReadBufferDestroy(rb);
1772d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  rb = nullptr;
1782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // TODO(b/34387835) Currently buffer allocation has to happen after all queues
1802d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // are initialized.
1812d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  size_t capacity = dvrReadBufferQueueGetCapacity(read_queue);
1822d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1832d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, capacity=%zu", capacity);
1842d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(kQueueCapacity, capacity);
1852d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1862d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  dvrReadBufferQueueDestroy(read_queue);
1872d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
1882d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
189960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, TestGetExternalSurface) {
190960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ANativeWindow* window = nullptr;
191cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai
192cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  // The |write_queue_| doesn't have proper metadata (must be
193cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  // DvrNativeBufferMetadata) configured during creation.
194960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  int ret = dvrWriteBufferQueueGetExternalSurface(write_queue_, &window);
195cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  ASSERT_EQ(-EINVAL, ret);
196cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  ASSERT_EQ(nullptr, window);
197cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai
198cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  // A write queue with DvrNativeBufferMetadata should work fine.
199cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  std::unique_ptr<DvrWriteBufferQueue, decltype(&dvrWriteBufferQueueDestroy)>
2002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      write_queue(
2012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          CreateDvrWriteBufferQueueFromProducerQueue(
2022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka              ProducerQueue::Create<DvrNativeBufferMetadata>(0, 0, 0, 0)),
2032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          dvrWriteBufferQueueDestroy);
2042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  ASSERT_NE(nullptr, write_queue.get());
205960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
206cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai  ret = dvrWriteBufferQueueGetExternalSurface(write_queue.get(), &window);
207960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
208960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ASSERT_NE(nullptr, window);
209960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
210960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  sp<Surface> surface = static_cast<Surface*>(window);
211960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ASSERT_TRUE(Surface::isValid(surface));
212960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai}
213960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
2142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}  // namespace
2152d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}  // namespace dvr
2172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}  // namespace android
218