Merge "Create test with AImageReader_getWindow to IGBP" into main
diff --git a/media/ndk/tests/AImageReaderWindowHandleTest.cpp b/media/ndk/tests/AImageReaderWindowHandleTest.cpp
index 5608d57..a32b51f 100644
--- a/media/ndk/tests/AImageReaderWindowHandleTest.cpp
+++ b/media/ndk/tests/AImageReaderWindowHandleTest.cpp
@@ -22,6 +22,7 @@
#include <media/NdkImage.h>
#include <mediautils/AImageReaderUtils.h>
#include <gui/IGraphicBufferProducer.h>
+#include <gui/Surface.h>
#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
#include <NdkImagePriv.h>
#include <NdkImageReaderPriv.h>
@@ -112,6 +113,62 @@
static void onBufferRemoved(void *, AImageReader *, AHardwareBuffer *) {
}
+ static void fillRGBA8Buffer(uint8_t* buf, int w, int h, int stride) {
+ const size_t PIXEL_SIZE = 4;
+ for (int x = 0; x < w; x++) {
+ for (int y = 0; y < h; y++) {
+ off_t offset = (y * stride + x) * PIXEL_SIZE;
+ for (int c = 0; c < 4; c++) {
+ int parityX = (x / (1 << (c+2))) & 1;
+ int parityY = (y / (1 << (c+2))) & 1;
+ buf[offset + c] = (parityX ^ parityY) ? 231 : 35;
+ }
+ }
+ }
+ }
+
+ void validateIGBP(sp<IGraphicBufferProducer>& igbp) {
+ int dequeuedSlot = -1;
+ sp<Fence> dequeuedFence;
+ IGraphicBufferProducer::QueueBufferOutput output;
+ ASSERT_EQ(OK, igbp->connect(nullptr, NATIVE_WINDOW_API_CPU, false, &output));
+
+ // Test that we can dequeue a buffer.
+ ASSERT_EQ(OK,
+ ~IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION &
+ (igbp->dequeueBuffer(&dequeuedSlot, &dequeuedFence,
+ kImageWidth, kImageHeight,
+ kImageFormat, kImageBufferUsage,
+ nullptr, nullptr)));
+ EXPECT_LE(0, dequeuedSlot);
+ EXPECT_GT(BufferQueue::NUM_BUFFER_SLOTS, dequeuedSlot);
+
+ sp<GraphicBuffer> dequeuedBuffer;
+ igbp->requestBuffer(dequeuedSlot, &dequeuedBuffer);
+ uint8_t* img = nullptr;
+ ASSERT_EQ(NO_ERROR, dequeuedBuffer->lock(kImageBufferUsage, (void**)(&img)));
+
+ // Write in some placeholder image data.
+ fillRGBA8Buffer(img, dequeuedBuffer->getWidth(), dequeuedBuffer->getHeight(),
+ dequeuedBuffer->getStride());
+ ASSERT_EQ(NO_ERROR, dequeuedBuffer->unlock());
+ QueueBufferInput queueBufferInput(kQueueBufferInputTimeStamp,
+ kQueueBufferInputIsAutoTimeStamp,
+ kQueueBufferInputDataspace,
+ kQueueBufferInputRect,
+ kQueueBufferInputScalingMode,
+ kQueueBufferInputTransform,
+ kQueueBufferInputFence);
+ QueueBufferOutput queueBufferOutput;
+ ASSERT_EQ(OK, igbp->queueBuffer(dequeuedSlot, queueBufferInput,
+ &queueBufferOutput));
+ // wait until the onImageAvailable callback is called, or timeout completes.
+ std::unique_lock<std::mutex> lock(imageAvailableMutex_);
+ imageCondVar_.wait_for(lock, std::chrono::microseconds(kOnImageAvailableWaitUs),
+ [this]{ return this->imageAvailable_;});
+ EXPECT_TRUE(imageAvailable_) << "Timed out waiting for image data to be handled!\n";
+ }
+
AImageReader *imageReader_ = nullptr;
AImageReader_ImageListener imageReaderAvailableCb_{this, onImageAvailable};
AImageReader_BufferRemovedListener imageReaderDetachedCb_{this, onBufferRemoved};
@@ -120,19 +177,6 @@
bool imageAvailable_ = false;
};
-static void fillRGBA8Buffer(uint8_t* buf, int w, int h, int stride) {
- const size_t PIXEL_SIZE = 4;
- for (int x = 0; x < w; x++) {
- for (int y = 0; y < h; y++) {
- off_t offset = (y * stride + x) * PIXEL_SIZE;
- for (int c = 0; c < 4; c++) {
- int parityX = (x / (1 << (c+2))) & 1;
- int parityY = (y / (1 << (c+2))) & 1;
- buf[offset + c] = (parityX ^ parityY) ? 231 : 35;
- }
- }
- }
-}
TEST_F(AImageReaderWindowHandleTest, CreateWindowNativeHandle) {
// Check that we can create a native_handle_t corresponding to the
@@ -157,45 +201,19 @@
sp<HGraphicBufferProducer> hgbp = AImageReader_getHGBPFromHandle(nh);
ASSERT_NE(hgbp, nullptr);
sp<IGraphicBufferProducer> igbp = new H2BGraphicBufferProducer(hgbp);
- int dequeuedSlot = -1;
- sp<Fence> dequeuedFence;
- IGraphicBufferProducer::QueueBufferOutput output;
- ASSERT_EQ(OK, igbp->connect(nullptr, NATIVE_WINDOW_API_CPU, false, &output));
- // Test that we can dequeue a buffer.
- ASSERT_EQ(OK,
- ~IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION &
- (igbp->dequeueBuffer(&dequeuedSlot, &dequeuedFence,
- kImageWidth, kImageHeight,
- kImageFormat, kImageBufferUsage,
- nullptr, nullptr)));
- EXPECT_LE(0, dequeuedSlot);
- EXPECT_GT(BufferQueue::NUM_BUFFER_SLOTS, dequeuedSlot);
+ validateIGBP(igbp);
+}
- sp<GraphicBuffer> dequeuedBuffer;
- igbp->requestBuffer(dequeuedSlot, &dequeuedBuffer);
- uint8_t* img = nullptr;
- ASSERT_EQ(NO_ERROR, dequeuedBuffer->lock(kImageBufferUsage, (void**)(&img)));
+TEST_F(AImageReaderWindowHandleTest, CreateWindow) {
+ ANativeWindow* window = nullptr;
+ media_status_t status = AImageReader_getWindow(imageReader_, &window);
- // Write in some dummy image data.
- fillRGBA8Buffer(img, dequeuedBuffer->getWidth(), dequeuedBuffer->getHeight(),
- dequeuedBuffer->getStride());
- ASSERT_EQ(NO_ERROR, dequeuedBuffer->unlock());
- QueueBufferInput queueBufferInput(kQueueBufferInputTimeStamp,
- kQueueBufferInputIsAutoTimeStamp,
- kQueueBufferInputDataspace,
- kQueueBufferInputRect,
- kQueueBufferInputScalingMode,
- kQueueBufferInputTransform,
- kQueueBufferInputFence);
- QueueBufferOutput queueBufferOutput;
- ASSERT_EQ(OK, igbp->queueBuffer(dequeuedSlot, queueBufferInput,
- &queueBufferOutput));
- // wait until the onImageAvailable callback is called, or timeout completes.
- std::unique_lock<std::mutex> lock(imageAvailableMutex_);
- imageCondVar_.wait_for(lock, std::chrono::microseconds(kOnImageAvailableWaitUs),
- [this]{ return this->imageAvailable_;});
- EXPECT_TRUE(imageAvailable_) << "Timed out waiting for image data to be handled!\n";
+ ASSERT_NE(window, nullptr);
+
+ sp<IGraphicBufferProducer> igbp = Surface::getIGraphicBufferProducer(window);
+
+ validateIGBP(igbp);
}
class AImageReaderPrivateFormatTest : public ::testing::Test {