CameraHal.h revision 5458bdc45048501d1919b14d22456de91f7e8950
1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_H 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define ANDROID_HARDWARE_CAMERA_HARDWARE_H 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdio.h> 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdarg.h> 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdlib.h> 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <string.h> 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <unistd.h> 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <time.h> 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <fcntl.h> 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/ioctl.h> 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/mman.h> 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/stat.h> 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/Log.h> 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/threads.h> 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <linux/videodev2.h> 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "binder/MemoryBase.h" 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "binder/MemoryHeapBase.h" 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/threads.h> 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <camera/CameraParameters.h> 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <hardware/camera.h> 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "MessageQueue.h" 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "Semaphore.h" 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h" 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "DebugUtils.h" 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "SensorListener.h" 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng#include <ui/GraphicBufferAllocator.h> 4772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng#include <ui/GraphicBuffer.h> 4872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MIN_WIDTH 640 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MIN_HEIGHT 480 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PICTURE_WIDTH 3264 /* 5mp - 2560. 8mp - 3280 */ /* Make sure it is a multiple of 16. */ 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PICTURE_HEIGHT 2448 /* 5mp - 2048. 8mp - 2464 */ /* Make sure it is a multiple of 16. */ 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PREVIEW_WIDTH 176 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PREVIEW_HEIGHT 144 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIXEL_FORMAT V4L2_PIX_FMT_UYVY 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define VIDEO_FRAME_COUNT_MAX 8 //NUM_OVERLAY_BUFFERS_REQUESTED 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAX_CAMERA_BUFFERS 8 //NUM_OVERLAY_BUFFERS_REQUESTED 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAX_ZOOM 3 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define THUMB_WIDTH 80 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define THUMB_HEIGHT 60 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIX_YUV422I 0 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIX_YUV420P 1 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define SATURATION_OFFSET 100 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define SHARPNESS_OFFSET 100 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CONTRAST_OFFSET 100 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 69941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu#define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ 70941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu GRALLOC_USAGE_EXTERNAL_DISP | \ 71941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu GRALLOC_USAGE_HW_RENDER | \ 72941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu GRALLOC_USAGE_SW_READ_RARELY | \ 73941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu GRALLOC_USAGE_SW_WRITE_NEVER 74941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Enables Absolute PPM measurements in logcat 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PPM_INSTRUMENTATION_ABS 1 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 788e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng#define LOCK_BUFFER_TRIES 5 7972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng#define HAL_PIXEL_FORMAT_NV12 0x100 808e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Uncomment to enable more verbose/debug logs 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#define DEBUG_LOG 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Camera HAL Logging Functions 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef DEBUG_LOG 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGDA(str) 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGDB(str, ...) 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGVA(str) 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGVB(str, ...) 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGEA LOGE 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGEB LOGE 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_FUNCTION_NAME 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_FUNCTION_NAME_EXIT 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_FUNCTION_NAME 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_FUNCTION_NAME_EXIT 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGDA DBGUTILS_LOGDA 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGDB DBGUTILS_LOGDB 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGVA DBGUTILS_LOGVA 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGVB DBGUTILS_LOGVB 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGEA DBGUTILS_LOGEA 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CAMHAL_LOGEB DBGUTILS_LOGEB 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define NONNEG_ASSIGN(x,y) \ 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(x > -1) \ 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev y = x 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PARAM_BUFFER 6000 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Forward declarations 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHal; 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraFrame; 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHalEvent; 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass DisplayFrame; 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraArea : public RefBase 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraArea(ssize_t top, 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t left, 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t bottom, 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t right, 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t weight) : mTop(top), 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mLeft(left), 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBottom(bottom), 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRight(right), 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mWeight(weight) {} 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t transfrom(size_t width, 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t height, 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t &top, 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t &left, 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t &areaWidth, 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t &areaHeight); 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isValid() 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ( ( 0 != mTop ) || ( 0 != mLeft ) || ( 0 != mBottom ) || ( 0 != mRight) ); 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 154708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev bool isZeroArea() 155708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 156708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev return ( (0 == mTop ) && ( 0 == mLeft ) && ( 0 == mBottom ) 157708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev && ( 0 == mRight ) && ( 0 == mWeight )); 158708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 159708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t getWeight() 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mWeight; 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1655458bdc45048501d1919b14d22456de91f7e8950Tyler Luu bool compare(const sp<CameraArea> &area); 1665458bdc45048501d1919b14d22456de91f7e8950Tyler Luu 1672f15c6a9f1d24904705ddab6a6c005126e8846ddSundar Raman static status_t parseAreas(const char *area, 1682f15c6a9f1d24904705ddab6a6c005126e8846ddSundar Raman size_t areaLength, 1692f15c6a9f1d24904705ddab6a6c005126e8846ddSundar Raman Vector< sp<CameraArea> > &areas); 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1719e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu static status_t checkArea(ssize_t top, 1729e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ssize_t left, 1739e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ssize_t bottom, 1749e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ssize_t right, 1759e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ssize_t weight); 1769e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu 1775458bdc45048501d1919b14d22456de91f7e8950Tyler Luu static bool areAreasDifferent(Vector< sp<CameraArea> > &, Vector< sp<CameraArea> > &); 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1795458bdc45048501d1919b14d22456de91f7e8950Tyler Luuprotected: 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t TOP = -1000; 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t LEFT = -1000; 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t BOTTOM = 1000; 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t RIGHT = 1000; 1849e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu static const ssize_t WEIGHT_MIN = 1; 1859e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu static const ssize_t WEIGHT_MAX = 1000; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t mTop; 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t mLeft; 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t mBottom; 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t mRight; 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t mWeight; 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraFDResult : public RefBase 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFDResult() : mFaceData(NULL) {}; 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFDResult(camera_frame_metadata_t *faces) : mFaceData(faces) {}; 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~CameraFDResult() { 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mFaceData ) && ( NULL != mFaceData->faces ) ) { 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(mFaceData->faces); 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(mFaceData); 2059d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman mFaceData=NULL; 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2079d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman 2089d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman if(( NULL != mFaceData )) 2099d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman { 2109d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman free(mFaceData); 2119d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman mFaceData = NULL; 2129d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman } 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_frame_metadata_t *getFaceResult() { return mFaceData; }; 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t TOP = -1000; 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t LEFT = -1000; 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t BOTTOM = 1000; 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t RIGHT = 1000; 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const ssize_t INVALID_DATA = -2000; 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_frame_metadata_t *mFaceData; 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraFrame 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev public: 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum FrameType 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PREVIEW_FRAME_SYNC = 0x1, ///SYNC implies that the frame needs to be explicitly returned after consuming in order to be filled by camera again 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PREVIEW_FRAME = 0x2 , ///Preview frame includes viewfinder and snapshot frames 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMAGE_FRAME_SYNC = 0x4, ///Image Frame is the image capture output frame 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMAGE_FRAME = 0x8, 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev VIDEO_FRAME_SYNC = 0x10, ///Timestamp will be updated for these frames 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev VIDEO_FRAME = 0x20, 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FRAME_DATA_SYNC = 0x40, ///Any extra data assosicated with the frame. Always synced with the frame 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FRAME_DATA= 0x80, 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev RAW_FRAME = 0x100, 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SNAPSHOT_FRAME = 0x200, 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ALL_FRAMES = 0xFFFF ///Maximum of 16 frame types supported 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 247ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu enum FrameQuirks 248ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 249ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu ENCODE_RAW_YUV422I_TO_JPEG = 0x1 << 0, 25036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu HAS_EXIF_DATA = 0x1 << 1, 251ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu }; 252ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //default contrustor 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame(): 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCookie(NULL), 25636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu mCookie2(NULL), 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBuffer(NULL), 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameType(0), 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mTimestamp(0), 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mWidth(0), 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mHeight(0), 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffset(0), 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAlignment(0), 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFd(0), 265ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mLength(0), 2665e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng mFrameMask(0), 2678e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mQuirks(0) { 2688e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng 2698e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mYuv[0] = NULL; 2708e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mYuv[1] = NULL; 2718e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //copy constructor 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame(const CameraFrame &frame) : 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCookie(frame.mCookie), 27636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu mCookie2(frame.mCookie2), 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBuffer(frame.mBuffer), 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameType(frame.mFrameType), 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mTimestamp(frame.mTimestamp), 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mWidth(frame.mWidth), 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mHeight(frame.mHeight), 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffset(frame.mOffset), 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAlignment(frame.mAlignment), 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFd(frame.mFd), 285ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mLength(frame.mLength), 2865e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng mFrameMask(frame.mFrameMask), 2878e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mQuirks(frame.mQuirks) { 2888e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng 2898e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mYuv[0] = frame.mYuv[0]; 2908e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mYuv[1] = frame.mYuv[1]; 2918e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *mCookie; 29436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu void *mCookie2; 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *mBuffer; 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mFrameType; 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsecs_t mTimestamp; 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int mWidth, mHeight; 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t mOffset; 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int mAlignment; 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mFd; 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t mLength; 3035e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng unsigned mFrameMask; 304ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu unsigned int mQuirks; 3058e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng unsigned int mYuv[2]; 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo add other member vars like stride etc 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3090ff71809874c00d540af83c123f3dc34759f1871Sundar Ramanenum CameraHalError 3100ff71809874c00d540af83c123f3dc34759f1871Sundar Raman{ 3110ff71809874c00d540af83c123f3dc34759f1871Sundar Raman CAMERA_ERROR_FATAL = 0x1, //Fatal errors can only be recovered by restarting media server 3120ff71809874c00d540af83c123f3dc34759f1871Sundar Raman CAMERA_ERROR_HARD = 0x2, // Hard errors are hardware hangs that may be recoverable by resetting the hardware internally within the adapter 3130ff71809874c00d540af83c123f3dc34759f1871Sundar Raman CAMERA_ERROR_SOFT = 0x4, // Soft errors are non fatal errors that can be recovered from without needing to stop use-case 3140ff71809874c00d540af83c123f3dc34759f1871Sundar Raman}; 3150ff71809874c00d540af83c123f3dc34759f1871Sundar Raman 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Common Camera Hal Event class which is visible to CameraAdapter,DisplayAdapter and AppCallbackNotifier 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///@todo Rename this class to CameraEvent 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHalEvent 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Enums 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum CameraHalEventType { 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NO_EVENTS = 0x0, 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EVENT_FOCUS_LOCKED = 0x1, 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EVENT_FOCUS_ERROR = 0x2, 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EVENT_ZOOM_INDEX_REACHED = 0x4, 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EVENT_SHUTTER = 0x8, 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EVENT_FACE = 0x10, 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks Future enum related to display, like frame displayed event, could be added here 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ALL_EVENTS = 0xFFFF ///Maximum of 16 event types supported 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Class declarations 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks Add a new class for a new event type added above 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Shutter event specific data 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct ShutterEventData_t { 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool shutterClosed; 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }ShutterEventData; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Focus event specific data 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct FocusEventData_t { 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool focusLocked; 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool focusError; 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int currentFocusValue; 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } FocusEventData; 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Zoom specific event data 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct ZoomEventData_t { 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int currentZoomIndex; 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool targetZoomIndexReached; 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } ZoomEventData; 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct FaceData_t { 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t top; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t left; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t bottom; 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ssize_t right; 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t score; 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } FaceData; 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef sp<CameraFDResult> FaceEventData; 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev class CameraHalEventData : public RefBase{ 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev public: 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FocusEventData focusEvent; 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::ZoomEventData zoomEvent; 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::ShutterEventData shutterEvent; 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FaceEventData faceEvent; 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //default contrustor 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent(): 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCookie(NULL), 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventType(NO_EVENTS) {} 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //copy constructor 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent(const CameraHalEvent &event) : 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCookie(event.mCookie), 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventType(event.mEventType), 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventData(event.mEventData) {}; 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* mCookie; 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEventType mEventType; 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<CameraHalEventData> mEventData; 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/// Have a generic callback class based on template - to adapt CameraFrame and Event 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*frame_callback) (CameraFrame *cameraFrame); 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*event_callback) (CameraHalEvent *event); 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//signals CameraHAL to relase image buffers 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*release_image_buffers_callback) (void *userData); 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*end_image_capture_callback) (void *userData); 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Interface class implemented by classes that have some events to communicate to dependendent classes 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Dependent classes use this interface for registering for events 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass MessageNotifier 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const uint32_t EVENT_BIT_FIELD_POSITION; 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const uint32_t FRAME_BIT_FIELD_POSITION; 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks Msg type comes from CameraFrame and CameraHalEvent classes 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// MSB 16 bits is for events and LSB 16 bits is for frame notifications 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// FrameProvider and EventProvider classes act as helpers to event/frame 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// consumers to call this api 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void enableMsgType(int32_t msgs, frame_callback frameCb=NULL, event_callback eventCb=NULL, void* cookie=NULL) = 0; 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void disableMsgType(int32_t msgs, void* cookie) = 0; 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~MessageNotifier() {}; 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass ErrorNotifier : public virtual RefBase 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void errorNotify(int error) = 0; 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~ErrorNotifier() {}; 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Interace class abstraction for Camera Adapter to act as a frame provider 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * This interface is fully implemented by Camera Adapter 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass FrameNotifier : public MessageNotifier 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void returnFrame(void* frameBuf, CameraFrame::FrameType frameType) = 0; 4368e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng virtual void addFramePointers(void *frameBuf, void *buf) = 0; 4378e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng virtual void removeFramePointers() = 0; 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~FrameNotifier() {}; 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** * Wrapper class around Frame Notifier, which is used by display and notification classes for interacting with Camera Adapter 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass FrameProvider 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FrameNotifier* mFrameNotifier; 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* mCookie; 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame_callback mFrameCallback; 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FrameProvider(FrameNotifier *fn, void* cookie, frame_callback frameCallback) 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev :mFrameNotifier(fn), mCookie(cookie),mFrameCallback(frameCallback) { } 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int enableFrameNotification(int32_t frameTypes); 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int disableFrameNotification(int32_t frameTypes); 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int returnFrame(void *frameBuf, CameraFrame::FrameType frameType); 4578e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng void addFramePointers(void *frameBuf, void *buf); 4588e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng void removeFramePointers(); 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Wrapper class around MessageNotifier, which is used by display and notification classes for interacting with 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Camera Adapter 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass EventProvider 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MessageNotifier* mEventNotifier; 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* mCookie; 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev event_callback mEventCallback; 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EventProvider(MessageNotifier *mn, void* cookie, event_callback eventCallback) 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev :mEventNotifier(mn), mCookie(cookie), mEventCallback(eventCallback) {} 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int enableEventNotification(int32_t eventTypes); 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int disableEventNotification(int32_t eventTypes); 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Interface for providing buffers 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass BufferProvider 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs) = 0; 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //additional methods used for memory mapping 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual uint32_t * getOffsets() = 0; 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int getFd() = 0; 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int freeBuffer(void* buf) = 0; 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~BufferProvider() {} 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Class for handling data and notify callbacks to application 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass AppCallbackNotifier: public ErrorNotifier , public virtual RefBase 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Constants 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int NOTIFIER_TIMEOUT; 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int32_t MAX_BUFFERS = 8; 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum NotifierCommands 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_CMD_PROCESS_EVENT, 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_CMD_PROCESS_FRAME, 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_CMD_PROCESS_ERROR 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum NotifierState 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_STOPPED, 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_STARTED, 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_EXITED 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ~AppCallbackNotifier(); 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialzes the callback notifier, creates any resources required 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t initialize(); 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Starts the callbacks to application 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t start(); 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Stops the callbacks from going to application 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t stop(); 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider); 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setFrameProvider(FrameNotifier *frameProvider); 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //All sub-components of Camera HAL call this whenever any error happens 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void errorNotify(int error); 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t startPreviewCallbacks(CameraParameters ¶ms, void *buffers, uint32_t *offsets, int fd, size_t length, size_t count); 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t stopPreviewCallbacks(); 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t enableMsgType(int32_t msgType); 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t disableMsgType(int32_t msgType); 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //API for enabling/disabling measurement data 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setMeasurements(bool enable); 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //thread loops 5513f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu bool notificationThread(); 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Notification callback functions 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static void frameCallbackRelay(CameraFrame* caFrame); 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static void eventCallbackRelay(CameraHalEvent* chEvt); 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void frameCallback(CameraFrame* caFrame); 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void eventCallback(CameraHalEvent* chEvt); 55826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu void flushAndReturnFrames(); 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setCallbacks(CameraHal *cameraHal, 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_notify_callback notify_cb, 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user); 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Set Burst mode 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setBurst(bool burst); 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 570ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu int setParameters(const CameraParameters& params); 571ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Notifications from CameraHal for video recording case 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t startRecording(); 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t stopRecording(); 57572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng status_t initSharedVideoBuffers(void *buffers, uint32_t *offsets, int fd, size_t length, size_t count, void *vidBufs); 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t releaseRecordingFrame(const void *opaque); 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t useMetaDataBufferMode(bool enable); 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 580c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu void EncoderDoneCb(void*, void*, CameraFrame::FrameType type, void* cookie1, void* cookie2); 581ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 58272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng void useVideoBuffers(bool useVideoBuffers); 58372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 58472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bool getUesVideoBuffers(); 58572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng void setVideoRes(int width, int height); 58672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Internal class definitions 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev class NotificationThread : public Thread { 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AppCallbackNotifier* mAppCallbackNotifier; 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::MessageQueue mNotificationThreadQ; 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev public: 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum NotificationThreadCommands 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_START, 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_STOP, 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NOTIFIER_EXIT, 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev public: 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NotificationThread(AppCallbackNotifier* nh) 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : Thread(false), mAppCallbackNotifier(nh) { } 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual bool threadLoop() { 6023f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu return mAppCallbackNotifier->notificationThread(); 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::MessageQueue &msgQ() { return mNotificationThreadQ;} 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Friend declarations 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev friend class NotificationThread; 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void notifyEvent(); 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void notifyFrame(); 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool processMessage(); 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void releaseSharedVideoBuffers(); 616e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman status_t dummyRaw(); 61726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu void copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType); 61826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu void copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType); 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mutable Mutex mLock; 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mutable Mutex mBurstLock; 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal* mCameraHal; 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_notify_callback mNotifyCb; 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback mDataCb; 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback mDataCbTimestamp; 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory mRequestMemory; 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *mCallbackCookie; 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Keeps Video MemoryHeaps and Buffers within 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //these objects 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<unsigned int, unsigned int> mVideoHeaps; 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<unsigned int, unsigned int> mVideoBuffers; 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<unsigned int, unsigned int> mVideoMap; 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Keeps list of Gralloc handles and associated Video Metadata Buffers 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<uint32_t, uint32_t> mVideoMetadataBufferMemoryMap; 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<uint32_t, uint32_t> mVideoMetadataBufferReverseMap; 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mBufferReleased; 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp< NotificationThread> mNotificationThread; 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EventProvider *mEventProvider; 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev FrameProvider *mFrameProvider; 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::MessageQueue mEventQ; 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::MessageQueue mFrameQ; 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NotifierState mNotifierState; 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewing; 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* mPreviewMemory; 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned char* mPreviewBufs[MAX_BUFFERS]; 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewBufCount; 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *mPreviewPixelFormat; 654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<unsigned int, sp<MemoryHeapBase> > mSharedPreviewHeaps; 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev KeyedVector<unsigned int, sp<MemoryBase> > mSharedPreviewBuffers; 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Burst mode active 658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mBurst; 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mutable Mutex mRecordingLock; 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mRecording; 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mMeasurementEnabled; 662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 663e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman bool mUseMetaDataBufferMode; 664e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman bool mRawAvailable; 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 666ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu CameraParameters mParameters; 667ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 66872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bool mUseVideoBuffers; 66972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 67072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int mVideoWidth; 67172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int mVideoHeight; 67272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Class used for allocating memory for JPEG bit stream buffers, output buffers of camera in no overlay case 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass MemoryManager : public BufferProvider, public virtual RefBase 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 682c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman MemoryManager():mIonFd(0){ } 683c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman 684c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman ///Initializes the memory manager creates any resources required 685c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman status_t initialize() { return NO_ERROR; } 686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int setErrorHandler(ErrorNotifier *errorNotifier); 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs); 689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual uint32_t * getOffsets(); 690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int getFd() ; 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int freeBuffer(void* buf); 692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<ErrorNotifier> mErrorNotifier; 696c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman int mIonFd; 697c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman KeyedVector<unsigned int, unsigned int> mIonHandleMap; 698c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman KeyedVector<unsigned int, unsigned int> mIonFdMap; 699c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman KeyedVector<unsigned int, unsigned int> mIonBufLength; 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * CameraAdapter interface class 707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Concrete classes derive from this class and provide implementations based on the specific camera h/w interface 708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraAdapter: public FrameNotifier, public virtual RefBase 711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected: 713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum AdapterActiveStates { 714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev INTIALIZED_ACTIVE = 1 << 0, 715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOADED_PREVIEW_ACTIVE = 1 << 1, 716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PREVIEW_ACTIVE = 1 << 2, 717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOADED_CAPTURE_ACTIVE = 1 << 3, 718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAPTURE_ACTIVE = 1 << 4, 719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BRACKETING_ACTIVE = 1 << 5, 720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AF_ACTIVE = 1 << 6, 721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ZOOM_ACTIVE = 1 << 7, 722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev VIDEO_ACTIVE = 1 << 8, 723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct 726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *mBuffers; 728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *mOffsets; 729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mFd; 730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t mLength; 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t mCount; 732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t mMaxQueueable; 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } BuffersDescriptor; 734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum CameraCommands 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_PREVIEW = 0, 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_PREVIEW = 1, 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_VIDEO = 2, 740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_VIDEO = 3, 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_IMAGE_CAPTURE = 4, 742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_IMAGE_CAPTURE = 5, 743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_PERFORM_AUTOFOCUS = 6, 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_CANCEL_AUTOFOCUS = 7, 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_PREVIEW_FLUSH_BUFFERS = 8, 746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_SMOOTH_ZOOM = 9, 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_SMOOTH_ZOOM = 10, 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_USE_BUFFERS_PREVIEW = 11, 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_SET_TIMEOUT = 12, 750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_CANCEL_TIMEOUT = 13, 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_BRACKET_CAPTURE = 14, 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_BRACKET_CAPTURE = 15, 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_QUERY_RESOLUTION_PREVIEW = 16, 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE = 17, 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA = 18, 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_USE_BUFFERS_IMAGE_CAPTURE = 19, 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_USE_BUFFERS_PREVIEW_DATA = 20, 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_TIMEOUT_EXPIRED = 21, 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_START_FD = 22, 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_STOP_FD = 23, 7617016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng CAMERA_SWITCH_TO_EXECUTING = 24, 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum CameraMode 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_PREVIEW, 767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_IMAGE_CAPTURE, 768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_VIDEO, 769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMERA_MEASUREMENT 770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev enum AdapterState { 773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev INTIALIZED_STATE = INTIALIZED_ACTIVE, 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOADED_PREVIEW_STATE = LOADED_PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PREVIEW_STATE = PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOADED_CAPTURE_STATE = LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAPTURE_STATE = CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BRACKETING_STATE = BRACKETING_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE , 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AF_STATE = AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ZOOM_STATE = ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev VIDEO_STATE = VIDEO_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev VIDEO_ZOOM_STATE = VIDEO_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 783ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu VIDEO_LOADED_CAPTURE_STATE = VIDEO_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 784ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu VIDEO_CAPTURE_STATE = VIDEO_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AF_ZOOM_STATE = AF_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BRACKETING_ZOOM_STATE = BRACKETING_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE, 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialzes the camera adapter creates any resources required 7929a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu virtual int initialize(CameraProperties::Properties*) = 0; 793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0; 795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Message/Frame notification APIs 797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void enableMsgType(int32_t msgs, 798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame_callback callback = NULL, 799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev event_callback eventCb = NULL, 800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *cookie = NULL) = 0; 801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void disableMsgType(int32_t msgs, void* cookie) = 0; 802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void returnFrame(void* frameBuf, CameraFrame::FrameType frameType) = 0; 8038e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng virtual void addFramePointers(void *frameBuf, void *buf) = 0; 8048e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng virtual void removeFramePointers() = 0; 805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //APIs to configure Camera adapter and get the current parameter set 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setParameters(const CameraParameters& params) = 0; 808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void getParameters(CameraParameters& params) = 0; 809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //API to flush the buffers from Camera 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t flushBuffers() 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return sendCommand(CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS); 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Registers callback for returning image buffers back to CameraHAL 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data) = 0; 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Registers callback, which signals a completed image capture 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int registerEndCaptureCallback(end_image_capture_callback callback, void *user_data) = 0; 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //API to send a command to the camera 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t sendCommand(CameraCommands operation, int value1=0, int value2=0, int value3=0) = 0; 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual ~CameraAdapter() {}; 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Retrieves the current Adapter state 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual AdapterState getState() = 0; 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Retrieves the next Adapter state 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual AdapterState getNextState() = 0; 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Receive orientation events from CameraHal 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt) = 0; 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected: 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //The first two methods will try to switch the adapter state. 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Every call to setState() should be followed by a corresponding 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //call to commitState(). If the state switch fails, then it will 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //get reset to the previous state via rollbackState(). 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t setState(CameraCommands operation) = 0; 841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t commitState() = 0; 842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t rollbackState() = 0; 843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Retrieves the current Adapter state - for internal use (not locked) 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t getState(AdapterState &state) = 0; 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Retrieves the next Adapter state - for internal use (not locked) 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual status_t getNextState(AdapterState &state) = 0; 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass DisplayAdapter : public BufferProvider, public virtual RefBase 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev typedef struct S3DParameters_t 854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mode; 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int framePacking; 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int order; 858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int subSampling; 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } S3DParameters; 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initializes the display adapter creates any resources required 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int initialize() = 0; 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setPreviewWindow(struct preview_stream_ops *window) = 0; 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setFrameProvider(FrameNotifier *frameProvider) = 0; 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0; 867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL, S3DParameters *s3dParams = NULL) = 0; 868816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman virtual int disableDisplay(bool cancel_buffer = true) = 0; 869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Used for Snapshot review temp. pause 870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int pauseDisplay(bool pause) = 0; 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Used for shot to snapshot measurement 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int setSnapshotTimeRef(struct timeval *refTime = NULL) = 0; 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int useBuffers(void *bufArr, int num) = 0; 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual bool supportsExternalBuffering() = 0; 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Get max queueable buffers display supports 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // This function should only be called after 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // allocateBuffer 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev virtual int maxQueueableBuffers(unsigned int& queueable) = 0; 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void releaseImageBuffers(void *userData); 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void endImageCapture(void *userData); 889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Implementation of the Android Camera hardware abstraction layer 892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev This class implements the interface methods defined in CameraHardwareInterface 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for the OMAP4 platform 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHal 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Constants 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int NO_BUFFERS_PREVIEW; 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const int NO_BUFFERS_IMAGE_CAPTURE; 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const uint32_t VFR_SCALE = 1000; 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*--------------------Interface Methods---------------------------------*/ 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //@{ 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Set the notification and data callbacks */ 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setCallbacks(camera_notify_callback notify_cb, 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user); 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Receives orientation events from SensorListener **/ 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void onOrientationEvent(uint32_t orientation, uint32_t tilt); 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * The following three functions all take a msgtype, 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * which is a bitmask of the messages defined in 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * include/ui/Camera.h 927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Enable a message, or set of messages. 931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void enableMsgType(int32_t msgType); 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Disable a message, or a set of messages. 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void disableMsgType(int32_t msgType); 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Query whether a message, or a set of messages, is enabled. 941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Note that this is operates as an AND, if any of the messages 942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * queried are off, this will return false. 943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int msgTypeEnabled(int32_t msgType); 945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Start preview mode. 948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int startPreview(); 950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Only used if overlays are used for camera preview. 953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int setPreviewWindow(struct preview_stream_ops *window); 955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Stop a previously started preview. 958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void stopPreview(); 960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Returns true if preview is enabled. 963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool previewEnabled(); 965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME 968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * message is sent with the corresponding frame. Every record frame must be released 969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * by calling releaseRecordingFrame(). 970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int startRecording(); 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Stop a previously started recording. 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void stopRecording(); 977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Returns true if recording is enabled. 980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int recordingEnabled(); 982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void releaseRecordingFrame(const void *opaque); 987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Set the camera parameters specific to Video Recording. 990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil bool setVideoModeParameters(); 992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil /** 994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil * Reset the camera parameters specific to Video Recording. 995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */ 996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil bool resetVideoModeParameters(); 997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 998b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil /** 999b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil * Restart the preview with setParameter. 1000b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */ 1001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil status_t restartPreview(); 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Start auto focus, the notification callback routine is called 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() 1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * will be called again if another auto focus is needed. 1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int autoFocus(); 1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Cancels auto-focus function. If the auto-focus is still in progress, 1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * this function will cancel it. Whether the auto-focus is in progress 1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * or not, this function will return the focus position to the default. 1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * If the camera does not support auto-focus, this is a no-op. 1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int cancelAutoFocus(); 1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Take a picture. 1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int takePicture(); 1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Cancel a picture that was started with takePicture. Calling this 1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * method when no picture is being taken is a no-op. 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int cancelPicture(); 1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Set the camera parameters. */ 1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int setParameters(const char* params); 1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int setParameters(const CameraParameters& params); 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Return the camera parameters. */ 1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char* getParameters(); 1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void putParameters(char *); 1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Send command to camera driver. 1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Release the hardware resources owned by this object. Note that this is 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * *not* done in the destructor. 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void release(); 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Dump state of the camera hardware 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int dump(int fd) const; 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t storeMetaDataInBuffers(bool enable); 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //@} 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Internal Member functions - Public---------------------------------*/ 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** @name internalFunctionsPublic */ 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //@{ 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Constructor of CameraHal */ 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal(int cameraId); 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Destructor of CameraHal 1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ~CameraHal(); 1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Initialize CameraHal */ 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t initialize(CameraProperties::Properties*); 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Deinitialize CameraHal */ 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void deinitialize(); 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Uses the constructor timestamp as a reference to calcluate the 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // elapsed time 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static void PPM(const char *); 1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Uses a user provided timestamp as a reference to calcluate the 1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // elapsed time 1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static void PPM(const char *, struct timeval*, ...); 1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Free image bufs */ 1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t freeImageBufs(); 1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Signals the end of image capture 1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t signalEndImageCapture(); 1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Events 1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static void eventCallbackRelay(CameraHalEvent* event); 1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void eventCallback(CameraHalEvent* event); 1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider); 1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Internal Member functions - Private---------------------------------*/ 1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** @name internalFunctionsPrivate */ 1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //@{ 1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t parseResolution(const char *resStr, int &width, int &height); 1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void insertSupportedParams(); 1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Allocate preview data buffers */ 1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t allocPreviewDataBufs(size_t size, size_t bufferCount); 1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Free preview data buffers */ 1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t freePreviewDataBufs(); 1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Allocate preview buffers */ 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t allocPreviewBufs(int width, int height, const char* previewFormat, unsigned int bufferCount, unsigned int &max_queueable); 1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Allocate video buffers */ 111872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng status_t allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount); 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Allocate image capture buffers */ 1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t allocImageBufs(unsigned int width, unsigned int height, size_t length, const char* previewFormat, unsigned int bufferCount); 1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Free preview buffers */ 1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t freePreviewBufs(); 1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Free video bufs */ 112772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng status_t freeVideoBufs(void *bufs); 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Check if a given resolution is supported by the current camera 1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //instance 1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions); 1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Check if a given parameter is supported by the current camera 1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // instance 1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isParameterValid(const char *param, const char *supportedParams); 1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool isParameterValid(int param, const char *supportedParams); 1137f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu status_t doesSetParameterNeedUpdate(const char *new_param, const char *old_params, bool &update); 1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Initialize default parameters */ 1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void initDefaultParameters(); 1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void dumpProperties(CameraProperties::Properties& cameraProps); 1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t startImageBracketing(); 1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t stopImageBracketing(); 1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void setShutter(bool enable); 1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void forceStopPreview(); 1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1152a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng void selectFPSRange(int framerate, int *min_fps, int *max_fps); 1153a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng 115472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng void setPreferredPreviewRes(int width, int height); 115572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng void resetPreviewRes(CameraParameters *mParams, int width, int height); 115672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //@} 1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*----------Member variables - Public ---------------------*/ 1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic: 1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t mMsgEnabled; 1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mRecordEnabled; 1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsecs_t mCurrentTime; 1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mFalsePreview; 1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewEnabled; 1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t mTakePictureQueue; 1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mBracketingEnabled; 1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mBracketingRunning; 1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //User shutter override 1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mShutterEnabled; 1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mMeasurementEnabled; 1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Google's parameter delimiter 1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const char PARAMS_DELIMITER[]; 1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraAdapter *mCameraAdapter; 1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<AppCallbackNotifier> mAppCallbackNotifier; 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<DisplayAdapter> mDisplayAdapter; 1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryManager> mMemoryManager; 1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<IMemoryHeap> mPictureHeap; 1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1183524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman int* mGrallocHandles; 1184524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman bool mFpsRangeChangedByApp; 1185524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman 1186524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman 1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///static member vars 1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Timestamp from the CameraHal constructor 1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static struct timeval ppm_start; 1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Timestamp of the autoFocus command 1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static struct timeval mStartFocus; 1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Timestamp of the startPreview command 1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static struct timeval mStartPreview; 1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Timestamp of the takePicture command 1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static struct timeval mStartCapture; 1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*----------Member variables - Private ---------------------*/ 1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate: 12073a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu bool mDynamicPreviewSwitch; 1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //keeps paused state of display 1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mDisplayPaused; 1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Index of current camera adapter 1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mCameraIndex; 1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mutable Mutex mLock; 1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<SensorListener> mSensorListener; 1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void* mCameraAdapterHandle; 1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters mParameters; 1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewRunning; 1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewStateOld; 1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mRecordingEnabled; 1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EventProvider *mEventProvider; 1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t *mPreviewDataBufs; 1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *mPreviewDataOffsets; 1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewDataFd; 1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewDataLength; 1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t *mImageBufs; 1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *mImageOffsets; 1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mImageFd; 1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mImageLength; 1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t *mPreviewBufs; 1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *mPreviewOffsets; 1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewLength; 1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mPreviewFd; 1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t *mVideoBufs; 1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *mVideoOffsets; 1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mVideoFd; 1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mVideoLength; 1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mBracketRangePositive; 1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int mBracketRangeNegative; 1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Rename this as preview buffer provider 1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BufferProvider *mBufProvider; 1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BufferProvider *mVideoBufProvider; 1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraProperties::Properties* mCameraProperties; 1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mPreviewStartInProgress; 1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool mSetPreviewWindowCalled; 1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t mPreviewWidth; 1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t mPreviewHeight; 1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t mMaxZoomSupported; 125972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 126072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int mVideoWidth; 126172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int mVideoHeight; 126272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; // namespace android 1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 1269