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