CameraClient.h revision 1ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0
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(); 401ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer); 415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void setPreviewCallbackFlag(int flag); 423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala virtual status_t setPreviewCallbackTarget( 433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer); 445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startPreview(); 455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopPreview(); 465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool previewEnabled(); 475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t storeMetaDataInBuffers(bool enabled); 485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t startRecording(); 495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void stopRecording(); 505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual bool recordingEnabled(); 515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual void releaseRecordingFrame(const sp<IMemory>& mem); 525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t autoFocus(); 535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t cancelAutoFocus(); 545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t takePicture(int msgType); 555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t setParameters(const String8& params); 565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual String8 getParameters() const; 575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // Interface used by CameraService 605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CameraClient(const sp<CameraService>& cameraService, 615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ICameraClient>& cameraClient, 62ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraId, 645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int cameraFacing, 65ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int clientPid, 66ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int clientUid, 67ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin int servicePid); 685e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala ~CameraClient(); 695e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t initialize(camera_module_t *module); 71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 735e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaprivate: 755e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // check whether the calling process matches mClientPid. 775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t checkPid() const; 785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t checkPidAndHardware() const; // also check mHardware != 0 795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 805e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are internal functions used to set up preview buffers 815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t registerPreviewBuffers(); 825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // camera operation mode 845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala enum camera_mode { 855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CAMERA_PREVIEW_MODE = 0, // frame automatically released 865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala CAMERA_RECORDING_MODE = 1, // frame has to be explicitly released by releaseRecordingFrame() 875e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala }; 885e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are internal functions used for preview/recording 895e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startCameraMode(camera_mode mode); 905e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startPreviewMode(); 915e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t startRecordingMode(); 925e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 935e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // internal function used by sendCommand to enable/disable shutter sound. 945e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t enableShutterSound(bool enable); 955e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 965e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are static callback functions 975e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void* user); 985e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 995e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata, void* user); 1005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala static void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr, void* user); 1015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // handlers for messages 1025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleShutter(void); 1035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handlePreviewData(int32_t msgType, const sp<IMemory>& mem, 1045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handlePostview(const sp<IMemory>& mem); 1065e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleRawPicture(const sp<IMemory>& mem); 1075e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleCompressedPicture(const sp<IMemory>& mem); 1085e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericNotify(int32_t msgType, int32_t ext1, int32_t ext2); 1095e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericData(int32_t msgType, const sp<IMemory>& dataPtr, 1105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void handleGenericDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void copyFrameAndPostCopiedFrame( 1145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int32_t msgType, 1155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ICameraClient>& client, 1165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<IMemoryHeap>& heap, 1175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala size_t offset, size_t size, 1185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala camera_frame_metadata_t *metadata); 1195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int getOrientation(int orientation, bool mirror); 1215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala status_t setPreviewWindow( 1235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<IBinder>& binder, 1245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala const sp<ANativeWindow>& window); 1255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1275e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // these are initialized in the constructor. 1285e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<CameraHardwareInterface> mHardware; // cleared after disconnect() 1295e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mPreviewCallbackFlag; 1305e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala int mOrientation; // Current display orientation 1315e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala bool mPlayShutterSound; 1325e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1335e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // Ensures atomicity among the public methods 1345e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala mutable Mutex mLock; 1351a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian // This is a binder of Surface or Surface. 1365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<IBinder> mSurface; 1375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<ANativeWindow> mPreviewWindow; 1385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // If the user want us to return a copy of the preview frame (instead 1405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // of the original one), we allocate mPreviewBuffer and reuse it if possible. 1415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala sp<MemoryHeapBase> mPreviewBuffer; 1425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1435e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // We need to avoid the deadlock when the incoming command thread and 1445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // the CameraHardwareInterface callback thread both want to grab mLock. 1455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // An extra flag is used to tell the callback thread that it should stop 1465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // trying to deliver the callback messages if the client is not 1475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // interested in it anymore. For example, if the client is calling 1485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // stopPreview(), the preview frame messages do not need to be delivered 1495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // anymore. 1505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // This function takes the same parameter as the enableMsgType() and 1525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // disableMsgType() functions in CameraHardwareInterface. 1535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void enableMsgType(int32_t msgType); 1545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala void disableMsgType(int32_t msgType); 1555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala volatile int32_t mMsgEnabled; 1565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // This function keeps trying to grab mLock, or give up if the message 1585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala // is found to be disabled. It returns true if mLock is grabbed. 1595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala bool lockIfMessageWanted(int32_t msgType); 1605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}; 1615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala} 1635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 1645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#endif 165