1d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <android/log.h> 2d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <android/native_window.h> 3cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai#include <dvr/dvr_api.h> 42d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <dvr/dvr_buffer_queue.h> 52d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 62d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <gtest/gtest.h> 72d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 8d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <array> 9d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <unordered_map> 102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 119b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang#include "dvr_api_test.h" 129b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang 13869c6d0e652fab846db377632f6f429290faf400TianyuJiang#define LOG_TAG "dvr_buffer_queue-test" 14869c6d0e652fab846db377632f6f429290faf400TianyuJiang 15d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#ifndef ALOGD 16d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) 17d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#endif 18d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai 19d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#ifndef ALOGD_IF 20d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#define ALOGD_IF(cond, ...) \ 21d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ((__predict_false(cond)) ? ((void)ALOGD(__VA_ARGS__)) : (void)0) 22d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#endif 232d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 242d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cainamespace { 252d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 26656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kBufferWidth = 100; 27656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kBufferHeight = 1; 28656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kLayerCount = 1; 29d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Caistatic constexpr uint32_t kBufferFormat = AHARDWAREBUFFER_FORMAT_BLOB; 30d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Caistatic constexpr uint64_t kBufferUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN; 312d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr size_t kQueueCapacity = 3; 322d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 339b44532d648d88732c6f17820cf6418c025aecaeTianyuJiangclass DvrBufferQueueTest : public DvrApiTest { 340b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai public: 350b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai static void BufferAvailableCallback(void* context) { 360b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context); 370b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai thiz->HandleBufferAvailable(); 380b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai } 390b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 400b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai static void BufferRemovedCallback(DvrReadBuffer* buffer, void* context) { 410b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context); 420b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai thiz->HandleBufferRemoved(buffer); 430b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai } 440b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 452d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai protected: 462d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai void TearDown() override { 472d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai if (write_queue_ != nullptr) { 48274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.WriteBufferQueueDestroy(write_queue_); 492d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai write_queue_ = nullptr; 502d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai } 519b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang DvrApiTest::TearDown(); 522d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai } 532d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 540b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai void HandleBufferAvailable() { 550b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai buffer_available_count_ += 1; 560b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "Buffer avaiable, count=%d", buffer_available_count_); 570b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai } 580b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 590b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai void HandleBufferRemoved(DvrReadBuffer* buffer) { 600b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai buffer_removed_count_ += 1; 610b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "Buffer removed, buffer=%p, count=%d", buffer, 620b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai buffer_removed_count_); 630b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai } 640b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrWriteBufferQueue* write_queue_{nullptr}; 660b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai int buffer_available_count_{0}; 670b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai int buffer_removed_count_{0}; 682d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}; 692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 70638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, WriteQueueCreateDestroy) { 71274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 72d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 73638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_); 74d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 7542c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 76274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.WriteBufferQueueDestroy(write_queue_); 772d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai write_queue_ = nullptr; 782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} 792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 80638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, WriteQueueGetCapacity) { 81274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 82d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 83638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 84d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 8542c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 86274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang size_t capacity = api_.WriteBufferQueueGetCapacity(write_queue_); 872d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 882d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ALOGD_IF(TRACE, "TestWrite_QueueGetCapacity, capacity=%zu", capacity); 892d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_EQ(kQueueCapacity, capacity); 902d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} 912d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 92638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, CreateReadQueueFromWriteQueue) { 93274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 94d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 95638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_); 96d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 9742c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 982d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 99274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue); 1002d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 1012d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_EQ(0, ret); 1022d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_NE(nullptr, read_queue); 1032d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 104274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueDestroy(read_queue); 1052d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} 1062d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 107638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, CreateReadQueueFromReadQueue) { 108274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 109d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 110638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_); 111d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 11242c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 1132d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrReadBufferQueue* read_queue1 = nullptr; 1142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrReadBufferQueue* read_queue2 = nullptr; 115274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue1); 1162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 1172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_EQ(0, ret); 1182d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_NE(nullptr, read_queue1); 1192d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 120274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueCreateReadQueue(read_queue1, &read_queue2); 1212d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_EQ(0, ret); 1222d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_NE(nullptr, read_queue2); 1232d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_NE(read_queue1, read_queue2); 1242d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 125274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueDestroy(read_queue1); 126274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueDestroy(read_queue2); 1272d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} 1282d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 129638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, GainBuffer) { 130274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 131d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 132638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 133638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 135638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai DvrWriteBuffer* wb = nullptr; 136274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang EXPECT_FALSE(api_.WriteBufferIsValid(wb)); 1372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 13852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka DvrNativeBufferMetadata meta; 1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka int fence_fd = -1; 140274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb, &meta, 141274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &fence_fd); 142638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 143638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai EXPECT_EQ(fence_fd, -1); 144638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai EXPECT_NE(wb, nullptr); 145274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang EXPECT_TRUE(api_.WriteBufferIsValid(wb)); 1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 148638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, AcquirePostGainRelease) { 149274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 150d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 151638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 152638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 15342c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 1542d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 1552d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrReadBuffer* rb = nullptr; 1562d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai DvrWriteBuffer* wb = nullptr; 15752ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka DvrNativeBufferMetadata meta1; 15852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka DvrNativeBufferMetadata meta2; 1592d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai int fence_fd = -1; 1602d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 161274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue); 1622d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 163638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 164638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_NE(read_queue, nullptr); 1652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 166274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueSetBufferAvailableCallback( 167274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang read_queue, &BufferAvailableCallback, this); 1680b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 1692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // Gain buffer for writing. 170274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb, 171274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &meta1, &fence_fd); 172638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 173638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_NE(wb, nullptr); 174274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wb)); 1752d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, gain buffer %p, fence_fd=%d", 1762d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai wb, fence_fd); 177ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai close(fence_fd); 1782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 1792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // Post buffer to the read_queue. 180638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai meta1.timestamp = 42; 181274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueuePostBuffer(write_queue_, wb, &meta1, /*fence=*/-1); 182638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 183274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_FALSE(api_.WriteBufferIsValid(wb)); 1842d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai wb = nullptr; 1852d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 1862d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // Acquire buffer for reading. 187274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10, &rb, 188274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &meta2, &fence_fd); 189638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 190638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_NE(rb, nullptr); 1910b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 1920b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai // Dequeue is successfully, BufferAvailableCallback should be fired once. 193638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(buffer_available_count_, 1); 194274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.ReadBufferIsValid(rb)); 195638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai 196638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai // Metadata should be passed along from producer to consumer properly. 197638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(meta1.timestamp, meta2.timestamp); 198638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai 1992d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ALOGD_IF(TRACE, 2002d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai "TestDequeuePostDequeueRelease, acquire buffer %p, fence_fd=%d", rb, 2012d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai fence_fd); 202ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai close(fence_fd); 2032d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 2042d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // Release buffer to the write_queue. 205274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rb, &meta2, 206274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang /*release_fence_fd=*/-1); 207638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 208274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_FALSE(api_.ReadBufferIsValid(rb)); 2092d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai rb = nullptr; 2102d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 2112d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // TODO(b/34387835) Currently buffer allocation has to happen after all queues 2122d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai // are initialized. 213274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang size_t capacity = api_.ReadBufferQueueGetCapacity(read_queue); 2142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 2152d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, capacity=%zu", capacity); 2162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai ASSERT_EQ(kQueueCapacity, capacity); 2172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 218274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueDestroy(read_queue); 2192d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} 2202d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 221638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, GetANativeWindow) { 222274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 223d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 224639d479b8a432771f7fa5ae4b93f677d2c8eb125Jiwen 'Steve' Cai /*capacity=*/0, /*user_metadata_size=*/0, &write_queue_); 225d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 226d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_NE(nullptr, write_queue_); 227960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai 228638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ANativeWindow* window = nullptr; 229274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGetANativeWindow(write_queue_, &window); 230960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 231960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai ASSERT_NE(nullptr, window); 232960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai 233d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai uint32_t width = ANativeWindow_getWidth(window); 234d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai uint32_t height = ANativeWindow_getHeight(window); 235d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai uint32_t format = ANativeWindow_getFormat(window); 236d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(kBufferWidth, width); 237d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(kBufferHeight, height); 238d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(kBufferFormat, format); 239960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai} 240960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai 241656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Create buffer queue of three buffers and dequeue three buffers out of it. 242656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Before each dequeue operation, we resize the buffer queue and expect the 243656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// queue always return buffer with desired dimension. 244638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ResizeBuffer) { 245274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 246d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 247638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 248d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 24942c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai 250656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int fence_fd = -1; 251656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 25252ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka DvrNativeBufferMetadata meta; 2530b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 254656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai DvrWriteBuffer* wb1 = nullptr; 255656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai DvrWriteBuffer* wb2 = nullptr; 256656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai DvrWriteBuffer* wb3 = nullptr; 257656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer* ahb1 = nullptr; 258656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer* ahb2 = nullptr; 259656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer* ahb3 = nullptr; 260656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_Desc buffer_desc; 261656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 262274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue); 2630b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 2640b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 2650b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_NE(nullptr, read_queue); 2660b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 267274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueSetBufferRemovedCallback(read_queue, 268274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &BufferRemovedCallback, this); 2690b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 2700b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai // Handle all pending events on the read queue. 271274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueHandleEvents(read_queue); 2720b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 2730b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 274274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang size_t capacity = api_.ReadBufferQueueGetCapacity(read_queue); 2750b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "TestResizeBuffer, capacity=%zu", capacity); 2760b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(kQueueCapacity, capacity); 2770b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 278656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Resize before dequeuing. 2790b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai constexpr uint32_t w1 = 10; 280274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w1, kBufferHeight); 2810b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 282656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 283656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Gain first buffer for writing. All buffers will be resized. 284274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb1, 285274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &meta, &fence_fd); 286656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 287274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wb1)); 2880b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p", wb1); 289ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai close(fence_fd); 290656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 291656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Check the buffer dimension. 292274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferGetAHardwareBuffer(wb1, &ahb1); 293656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 294656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_describe(ahb1, &buffer_desc); 295656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(w1, buffer_desc.width); 296656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(kBufferHeight, buffer_desc.height); 297656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_release(ahb1); 298656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 2990b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai // For the first resize, all buffers are reallocated. 3000b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai int expected_buffer_removed_count = kQueueCapacity; 301274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueHandleEvents(read_queue); 3020b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 3030b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_); 3040b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 305656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Resize the queue. We are testing with blob format, keep height to be 1. 3060b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai constexpr uint32_t w2 = 20; 307274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w2, kBufferHeight); 308656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 309656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 310656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // The next buffer we dequeued should have new width. 311274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb2, 312274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &meta, &fence_fd); 313656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 314274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wb2)); 3150b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p, fence_fd=%d", wb2, 316656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai fence_fd); 317ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai close(fence_fd); 318656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 319656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Check the buffer dimension, should be new width 320274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferGetAHardwareBuffer(wb2, &ahb2); 321656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 322656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_describe(ahb2, &buffer_desc); 323656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(w2, buffer_desc.width); 324656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_release(ahb2); 325656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 3260b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai // For the second resize, all but one buffers are reallocated. 3270b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai expected_buffer_removed_count += (kQueueCapacity - 1); 328274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueHandleEvents(read_queue); 3290b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 3300b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_); 3310b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 332656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Resize the queue for the third time. 3330b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai constexpr uint32_t w3 = 30; 334274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w3, kBufferHeight); 335656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 336656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 337656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // The next buffer we dequeued should have new width. 338274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb3, 339274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &meta, &fence_fd); 340656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 341274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wb3)); 3420b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p, fence_fd=%d", wb3, 343656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai fence_fd); 344ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai close(fence_fd); 345656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 346656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Check the buffer dimension, should be new width 347274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferGetAHardwareBuffer(wb3, &ahb3); 348656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(0, ret); 349656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_describe(ahb3, &buffer_desc); 350656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai ASSERT_EQ(w3, buffer_desc.width); 351656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai AHardwareBuffer_release(ahb3); 3520b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 3530b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai // For the third resize, all but two buffers are reallocated. 3540b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai expected_buffer_removed_count += (kQueueCapacity - 2); 355274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.ReadBufferQueueHandleEvents(read_queue); 3560b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 3570b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_); 3580b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai 359274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang api_.ReadBufferQueueDestroy(read_queue); 360656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai} 361656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 362638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ReadQueueEventFd) { 363274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 364d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 365638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 366d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 36797274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai 36897274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 369274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue); 37097274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai 37197274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai ASSERT_EQ(0, ret); 37297274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai ASSERT_NE(nullptr, read_queue); 37397274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai 374274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int event_fd = api_.ReadBufferQueueGetEventFd(read_queue); 37597274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai ASSERT_GT(event_fd, 0); 37697274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai} 37797274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai 37808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// Verifies a Dvr{Read,Write}BufferQueue contains the same set of 37908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// Dvr{Read,Write}Buffer(s) during their lifecycles. And for the same buffer_id, 38008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// the corresponding AHardwareBuffer handle stays the same. 381638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, StableBufferIdAndHardwareBuffer) { 382274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueCreate( 383d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 384638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 385d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 38608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 38708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai int fence_fd = -1; 38808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 389274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang EXPECT_EQ(0, api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue)); 39008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 39108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Read buffers. 39208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::array<DvrReadBuffer*, kQueueCapacity> rbs; 39308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Write buffers. 39408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::array<DvrWriteBuffer*, kQueueCapacity> wbs; 395638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai // Buffer metadata. 396638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai std::array<DvrNativeBufferMetadata, kQueueCapacity> metas; 39708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Hardware buffers for Read buffers. 39808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::unordered_map<int, AHardwareBuffer*> rhbs; 39908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Hardware buffers for Write buffers. 40008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::unordered_map<int, AHardwareBuffer*> whbs; 40108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 40208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai constexpr int kNumTests = 100; 40308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 40408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // This test runs the following operations many many times. Thus we prefer to 40508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // use ASSERT_XXX rather than EXPECT_XXX to avoid spamming the output. 40608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::function<void(size_t i)> Gain = [&](size_t i) { 407274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/10, 408274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &wbs[i], &metas[i], &fence_fd); 409638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 41008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_LT(fence_fd, 0); // expect invalid fence. 411274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wbs[i])); 412274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int buffer_id = api_.WriteBufferGetId(wbs[i]); 41308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_GT(buffer_id, 0); 41408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 41508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai AHardwareBuffer* hb = nullptr; 416274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_EQ(0, api_.WriteBufferGetAHardwareBuffer(wbs[i], &hb)); 41708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 41808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai auto whb_it = whbs.find(buffer_id); 41908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai if (whb_it == whbs.end()) { 42008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // If this is a new buffer id, check that total number of unique 42108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // hardware buffers won't exceed queue capacity. 42208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_LT(whbs.size(), kQueueCapacity); 42308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai whbs.emplace(buffer_id, hb); 42408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } else { 42508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // If this is a buffer id we have seen before, check that the 42608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // buffer_id maps to the same AHardwareBuffer handle. 42708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_EQ(hb, whb_it->second); 42808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 42908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai }; 43008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 43108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::function<void(size_t i)> Post = [&](size_t i) { 432274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.WriteBufferIsValid(wbs[i])); 43308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 434638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai metas[i].timestamp++; 435274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.WriteBufferQueuePostBuffer(write_queue_, wbs[i], &metas[i], 436274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang /*fence=*/-1); 437638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 43808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai }; 43908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 44008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::function<void(size_t i)> Acquire = [&](size_t i) { 441274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10, 442274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang &rbs[i], &metas[i], &fence_fd); 443638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 44408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_LT(fence_fd, 0); // expect invalid fence. 445274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.ReadBufferIsValid(rbs[i])); 44608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 447274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int buffer_id = api_.ReadBufferGetId(rbs[i]); 44808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_GT(buffer_id, 0); 44908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 45008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai AHardwareBuffer* hb = nullptr; 451274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_EQ(0, api_.ReadBufferGetAHardwareBuffer(rbs[i], &hb)); 45208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 45308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai auto rhb_it = rhbs.find(buffer_id); 45408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai if (rhb_it == rhbs.end()) { 45508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // If this is a new buffer id, check that total number of unique hardware 45608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // buffers won't exceed queue capacity. 45708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_LT(rhbs.size(), kQueueCapacity); 45808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai rhbs.emplace(buffer_id, hb); 45908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } else { 46008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // If this is a buffer id we have seen before, check that the buffer_id 46108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // maps to the same AHardwareBuffer handle. 46208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_EQ(hb, rhb_it->second); 46308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 46408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai }; 46508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 46608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai std::function<void(size_t i)> Release = [&](size_t i) { 467274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang ASSERT_TRUE(api_.ReadBufferIsValid(rbs[i])); 46808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 469274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang int ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rbs[i], &metas[i], 470274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang /*release_fence_fd=*/-1); 471638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 47208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai }; 47308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 47408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Scenario one: 47508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (int i = 0; i < kNumTests; i++) { 47608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Gain all write buffers. 47708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 47808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Gain(i)); 47908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 48008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Post all write buffers. 48108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 48208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Post(i)); 48308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 48408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Acquire all read buffers. 48508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 48608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Acquire(i)); 48708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 48808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Release all read buffers. 48908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 49008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Release(i)); 49108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 49208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 49308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 49408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Scenario two: 49508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (int i = 0; i < kNumTests; i++) { 49608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Gain and post all write buffers. 49708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 49808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Gain(i)); 49908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Post(i)); 50008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 50108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Acquire and release all read buffers. 50208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 50308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Acquire(i)); 50408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Release(i)); 50508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 50608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 50708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 50808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Scenario three: 50908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (int i = 0; i < kNumTests; i++) { 51008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Gain all write buffers then post them in reversed order. 51108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 51208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Gain(i)); 51308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 51408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 51508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Post(kQueueCapacity - 1 - i)); 51608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 51708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 51808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai // Acquire all write buffers then release them in reversed order. 51908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 52008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Acquire(i)); 52108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 52208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai for (size_t i = 0; i < kQueueCapacity; i++) { 52308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(Release(kQueueCapacity - 1 - i)); 52408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 52508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai } 52608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai} 52708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai 528b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ConsumerReleaseAfterProducerDestroy) { 529b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai int ret = api_.WriteBufferQueueCreate( 530b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage, 531b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_); 532b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 533b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 534b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai DvrReadBufferQueue* read_queue = nullptr; 535b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai DvrReadBuffer* rb = nullptr; 536b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai DvrWriteBuffer* wb = nullptr; 537b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai DvrNativeBufferMetadata meta1; 538b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai DvrNativeBufferMetadata meta2; 539b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai int fence_fd = -1; 540b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 541b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue); 542b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 543b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 544b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai api_.ReadBufferQueueSetBufferAvailableCallback( 545b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai read_queue, &BufferAvailableCallback, this); 546b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 547b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // Gain buffer for writing. 548b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb, 549b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai &meta1, &fence_fd); 550b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 551b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai close(fence_fd); 552b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 553b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // Post buffer to the read_queue. 554b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.WriteBufferQueuePostBuffer(write_queue_, wb, &meta1, /*fence=*/-1); 555b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 556b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai wb = nullptr; 557b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 558b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // Acquire buffer for reading. 559b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10, &rb, 560b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai &meta2, &fence_fd); 561b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 562b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai close(fence_fd); 563b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 564b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // Destroy the write buffer queue and make sure the reader queue is picking 565b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // these events up. 566b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai api_.WriteBufferQueueDestroy(write_queue_); 567b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.ReadBufferQueueHandleEvents(read_queue); 568b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(0, ret); 569b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 570b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai // Release buffer to the write_queue. 571b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rb, &meta2, 572b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai /*release_fence_fd=*/-1); 573b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai ASSERT_EQ(ret, 0); 574b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai rb = nullptr; 575b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 576b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai api_.ReadBufferQueueDestroy(read_queue); 577b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai} 578b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai 5792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai} // namespace 580