// 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();
			}
		}