status_t ISVBufferManager::useBuffer(const sp<ANativeWindowBuffer> nativeBuffer) { Mutex::Autolock autoLock(mBufferLock); if (nativeBuffer == NULL || mBuffers.size() >= mBuffers.capacity()) return BAD_VALUE; for (uint32_t i = 0; i < mBuffers.size(); i++) { ISVBuffer* isvBuffer = mBuffers.itemAt(i); if (isvBuffer->getHandle() == (unsigned long)nativeBuffer->handle) { ALOGE("%s: this buffer 0x%08x has already been registered", __func__, nativeBuffer->handle); return UNKNOWN_ERROR; } } ISVBuffer* isvBuffer = new ISVBuffer(mWorker, (unsigned long)nativeBuffer->handle, (unsigned long)nativeBuffer->handle, nativeBuffer->width, nativeBuffer->height, nativeBuffer->stride, nativeBuffer->format, mMetaDataMode ? ISVBuffer::ISV_BUFFER_METADATA : ISVBuffer::ISV_BUFFER_GRALLOC); ALOGD_IF(ISV_BUFFER_MANAGER_DEBUG, "%s: add handle 0x%08x, and then mBuffers.size() %d", __func__, nativeBuffer->handle, mBuffers.size()); mBuffers.push_back(isvBuffer); return OK; }
status_t ISVBufferManager::useBuffer(unsigned long handle) { Mutex::Autolock autoLock(mBufferLock); if (handle == 0 || mBuffers.size() >= mBuffers.capacity()) return BAD_VALUE; for (uint32_t i = 0; i < mBuffers.size(); i++) { ISVBuffer* isvBuffer = mBuffers.itemAt(i); if (isvBuffer->getHandle() == handle) { ALOGE("%s: this buffer 0x%08lx has already been registered", __func__, handle); return UNKNOWN_ERROR; } } ISVBuffer* isvBuffer = new ISVBuffer(mWorker, handle, mMetaDataMode ? ISVBuffer::ISV_BUFFER_METADATA : ISVBuffer::ISV_BUFFER_GRALLOC, mNeedClearBuffers ? ISVBuffer::ISV_BUFFER_NEED_CLEAR : 0); ALOGD_IF(ISV_BUFFER_MANAGER_DEBUG, "%s: add handle 0x%08lx, and then mBuffers.size() %d", __func__, handle, mBuffers.size()); mBuffers.push_back(isvBuffer); return OK; }
ISVBuffer* ISVBufferManager::mapBuffer(unsigned long handle) { Mutex::Autolock autoLock(mBufferLock); for (uint32_t i = 0; i < mBuffers.size(); i++) { ISVBuffer* isvBuffer = mBuffers.itemAt(i); if (isvBuffer->getHandle() == handle) return isvBuffer; } return NULL; }
status_t ISVBufferManager::freeBuffer(unsigned long handle) { Mutex::Autolock autoLock(mBufferLock); for (uint32_t i = 0; i < mBuffers.size(); i++) { ISVBuffer* isvBuffer = mBuffers.itemAt(i); if (isvBuffer->getHandle() == handle) { delete isvBuffer; mBuffers.removeAt(i); ALOGD_IF(ISV_BUFFER_MANAGER_DEBUG, "%s: remove handle 0x%08x, and then mBuffers.size() %d", __func__, handle, mBuffers.size()); return OK; } } ALOGW("%s: can't find buffer %u", __func__, handle); return UNKNOWN_ERROR; }