BufferQueue: add a setMaxAcquiredBufferCount check
This change adds a check to verify the validity of the value passed to setMaxAcquiredBufferCount. Change-Id: I39730557aa58261e678bd6e4fce11bab78e98362
This commit is contained in:
parent
9e75ddda93
commit
c68f2ecfa0
@ -41,6 +41,10 @@ public:
|
||||
enum { INVALID_BUFFER_SLOT = -1 };
|
||||
enum { STALE_BUFFER_SLOT = 1, NO_BUFFER_AVAILABLE };
|
||||
|
||||
// When in async mode we reserve two slots in order to guarantee that the
|
||||
// producer and consumer can run asynchronously.
|
||||
enum { MAX_MAX_ACQUIRED_BUFFERS = NUM_BUFFER_SLOTS - 2 };
|
||||
|
||||
// ConsumerListener is the interface through which the BufferQueue notifies
|
||||
// the consumer of events that the consumer may wish to react to. Because
|
||||
// the consumer will generally have a mutex that is locked during calls from
|
||||
|
@ -974,6 +974,11 @@ status_t BufferQueue::setDefaultMaxBufferCount(int bufferCount) {
|
||||
status_t BufferQueue::setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
|
||||
ATRACE_CALL();
|
||||
Mutex::Autolock lock(mMutex);
|
||||
if (maxAcquiredBuffers < 1 || maxAcquiredBuffers > MAX_MAX_ACQUIRED_BUFFERS) {
|
||||
ST_LOGE("setMaxAcquiredBufferCount: invalid count specified: %d",
|
||||
maxAcquiredBuffers);
|
||||
return BAD_VALUE;
|
||||
}
|
||||
if (mConnectedApi != NO_CONNECTED_API) {
|
||||
return INVALID_OPERATION;
|
||||
}
|
||||
|
@ -93,4 +93,25 @@ TEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
|
||||
ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item));
|
||||
}
|
||||
|
||||
TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
|
||||
sp<DummyConsumer> dc(new DummyConsumer);
|
||||
mBQ->consumerConnect(dc);
|
||||
|
||||
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(0));
|
||||
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(-3));
|
||||
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(
|
||||
BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
|
||||
ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(100));
|
||||
}
|
||||
|
||||
TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
|
||||
sp<DummyConsumer> dc(new DummyConsumer);
|
||||
mBQ->consumerConnect(dc);
|
||||
|
||||
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(1));
|
||||
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(2));
|
||||
ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(
|
||||
BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
Loading…
Reference in New Issue
Block a user