// preview callback - frame buffer update void CameraClient::handlePreviewData(int32_t msgType, const sp<IMemory>& mem, camera_frame_metadata_t *metadata) { ssize_t offset; size_t size; sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); // local copy of the callback flags int flags = mPreviewCallbackFlag; // is callback enabled? if (!(flags & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK)) { // If the enable bit is off, the copy-out and one-shot bits are ignored LOG2("frame callback is disabled"); //!++ #if 1 #else mLock.unlock(); #endif //!-- return; } // hold a strong pointer to the client sp<ICameraClient> c = mRemoteCallback; // clear callback flags if no client or one-shot mode if (c == 0 || (mPreviewCallbackFlag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK)) { LOG2("Disable preview callback"); mPreviewCallbackFlag &= ~(CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK | CAMERA_FRAME_CALLBACK_FLAG_COPY_OUT_MASK | CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); disableMsgType(CAMERA_MSG_PREVIEW_FRAME); } if (c != 0) { // Is the received frame copied out or not? if (flags & CAMERA_FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { LOG2("frame is copied"); copyFrameAndPostCopiedFrame(msgType, c, heap, offset, size, metadata); } else { LOG2("frame is forwarded"); //!++ #if 1 #else mLock.unlock(); #endif //!-- c->dataCallback(msgType, mem, metadata); } } else { //!++ #if 1 #else mLock.unlock(); #endif //!-- } }
// preview callback - frame buffer update void CameraService::Client::handlePreviewData(const sp<IMemory>& mem) { ssize_t offset; size_t size; sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); if (!mUseOverlay) { if (mSurface != 0) { mSurface->postBuffer(offset); } } // local copy of the callback flags int flags = mPreviewCallbackFlag; // is callback enabled? if (!(flags & FRAME_CALLBACK_FLAG_ENABLE_MASK)) { // If the enable bit is off, the copy-out and one-shot bits are ignored LOG2("frame callback is disabled"); mLock.unlock(); return; } // hold a strong pointer to the client sp<ICameraClient> c = mCameraClient; // clear callback flags if no client or one-shot mode if (c == 0 || (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK)) { LOG2("Disable preview callback"); mPreviewCallbackFlag &= ~(FRAME_CALLBACK_FLAG_ONE_SHOT_MASK | FRAME_CALLBACK_FLAG_COPY_OUT_MASK | FRAME_CALLBACK_FLAG_ENABLE_MASK); if (mUseOverlay) { disableMsgType(CAMERA_MSG_PREVIEW_FRAME); } } if (c != 0) { // Is the received frame copied out or not? if (flags & FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { LOG2("frame is copied"); copyFrameAndPostCopiedFrame(c, heap, offset, size); } else { LOG2("frame is forwarded"); mLock.unlock(); c->dataCallback(CAMERA_MSG_PREVIEW_FRAME, mem); } } else { mLock.unlock(); } }