CameraClient.h revision 3ee3550a2f529cbf56d87d8503f59a8f45dccf32
15e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala/* 25e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 35e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * 45e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 55e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * you may not use this file except in compliance with the License. 65e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * You may obtain a copy of the License at 75e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * 85e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 95e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * 105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * See the License for the specific language governing permissions and 145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala * limitations under the License. 155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala */ 165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERACLIENT_H 185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERACLIENT_H 195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include "CameraService.h" 215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalanamespace android { 235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaclass MemoryHeapBase; 255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaclass CameraHardwareInterface; 265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 27b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala/** 28b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala * Interface between android.hardware.Camera API and Camera HAL device for version 29b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala * CAMERA_DEVICE_API_VERSION_1_0. 30b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala */ 31b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvala 325e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaclass CameraClient : public CameraService::Client 335e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{ 345e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalapublic: 355e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // ICamera interface (see ICamera for details) 365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void disconnect(); 375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t connect(const sp<ICameraClient>& client); 385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t lock(); 395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t unlock(); 405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t setPreviewDisplay(const sp<Surface>& surface); 418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden virtual status_t setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer); 425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void setPreviewCallbackFlag(int flag); 433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala virtual status_t setPreviewCallbackTarget( 443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer); 455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startPreview(); 465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopPreview(); 475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool previewEnabled(); 485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t storeMetaDataInBuffers(bool enabled); 495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startRecording(); 505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopRecording(); 515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool recordingEnabled(); 525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void releaseRecordingFrame(const sp<IMemory>& mem); 535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t autoFocus(); 545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t cancelAutoFocus(); 555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t takePicture(int msgType); 565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t setParameters(const String8& params); 575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual String8 getParameters() const; 585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // Interface used by CameraService 615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CameraClient(const sp<CameraService>& cameraService, 625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ICameraClient>& cameraClient, 63ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraId, 655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraFacing, 66ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int clientPid, 67ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int clientUid, 68ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int servicePid); 695e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala ~CameraClient(); 705e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t initialize(camera_module_t *module); 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 755e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaprivate: 765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // check whether the calling process matches mClientPid. 785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t checkPid() const; 795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t checkPidAndHardware() const; // also check mHardware != 0 805e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are internal functions used to set up preview buffers 825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t registerPreviewBuffers(); 835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // camera operation mode 855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala enum camera_mode { 865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CAMERA_PREVIEW_MODE = 0, // frame automatically released 875e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CAMERA_RECORDING_MODE = 1, // frame has to be explicitly released by releaseRecordingFrame() 885e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala }; 895e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are internal functions used for preview/recording 905e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startCameraMode(camera_mode mode); 915e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startPreviewMode(); 925e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startRecordingMode(); 935e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 945e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // internal function used by sendCommand to enable/disable shutter sound. 955e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t enableShutterSound(bool enable); 965e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 975e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are static callback functions 985e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void* user); 995e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 1005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata, void* user); 1015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr, void* user); 1025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // handlers for messages 1035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleShutter(void); 1045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handlePreviewData(int32_t msgType, const sp<IMemory>& mem, 1055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1065e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handlePostview(const sp<IMemory>& mem); 1075e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleRawPicture(const sp<IMemory>& mem); 1085e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleCompressedPicture(const sp<IMemory>& mem); 1095e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericNotify(int32_t msgType, int32_t ext1, int32_t ext2); 1105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericData(int32_t msgType, const sp<IMemory>& dataPtr, 1115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void copyFrameAndPostCopiedFrame( 1155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int32_t msgType, 1165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ICameraClient>& client, 1175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<IMemoryHeap>& heap, 1185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala size_t offset, size_t size, 1195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int getOrientation(int orientation, bool mirror); 1225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t setPreviewWindow( 1245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<IBinder>& binder, 1255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ANativeWindow>& window); 1265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1275e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1285e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are initialized in the constructor. 1295e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<CameraHardwareInterface> mHardware; // cleared after disconnect() 1305e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mPreviewCallbackFlag; 1315e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mOrientation; // Current display orientation 1325e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala bool mPlayShutterSound; 1335e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1345e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // Ensures atomicity among the public methods 1355e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala mutable Mutex mLock; 1361a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian // This is a binder of Surface or Surface. 1375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<IBinder> mSurface; 1385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<ANativeWindow> mPreviewWindow; 1395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // If the user want us to return a copy of the preview frame (instead 1415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // of the original one), we allocate mPreviewBuffer and reuse it if possible. 1425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<MemoryHeapBase> mPreviewBuffer; 1435e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // We need to avoid the deadlock when the incoming command thread and 1455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // the CameraHardwareInterface callback thread both want to grab mLock. 1465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // An extra flag is used to tell the callback thread that it should stop 1475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // trying to deliver the callback messages if the client is not 1485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // interested in it anymore. For example, if the client is calling 1495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // stopPreview(), the preview frame messages do not need to be delivered 1505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // anymore. 1515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // This function takes the same parameter as the enableMsgType() and 1535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // disableMsgType() functions in CameraHardwareInterface. 1545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void enableMsgType(int32_t msgType); 1555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void disableMsgType(int32_t msgType); 1565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala volatile int32_t mMsgEnabled; 1575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // This function keeps trying to grab mLock, or give up if the message 1595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // is found to be disabled. It returns true if mLock is grabbed. 1605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala bool lockIfMessageWanted(int32_t msgType); 1615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}; 1625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala} 1645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#endif 166