diff options
Diffstat (limited to 'services/camera/libcameraservice')
-rw-r--r-- | services/camera/libcameraservice/CameraHardwareInterface.h | 18 | ||||
-rw-r--r-- | services/camera/libcameraservice/CameraHardwareStub.h | 9 | ||||
-rw-r--r-- | services/camera/libcameraservice/CameraService.cpp | 9 |
3 files changed, 21 insertions, 15 deletions
diff --git a/services/camera/libcameraservice/CameraHardwareInterface.h b/services/camera/libcameraservice/CameraHardwareInterface.h index a3749cf..a583aad 100644 --- a/services/camera/libcameraservice/CameraHardwareInterface.h +++ b/services/camera/libcameraservice/CameraHardwareInterface.h @@ -559,13 +559,8 @@ private: ANativeWindowBuffer* anb; rc = a->dequeueBuffer(a, &anb); if (!rc) { - rc = a->lockBuffer(a, anb); - if (!rc) { - *buffer = &anb->handle; - *stride = anb->stride; - } - else - a->cancelBuffer(a, anb); + *buffer = &anb->handle; + *stride = anb->stride; } return rc; } @@ -576,6 +571,14 @@ private: (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); }) #endif + static int __lock_buffer(struct preview_stream_ops* w, + buffer_handle_t* buffer) + { + ANativeWindow *a = anw(w); + return a->lockBuffer(a, + container_of(buffer, ANativeWindowBuffer, handle)); + } + static int __enqueue_buffer(struct preview_stream_ops* w, buffer_handle_t* buffer) { @@ -641,6 +644,7 @@ private: void initHalPreviewWindow() { mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer; + mHalPreviewWindow.nw.lock_buffer = __lock_buffer; mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer; mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer; mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count; diff --git a/services/camera/libcameraservice/CameraHardwareStub.h b/services/camera/libcameraservice/CameraHardwareStub.h index 9b66a76..c6d8756 100644 --- a/services/camera/libcameraservice/CameraHardwareStub.h +++ b/services/camera/libcameraservice/CameraHardwareStub.h @@ -73,14 +73,7 @@ private: CameraHardwareStub* mHardware; public: PreviewThread(CameraHardwareStub* hw) : -#ifdef SINGLE_PROCESS - // In single process mode this thread needs to be a java thread, - // since we won't be calling through the binder. - Thread(true), -#else - Thread(false), -#endif - mHardware(hw) { } + Thread(false), mHardware(hw) { } virtual void onFirstRef() { run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); } diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index a011ae2..9b09983 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -420,6 +420,10 @@ status_t CameraService::Client::unlock() { // allow anyone to use camera (after they lock the camera) status_t result = checkPid(); if (result == NO_ERROR) { + if (mHardware->recordingEnabled()) { + LOGE("Not allowed to unlock camera during recording."); + return INVALID_OPERATION; + } mClientPid = 0; LOG1("clear mCameraClient (pid %d)", callingPid); // we need to remove the reference to ICameraClient so that when the app @@ -756,6 +760,11 @@ status_t CameraService::Client::takePicture(int msgType) { status_t result = checkPidAndHardware(); if (result != NO_ERROR) return result; + if (mHardware->recordingEnabled()) { + LOGE("Cannot take picture during recording."); + return INVALID_OPERATION; + } + if ((msgType & CAMERA_MSG_RAW_IMAGE) && (msgType & CAMERA_MSG_RAW_IMAGE_NOTIFY)) { LOGE("CAMERA_MSG_RAW_IMAGE and CAMERA_MSG_RAW_IMAGE_NOTIFY" |