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>
32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <hardware/camera.h>
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/Log.h>
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/threads.h>
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/threads.h>
37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <binder/MemoryBase.h>
38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <binder/MemoryHeapBase.h>
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <camera/CameraParameters.h>
40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <camera/CameraMetadata.h>
42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <camera/ShotParameters.h>
43f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
44f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <ui/GraphicBufferAllocator.h>
45f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <ui/GraphicBuffer.h>
46f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
47f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/* For IMG_native_handle_t */
48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <ui/GraphicBufferMapper.h>
49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <hal_public.h>
50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
51f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <ion/ion.h>
52f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
53f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "Common.h"
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "MessageQueue.h"
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "Semaphore.h"
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h"
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "SensorListener.h"
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons//temporarily define format here
60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define HAL_PIXEL_FORMAT_TI_NV12 0x100
61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define HAL_PIXEL_FORMAT_TI_Y8 0x103
62f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define HAL_PIXEL_FORMAT_TI_Y16 0x104
63d68392bec3edfd02bc24f8be35d84acbbd62f02cEmilian Peev#define HAL_PIXEL_FORMAT_TI_UYVY 0x105
6472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MIN_WIDTH           640
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MIN_HEIGHT          480
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PICTURE_WIDTH   3264 /* 5mp - 2560. 8mp - 3280 */ /* Make sure it is a multiple of 16. */
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PICTURE_HEIGHT  2448 /* 5mp - 2048. 8mp - 2464 */ /* Make sure it is a multiple of 16. */
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PREVIEW_WIDTH 176
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PREVIEW_HEIGHT 144
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIXEL_FORMAT           V4L2_PIX_FMT_UYVY
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define VIDEO_FRAME_COUNT_MAX    8 //NUM_OVERLAY_BUFFERS_REQUESTED
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAX_CAMERA_BUFFERS    8 //NUM_OVERLAY_BUFFERS_REQUESTED
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAX_ZOOM        3
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define THUMB_WIDTH     80
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define THUMB_HEIGHT    60
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIX_YUV422I 0
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PIX_YUV420P 1
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define SATURATION_OFFSET 100
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define SHARPNESS_OFFSET 100
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CONTRAST_OFFSET 100
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define FRAME_RATE_HIGH_HD 60
86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
87941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu#define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \
88941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu                             GRALLOC_USAGE_HW_RENDER | \
89941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu                             GRALLOC_USAGE_SW_READ_RARELY | \
90941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu                             GRALLOC_USAGE_SW_WRITE_NEVER
91941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Enables Absolute PPM measurements in logcat
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define PPM_INSTRUMENTATION_ABS 1
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
958e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng#define LOCK_BUFFER_TRIES 5
9672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng#define HAL_PIXEL_FORMAT_NV12 0x100
978e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
98f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define OP_STR_SIZE 100
99e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev
100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define NONNEG_ASSIGN(x,y) \
101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(x > -1) \
102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        y = x
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define CAMHAL_SIZE_OF_ARRAY(x) static_cast<int>(sizeof(x)/sizeof(x[0]))
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kRawImagesOutputDirPath;
111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kYuvImagesOutputDirPath;
112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define V4L_CAMERA_NAME_USB     "USBCAMERA"
114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define OMX_CAMERA_NAME_OV      "OV5640"
115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define OMX_CAMERA_NAME_SONY    "IMX060"
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons///Forward declarations
119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraHal;
120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraFrame;
121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraHalEvent;
122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass DisplayFrame;
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass FpsRange {
125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonspublic:
126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static int compare(const FpsRange * left, const FpsRange * right);
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    FpsRange(int min, int max);
129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    FpsRange();
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool operator==(const FpsRange & fpsRange) const;
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool isNull() const;
134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool isFixed() const;
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int min() const;
137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int max() const;
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsprivate:
140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mMin;
141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mMax;
142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons};
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline int FpsRange::compare(const FpsRange * const left, const FpsRange * const right) {
146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( left->max() < right->max() ) {
147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -1;
148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( left->max() > right->max() ) {
151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return 1;
152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( left->min() < right->min() ) {
155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -1;
156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( left->min() > right->min() ) {
159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return 1;
160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return 0;
163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline FpsRange::FpsRange(const int min, const int max) : mMin(min), mMax(max) {}
166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline FpsRange::FpsRange() : mMin(-1), mMax(-1) {}
168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline bool FpsRange::operator==(const FpsRange & fpsRange) const {
170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return mMin == fpsRange.mMin && mMax == fpsRange.mMax;
171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline bool FpsRange::isNull() const {
174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return mMin == -1 || mMax == -1;
175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline bool FpsRange::isFixed() const {
178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return mMin == mMax;
179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline int FpsRange::min() const { return mMin; }
182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsinline int FpsRange::max() const { return mMax; }
184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraArea : public android::RefBase
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraArea(ssize_t top,
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               ssize_t left,
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               ssize_t bottom,
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               ssize_t right,
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               size_t weight) : mTop(top),
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mLeft(left),
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mBottom(bottom),
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mRight(right),
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mWeight(weight) {}
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t transfrom(size_t width,
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                       size_t height,
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                       size_t &top,
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                       size_t &left,
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                       size_t &areaWidth,
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                       size_t &areaHeight);
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool isValid()
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ( ( 0 != mTop ) || ( 0 != mLeft ) || ( 0 != mBottom ) || ( 0 != mRight) );
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    bool isZeroArea()
212708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    {
213708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        return  ( (0 == mTop ) && ( 0 == mLeft ) && ( 0 == mBottom )
214708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                 && ( 0 == mRight ) && ( 0 == mWeight ));
215708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    }
216708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t getWeight()
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return mWeight;
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool compare(const android::sp<CameraArea> &area);
2235458bdc45048501d1919b14d22456de91f7e8950Tyler Luu
2242f15c6a9f1d24904705ddab6a6c005126e8846ddSundar Raman    static status_t parseAreas(const char *area,
2252f15c6a9f1d24904705ddab6a6c005126e8846ddSundar Raman                               size_t areaLength,
226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               android::Vector< android::sp<CameraArea> > &areas);
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2289e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    static status_t checkArea(ssize_t top,
2299e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                              ssize_t left,
2309e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                              ssize_t bottom,
2319e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                              ssize_t right,
2329e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                              ssize_t weight);
2339e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu
234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static bool areAreasDifferent(android::Vector< android::sp<CameraArea> > &, android::Vector< android::sp<CameraArea> > &);
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2365458bdc45048501d1919b14d22456de91f7e8950Tyler Luuprotected:
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t TOP = -1000;
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t LEFT = -1000;
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t BOTTOM = 1000;
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t RIGHT = 1000;
2419e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    static const ssize_t WEIGHT_MIN = 1;
2429e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    static const ssize_t WEIGHT_MAX = 1000;
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ssize_t mTop;
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ssize_t mLeft;
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ssize_t mBottom;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ssize_t mRight;
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mWeight;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraMetadataResult : public android::RefBase
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraMetadataResult(camera_memory_t * extMeta) : mExtendedMetadata(extMeta) {
257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.faces = NULL;
258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.number_of_faces = 0;
259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.analog_gain = 0;
261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.exposure_time = 0;
262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    };
264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraMetadataResult() {
267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.faces = NULL;
268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.number_of_faces = 0;
269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.analog_gain = 0;
271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetadata.exposure_time = 0;
272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
2739d3e3bc3209fbfbec33be46040f83c2360edd15dSundar Raman
274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mExtendedMetadata = NULL;
276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   }
278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual ~CameraMetadataResult() {
280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NULL != mMetadata.faces ) {
281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            free(mMetadata.faces);
282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NULL != mExtendedMetadata ) {
285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExtendedMetadata->release(mExtendedMetadata);
286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_frame_metadata_t *getMetadataResult() { return &mMetadata; };
291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_memory_t *getExtendedMetadata() { return mExtendedMetadata; };
294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t TOP = -1000;
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t LEFT = -1000;
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t BOTTOM = 1000;
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t RIGHT = 1000;
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const ssize_t INVALID_DATA = -2000;
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_frame_metadata_t mMetadata;
305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_memory_t *mExtendedMetadata;
307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonstypedef enum {
311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMERA_BUFFER_NONE = 0,
312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMERA_BUFFER_GRALLOC,
313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMERA_BUFFER_ANW,
314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMERA_BUFFER_MEMORY,
315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMERA_BUFFER_ION
316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} CameraBufferType;
317f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonstypedef struct _CameraBuffer {
319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBufferType type;
320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* opaque is the generic drop-in replacement for the pointers
321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * that were used previously */
322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void *opaque;
323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* opaque has different meanings depending on the buffer type:
325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   GRALLOC - gralloc_handle_t
326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   ANW - a pointer to the buffer_handle_t (which corresponds to
327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *         the ANativeWindowBuffer *)
328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   MEMORY - address of allocated memory
329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   ION - address of mapped ion allocation
330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *
331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * FIXME opaque should be split into several fields:
332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   - handle/pointer we got from the allocator
333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   - handle/value we pass to OMX
334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     *   - pointer to mapped memory (if the buffer is mapped)
335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* mapped holds ptr to mapped memory in userspace */
338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void *mapped;
339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* These are specific to ION buffers */
341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    struct ion_handle * ion_handle;
342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int ion_fd;
343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int fd;
344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    size_t size;
345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index;
346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* These describe the camera buffer */
348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int width;
349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int stride;
350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int height;
351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char *format;
352d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
353d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
354d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
355d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    struct timeval ppmStamp;
356d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
357d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
358d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
35911308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    /* These are for buffers which include borders */
36011308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    int offset; // where valid data starts
36111308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    int actual_size; // size of the entire buffer with borders
362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} CameraBuffer;
363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid * camera_buffer_get_omx_ptr (CameraBuffer *buffer);
365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraFrame
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    public:
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum FrameType
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan 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
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            PREVIEW_FRAME = 0x2   , ///Preview frame includes viewfinder and snapshot frames
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            IMAGE_FRAME_SYNC = 0x4, ///Image Frame is the image capture output frame
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            IMAGE_FRAME = 0x8,
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VIDEO_FRAME_SYNC = 0x10, ///Timestamp will be updated for these frames
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VIDEO_FRAME = 0x20,
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            FRAME_DATA_SYNC = 0x40, ///Any extra data assosicated with the frame. Always synced with the frame
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            FRAME_DATA= 0x80,
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            RAW_FRAME = 0x100,
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            SNAPSHOT_FRAME = 0x200,
382f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            REPROCESS_INPUT_FRAME = 0x400,
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ALL_FRAMES = 0xFFFF   ///Maximum of 16 frame types supported
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
386ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    enum FrameQuirks
387ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    {
388ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        ENCODE_RAW_YUV422I_TO_JPEG = 0x1 << 0,
38936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu        HAS_EXIF_DATA = 0x1 << 1,
390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        FORMAT_YUV422I_YUYV = 0x1 << 2,
391f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        FORMAT_YUV422I_UYVY = 0x1 << 3,
392ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    };
393ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //default contrustor
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame():
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCookie(NULL),
39736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu    mCookie2(NULL),
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBuffer(NULL),
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFrameType(0),
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mTimestamp(0),
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mWidth(0),
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mHeight(0),
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mOffset(0),
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAlignment(0),
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFd(0),
406ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    mLength(0),
4075e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    mFrameMask(0),
408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mQuirks(0)
409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      mYuv[0] = 0;
411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      mYuv[1] = 0;
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mMetaData = 0;
415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
4168e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    }
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void *mCookie;
41936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu    void *mCookie2;
420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mBuffer;
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mFrameType;
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    nsecs_t mTimestamp;
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int mWidth, mHeight;
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t mOffset;
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int mAlignment;
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mFd;
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mLength;
4285e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    unsigned mFrameMask;
429ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    unsigned int mQuirks;
4308e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    unsigned int mYuv[2];
431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<CameraMetadataResult> mMetaData;
433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo add other member vars like  stride etc
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4370ff71809874c00d540af83c123f3dc34759f1871Sundar Ramanenum CameraHalError
4380ff71809874c00d540af83c123f3dc34759f1871Sundar Raman{
4390ff71809874c00d540af83c123f3dc34759f1871Sundar Raman    CAMERA_ERROR_FATAL = 0x1, //Fatal errors can only be recovered by restarting media server
4400ff71809874c00d540af83c123f3dc34759f1871Sundar Raman    CAMERA_ERROR_HARD = 0x2,  // Hard errors are hardware hangs that may be recoverable by resetting the hardware internally within the adapter
4410ff71809874c00d540af83c123f3dc34759f1871Sundar Raman    CAMERA_ERROR_SOFT = 0x4, // Soft errors are non fatal errors that can be recovered from without needing to stop use-case
4420ff71809874c00d540af83c123f3dc34759f1871Sundar Raman};
4430ff71809874c00d540af83c123f3dc34759f1871Sundar Raman
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Common Camera Hal Event class which is visible to CameraAdapter,DisplayAdapter and AppCallbackNotifier
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///@todo Rename this class to CameraEvent
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHalEvent
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Enums
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum CameraHalEventType {
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NO_EVENTS = 0x0,
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        EVENT_FOCUS_LOCKED = 0x1,
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        EVENT_FOCUS_ERROR = 0x2,
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        EVENT_ZOOM_INDEX_REACHED = 0x4,
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        EVENT_SHUTTER = 0x8,
456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        EVENT_METADATA = 0x10,
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@remarks Future enum related to display, like frame displayed event, could be added here
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ALL_EVENTS = 0xFFFF ///Maximum of 16 event types supported
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
461057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    enum FocusStatus {
462057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        FOCUS_STATUS_SUCCESS = 0x1,
463057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        FOCUS_STATUS_FAIL = 0x2,
464057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        FOCUS_STATUS_PENDING = 0x4,
465057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        FOCUS_STATUS_DONE = 0x8,
466057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    };
467057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Class declarations
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks Add a new class for a new event type added above
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Shutter event specific data
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef struct ShutterEventData_t {
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool shutterClosed;
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }ShutterEventData;
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Focus event specific data
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef struct FocusEventData_t {
478057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        FocusStatus focusStatus;
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int currentFocusValue;
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } FocusEventData;
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Zoom specific event data
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef struct ZoomEventData_t {
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int currentZoomIndex;
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool targetZoomIndexReached;
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } ZoomEventData;
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef struct FaceData_t {
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ssize_t top;
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ssize_t left;
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ssize_t bottom;
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ssize_t right;
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        size_t score;
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } FaceData;
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
496f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    typedef android::sp<CameraMetadataResult> MetaEventData;
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    class CameraHalEventData : public android::RefBase{
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    public:
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHalEvent::FocusEventData focusEvent;
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHalEvent::ZoomEventData zoomEvent;
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHalEvent::ShutterEventData shutterEvent;
505f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CameraHalEvent::MetaEventData metadataEvent;
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //default contrustor
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent():
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCookie(NULL),
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventType(NO_EVENTS) {}
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //copy constructor
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent(const CameraHalEvent &event) :
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCookie(event.mCookie),
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventType(event.mEventType),
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventData(event.mEventData) {};
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void* mCookie;
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEventType mEventType;
521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<CameraHalEventData> mEventData;
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///      Have a generic callback class based on template - to adapt CameraFrame and Event
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*frame_callback) (CameraFrame *cameraFrame);
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*event_callback) (CameraHalEvent *event);
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//signals CameraHAL to relase image buffers
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*release_image_buffers_callback) (void *userData);
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef void (*end_image_capture_callback) (void *userData);
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Interface class implemented by classes that have some events to communicate to dependendent classes
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Dependent classes use this interface for registering for events
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass MessageNotifier
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const uint32_t EVENT_BIT_FIELD_POSITION;
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const uint32_t FRAME_BIT_FIELD_POSITION;
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks Msg type comes from CameraFrame and CameraHalEvent classes
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///           MSB 16 bits is for events and LSB 16 bits is for frame notifications
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         FrameProvider and EventProvider classes act as helpers to event/frame
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         consumers to call this api
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void enableMsgType(int32_t msgs, frame_callback frameCb=NULL, event_callback eventCb=NULL, void* cookie=NULL) = 0;
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void disableMsgType(int32_t msgs, void* cookie) = 0;
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~MessageNotifier() {};
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass ErrorNotifier : public virtual android::RefBase
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void errorNotify(int error) = 0;
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~ErrorNotifier() {};
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Interace class abstraction for Camera Adapter to act as a frame provider
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * This interface is fully implemented by Camera Adapter
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass FrameNotifier : public MessageNotifier
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0;
570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0;
5718e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    virtual void removeFramePointers() = 0;
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~FrameNotifier() {};
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**   * Wrapper class around Frame Notifier, which is used by display and notification classes for interacting with Camera Adapter
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass FrameProvider
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    FrameNotifier* mFrameNotifier;
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void* mCookie;
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    frame_callback mFrameCallback;
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    FrameProvider(FrameNotifier *fn, void* cookie, frame_callback frameCallback)
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        :mFrameNotifier(fn), mCookie(cookie),mFrameCallback(frameCallback) { }
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int enableFrameNotification(int32_t frameTypes);
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int disableFrameNotification(int32_t frameTypes);
590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int returnFrame(CameraBuffer *frameBuf, CameraFrame::FrameType frameType);
591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void addFramePointers(CameraBuffer *frameBuf, void *buf);
5928e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    void removeFramePointers();
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Wrapper class around MessageNotifier, which is used by display and notification classes for interacting with
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   *  Camera Adapter
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass EventProvider
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    MessageNotifier* mEventNotifier;
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void* mCookie;
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback mEventCallback;
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EventProvider(MessageNotifier *mn, void* cookie, event_callback eventCallback)
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        :mEventNotifier(mn), mCookie(cookie), mEventCallback(eventCallback) {}
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int enableEventNotification(int32_t eventTypes);
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int disableEventNotification(int32_t eventTypes);
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Interface for providing buffers
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass BufferProvider
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs) = 0;
620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // gets a buffer list from BufferProvider when buffers are sent from external source and already pre-allocated
622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // only call this function for an input source into CameraHal. If buffers are not from a pre-allocated source
623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // this function will return NULL and numBufs of -1
624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer *getBufferList(int *numBufs) = 0;
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //additional methods used for memory mapping
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual uint32_t * getOffsets() = 0;
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int getFd() = 0;
629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer * getBuffers(bool reset = false) { return NULL; }
630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual unsigned int getSize() {return 0; }
631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int getBufferCount() {return -1; }
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int freeBufferList(CameraBuffer * buf) = 0;
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~BufferProvider() {}
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Class for handling data and notify callbacks to application
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
641f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass   AppCallbackNotifier: public ErrorNotifier , public virtual android::RefBase
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Constants
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const int NOTIFIER_TIMEOUT;
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const int32_t MAX_BUFFERS = 8;
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum NotifierCommands
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_CMD_PROCESS_EVENT,
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_CMD_PROCESS_FRAME,
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_CMD_PROCESS_ERROR
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum NotifierState
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_STOPPED,
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_STARTED,
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_EXITED
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ~AppCallbackNotifier();
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialzes the callback notifier, creates any resources required
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t initialize();
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Starts the callbacks to application
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t start();
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Stops the callbacks from going to application
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t stop();
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider);
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setFrameProvider(FrameNotifier *frameProvider);
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //All sub-components of Camera HAL call this whenever any error happens
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void errorNotify(int error);
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t startPreviewCallbacks(android::CameraParameters &params, CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count);
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t stopPreviewCallbacks();
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t enableMsgType(int32_t msgType);
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t disableMsgType(int32_t msgType);
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API for enabling/disabling measurement data
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setMeasurements(bool enable);
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //thread loops
6933f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu    bool notificationThread();
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Notification callback functions
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static void frameCallbackRelay(CameraFrame* caFrame);
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static void eventCallbackRelay(CameraHalEvent* chEvt);
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void frameCallback(CameraFrame* caFrame);
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void eventCallback(CameraHalEvent* chEvt);
70026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu    void flushAndReturnFrames();
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setCallbacks(CameraHal *cameraHal,
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_notify_callback notify_cb,
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_data_callback data_cb,
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_data_timestamp_callback data_cb_timestamp,
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_request_memory get_memory,
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        void *user);
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Set Burst mode
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setBurst(bool burst);
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Notifications from CameraHal for video recording case
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t startRecording();
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t stopRecording();
715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t initSharedVideoBuffers(CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count, CameraBuffer *vidBufs);
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t releaseRecordingFrame(const void *opaque);
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t useMetaDataBufferMode(bool enable);
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void EncoderDoneCb(void*, void*, CameraFrame::FrameType type, void* cookie1, void* cookie2, void *cookie3);
721ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
72272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    void useVideoBuffers(bool useVideoBuffers);
72372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
72472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    bool getUesVideoBuffers();
72572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    void setVideoRes(int width, int height);
72672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
7273ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman    void flushEventQueue();
7283ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Internal class definitions
730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    class NotificationThread : public android::Thread {
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        AppCallbackNotifier* mAppCallbackNotifier;
732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        Utils::MessageQueue mNotificationThreadQ;
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    public:
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        enum NotificationThreadCommands
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_START,
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_STOP,
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NOTIFIER_EXIT,
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    public:
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        NotificationThread(AppCallbackNotifier* nh)
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            : Thread(false), mAppCallbackNotifier(nh) { }
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        virtual bool threadLoop() {
7443f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu            return mAppCallbackNotifier->notificationThread();
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        Utils::MessageQueue &msgQ() { return mNotificationThreadQ;}
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Friend declarations
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    friend class NotificationThread;
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void notifyEvent();
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void notifyFrame();
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool processMessage();
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void releaseSharedVideoBuffers();
758e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman    status_t dummyRaw();
75926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu    void copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType);
76026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu    void copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType);
761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    size_t calculateBufferSize(size_t width, size_t height, const char *pixelFormat);
762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char* getContstantForPixelFormat(const char *pixelFormat);
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mutable android::Mutex mLock;
766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mutable android::Mutex mBurstLock;
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal* mCameraHal;
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_notify_callback mNotifyCb;
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_data_callback   mDataCb;
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_data_timestamp_callback mDataCbTimestamp;
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_request_memory mRequestMemory;
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void *mCallbackCookie;
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Keeps Video MemoryHeaps and Buffers within
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //these objects
776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<unsigned int, unsigned int> mVideoHeaps;
777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<unsigned int, unsigned int> mVideoBuffers;
778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<void *, CameraBuffer *> mVideoMap;
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Keeps list of Gralloc handles and associated Video Metadata Buffers
781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<void *, camera_memory_t *> mVideoMetadataBufferMemoryMap;
782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<void *, CameraBuffer *> mVideoMetadataBufferReverseMap;
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mBufferReleased;
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp< NotificationThread> mNotificationThread;
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EventProvider *mEventProvider;
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    FrameProvider *mFrameProvider;
789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    Utils::MessageQueue mEventQ;
790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    Utils::MessageQueue mFrameQ;
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    NotifierState mNotifierState;
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mPreviewing;
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_memory_t* mPreviewMemory;
795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer mPreviewBuffers[MAX_BUFFERS];
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewBufCount;
797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mPreviewWidth;
798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mPreviewHeight;
799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mPreviewStride;
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *mPreviewPixelFormat;
801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<unsigned int, android::sp<android::MemoryHeapBase> > mSharedPreviewHeaps;
802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<unsigned int, android::sp<android::MemoryBase> > mSharedPreviewBuffers;
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Burst mode active
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mBurst;
806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mutable android::Mutex mRecordingLock;
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mRecording;
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mMeasurementEnabled;
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
810e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman    bool mUseMetaDataBufferMode;
811e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman    bool mRawAvailable;
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    bool mUseVideoBuffers;
81472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
81572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int mVideoWidth;
81672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int mVideoHeight;
81772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Class used for allocating memory for JPEG bit stream buffers, output buffers of camera in no overlay case
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
824f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass MemoryManager : public BufferProvider, public virtual android::RefBase
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
827f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    MemoryManager();
828f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ~MemoryManager();
829c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman
830f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t initialize();
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int setErrorHandler(ErrorNotifier *errorNotifier);
833f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs);
834f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer *getBufferList(int *numBufs);
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual uint32_t * getOffsets();
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int getFd() ;
837f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int freeBufferList(CameraBuffer * buflist);
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
840f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<ErrorNotifier> mErrorNotifier;
841c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman    int mIonFd;
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * CameraAdapter interface class
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  * Concrete classes derive from this class and provide implementations based on the specific camera h/w interface
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  */
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
852f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass CameraAdapter: public FrameNotifier, public virtual android::RefBase
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected:
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum AdapterActiveStates {
856f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        INTIALIZED_ACTIVE =         1 << 0,
857f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_PREVIEW_ACTIVE =     1 << 1,
858f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        PREVIEW_ACTIVE =            1 << 2,
859f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_CAPTURE_ACTIVE =     1 << 3,
860f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAPTURE_ACTIVE =            1 << 4,
861f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        BRACKETING_ACTIVE =         1 << 5,
862f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        AF_ACTIVE =                 1 << 6,
863f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ZOOM_ACTIVE =               1 << 7,
864f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_ACTIVE =              1 << 8,
865f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_REPROCESS_ACTIVE =   1 << 9,
866f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        REPROCESS_ACTIVE =          1 << 10,
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    typedef struct
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
871f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         CameraBuffer *mBuffers;
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         uint32_t *mOffsets;
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         int mFd;
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         size_t mLength;
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         size_t mCount;
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         size_t mMaxQueueable;
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } BuffersDescriptor;
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum CameraCommands
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_PREVIEW                        = 0,
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_PREVIEW                         = 1,
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_VIDEO                          = 2,
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_VIDEO                           = 3,
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_IMAGE_CAPTURE                  = 4,
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_IMAGE_CAPTURE                   = 5,
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_PERFORM_AUTOFOCUS                    = 6,
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_CANCEL_AUTOFOCUS                     = 7,
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_PREVIEW_FLUSH_BUFFERS                = 8,
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_SMOOTH_ZOOM                    = 9,
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_SMOOTH_ZOOM                     = 10,
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_USE_BUFFERS_PREVIEW                  = 11,
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_SET_TIMEOUT                          = 12,
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_CANCEL_TIMEOUT                       = 13,
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_BRACKET_CAPTURE                = 14,
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_BRACKET_CAPTURE                 = 15,
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_QUERY_RESOLUTION_PREVIEW             = 16,
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE      = 17,
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA       = 18,
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_USE_BUFFERS_IMAGE_CAPTURE            = 19,
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_USE_BUFFERS_PREVIEW_DATA             = 20,
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_TIMEOUT_EXPIRED                      = 21,
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_START_FD                             = 22,
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_STOP_FD                              = 23,
9057016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMERA_SWITCH_TO_EXECUTING                  = 24,
906f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_USE_BUFFERS_VIDEO_CAPTURE            = 25,
907f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
908f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_USE_BUFFERS_REPROCESS                = 26,
909f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_START_REPROCESS                      = 27,
910f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
911f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
912f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_SETUP_TUNNEL                         = 28,
913f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_DESTROY_TUNNEL                       = 29,
914f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
915f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_PREVIEW_INITIALIZATION               = 30,
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum CameraMode
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_PREVIEW,
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_IMAGE_CAPTURE,
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMERA_VIDEO,
923f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_MEASUREMENT,
924f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMERA_REPROCESS,
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum AdapterState {
928f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        INTIALIZED_STATE                = INTIALIZED_ACTIVE,
929f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_PREVIEW_STATE            = LOADED_PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
930f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        PREVIEW_STATE                   = PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
931f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_CAPTURE_STATE            = LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
932f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAPTURE_STATE                   = CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
933f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        BRACKETING_STATE                = BRACKETING_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE ,
934f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        AF_STATE                        = AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
935f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ZOOM_STATE                      = ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
936f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_STATE                     = VIDEO_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
937f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_AF_STATE                  = VIDEO_ACTIVE | AF_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
938f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_ZOOM_STATE                = VIDEO_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
939f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_LOADED_CAPTURE_STATE      = VIDEO_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
940f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        VIDEO_CAPTURE_STATE             = VIDEO_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
941f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        AF_ZOOM_STATE                   = AF_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
942f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        BRACKETING_ZOOM_STATE           = BRACKETING_ACTIVE | ZOOM_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
943f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_REPROCESS_STATE          = LOADED_REPROCESS_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
944f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOADED_REPROCESS_CAPTURE_STATE  = LOADED_REPROCESS_ACTIVE | LOADED_CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
945f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        REPROCESS_STATE                 = REPROCESS_ACTIVE | CAPTURE_ACTIVE | PREVIEW_ACTIVE | INTIALIZED_ACTIVE,
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
948f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialzes the camera adapter creates any resources required
9529a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    virtual int initialize(CameraProperties::Properties*) = 0;
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0;
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Message/Frame notification APIs
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void enableMsgType(int32_t msgs,
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               frame_callback callback = NULL,
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               event_callback eventCb = NULL,
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               void *cookie = NULL) = 0;
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void disableMsgType(int32_t msgs, void* cookie) = 0;
962f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual void returnFrame(CameraBuffer* frameBuf, CameraFrame::FrameType frameType) = 0;
963f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual void addFramePointers(CameraBuffer *frameBuf, void *buf) = 0;
9648e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    virtual void removeFramePointers() = 0;
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //APIs to configure Camera adapter and get the current parameter set
967f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int setParameters(const android::CameraParameters& params) = 0;
968f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual void getParameters(android::CameraParameters& params) = 0;
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Registers callback for returning image buffers back to CameraHAL
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data) = 0;
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Registers callback, which signals a completed image capture
974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int registerEndCaptureCallback(end_image_capture_callback callback, void *user_data) = 0;
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API to send a command to the camera
977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t sendCommand(CameraCommands operation, int value1=0, int value2=0, int value3=0, int value4=0) = 0;
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~CameraAdapter() {};
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Retrieves the current Adapter state
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual AdapterState getState() = 0;
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Retrieves the next Adapter state
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual AdapterState getNextState() = 0;
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Receive orientation events from CameraHal
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt) = 0;
989a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
990a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    // Rolls the state machine back to INTIALIZED_STATE from the current state
991a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    virtual status_t rollbackToInitializedState() = 0;
99278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
99378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    // Retrieves the current Adapter state - for internal use (not locked)
99478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    virtual status_t getState(AdapterState &state) = 0;
99578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    // Retrieves the next Adapter state - for internal use (not locked)
99678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    virtual status_t getNextState(AdapterState &state) = 0;
99778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t setSharedAllocator(camera_request_memory shmem_alloc) = 0;
999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected:
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //The first two methods will try to switch the adapter state.
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Every call to setState() should be followed by a corresponding
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //call to commitState(). If the state switch fails, then it will
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //get reset to the previous state via rollbackState().
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t setState(CameraCommands operation) = 0;
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t commitState() = 0;
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t rollbackState() = 0;
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1010f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsclass DisplayAdapter : public BufferProvider, public virtual android::RefBase
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
1013f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    DisplayAdapter();
1014f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1015f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
1016f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    preview_stream_extended_ops_t * extendedOps() const {
1017f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return mExtendedOps;
1018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1020f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void setExtendedOps(preview_stream_extended_ops_t * extendedOps);
1021f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initializes the display adapter creates any resources required
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int initialize() = 0;
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setPreviewWindow(struct preview_stream_ops *window) = 0;
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setFrameProvider(FrameNotifier *frameProvider) = 0;
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setErrorHandler(ErrorNotifier *errorNotifier) = 0;
1029f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL) = 0;
1030816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman    virtual int disableDisplay(bool cancel_buffer = true) = 0;
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Used for Snapshot review temp. pause
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int pauseDisplay(bool pause) = 0;
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Used for shot to snapshot measurement
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setSnapshotTimeRef(struct timeval *refTime = NULL) = 0;
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual bool supportsExternalBuffering() = 0;
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get max queueable buffers display supports
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // This function should only be called after
1043f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // allocateBufferList
1044f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t maxQueueableBuffers(unsigned int& queueable) = 0;
1045f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1046f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Get min buffers display needs at any given time
1047f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t minUndequeueableBuffers(int& unqueueable) = 0;
1048f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1049f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Given a vector of DisplayAdapters find the one corresponding to str
1050f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual bool match(const char * str) { return false; }
1051f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1052f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsprivate:
1053f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
1054f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    preview_stream_extended_ops_t * mExtendedOps;
1055f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void releaseImageBuffers(void *userData);
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void endImageCapture(void *userData);
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /**
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Implementation of the Android Camera hardware abstraction layer
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    This class implements the interface methods defined in CameraHardwareInterface
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for the OMAP4 platform
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass CameraHal
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Constants
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const int NO_BUFFERS_PREVIEW;
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const int NO_BUFFERS_IMAGE_CAPTURE;
1077f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static const int NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const uint32_t VFR_SCALE = 1000;
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /*--------------------Interface Methods---------------------------------*/
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     //@{
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Set the notification and data callbacks */
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setCallbacks(camera_notify_callback notify_cb,
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_data_callback data_cb,
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_data_timestamp_callback data_cb_timestamp,
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        camera_request_memory get_memory,
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        void *user);
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Receives orientation events from SensorListener **/
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void onOrientationEvent(uint32_t orientation, uint32_t tilt);
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * The following three functions all take a msgtype,
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * which is a bitmask of the messages defined in
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * include/ui/Camera.h
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Enable a message, or set of messages.
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void        enableMsgType(int32_t msgType);
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Disable a message, or a set of messages.
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void        disableMsgType(int32_t msgType);
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Query whether a message, or a set of messages, is enabled.
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Note that this is operates as an AND, if any of the messages
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * queried are off, this will return false.
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int        msgTypeEnabled(int32_t msgType);
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Start preview mode.
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    startPreview();
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * Set preview mode related initialization.
1126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * Only used when slice based processing is enabled.
1127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
1128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int    cameraPreviewInitialization();
1129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /**
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Only used if overlays are used for camera preview.
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int setPreviewWindow(struct preview_stream_ops *window);
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
1136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops);
1137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /**
1139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * Set a tap-in or tap-out point.
1140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
1141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout);
1142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /**
1145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * Release a tap-in or tap-out point.
1146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
1147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int releaseBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout);
1148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Stop a previously started preview.
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void        stopPreview();
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Returns true if preview is enabled.
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool        previewEnabled();
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * message is sent with the corresponding frame. Every record frame must be released
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * by calling releaseRecordingFrame().
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    startRecording();
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Stop a previously started recording.
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void        stopRecording();
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Returns true if recording is enabled.
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int        recordingEnabled();
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void        releaseRecordingFrame(const void *opaque);
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Start auto focus, the notification callback routine is called
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus()
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * will be called again if another auto focus is needed.
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    autoFocus();
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Cancels auto-focus function. If the auto-focus is still in progress,
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * this function will cancel it. Whether the auto-focus is in progress
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * or not, this function will return the focus position to the default.
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * If the camera does not support auto-focus, this is a no-op.
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    cancelAutoFocus();
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Take a picture.
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int    takePicture(const char* params);
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Cancel a picture that was started with takePicture.  Calling this
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * method when no picture is being taken is a no-op.
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    cancelPicture();
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Set the camera parameters. */
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int    setParameters(const char* params);
1209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int    setParameters(const android::CameraParameters& params);
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Return the camera parameters. */
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char*  getParameters();
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void putParameters(char *);
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Send command to camera driver.
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Release the hardware resources owned by this object.  Note that this is
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * *not* done in the destructor.
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void release();
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /**
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     * Dump state of the camera hardware
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     */
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int dump(int fd) const;
1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
1232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /**
1233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * start a reprocessing operation.
1234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
1235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int    reprocess(const char* params);
1236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /**
1238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     * cancels current reprocessing operation
1239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons     */
1240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int    cancel_reprocess();
1241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t storeMetaDataInBuffers(bool enable);
1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     //@}
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Internal Member functions - Public---------------------------------*/
1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** @name internalFunctionsPublic */
1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  //@{
1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Constructor of CameraHal */
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal(int cameraId);
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Destructor of CameraHal
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ~CameraHal();
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Initialize CameraHal */
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t initialize(CameraProperties::Properties*);
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Deinitialize CameraHal */
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void deinitialize();
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Uses the constructor timestamp as a reference to calcluate the
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // elapsed time
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static void PPM(const char *);
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Uses a user provided timestamp as a reference to calcluate the
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // elapsed time
1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static void PPM(const char *, struct timeval*, ...);
1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Free image bufs */
1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t freeImageBufs();
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Signals the end of image capture
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t signalEndImageCapture();
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Events
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static void eventCallbackRelay(CameraHalEvent* event);
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void eventCallback(CameraHalEvent* event);
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setEventProvider(int32_t eventMask, MessageNotifier * eventProvider);
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static const char* getPixelFormatConstant(const char* parameters_format);
1288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static size_t calculateBufferSize(const char* parameters_format, int width, int height);
1289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static void getXYFromOffset(unsigned int *x, unsigned int *y,
1290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                unsigned int offset, unsigned int stride,
1291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                const char* format);
1292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static unsigned int getBPP(const char* format);
1293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Internal Member functions - Private---------------------------------*/
1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** @name internalFunctionsPrivate */
1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //@{
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
13008b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    /**  Set the camera parameters specific to Video Recording. */
1301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool        setVideoModeParameters(const android::CameraParameters&);
13028b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu
13038b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    /** Reset the camera parameters specific to Video Recording. */
13048b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    bool       resetVideoModeParameters();
13058b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu
13068b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    /** Restart the preview with setParameter. */
13078b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    status_t        restartPreview();
13088b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t parseResolution(const char *resStr, int &width, int &height);
1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void insertSupportedParams();
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Allocate preview data buffers */
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t allocPreviewDataBufs(size_t size, size_t bufferCount);
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Free preview data buffers */
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t freePreviewDataBufs();
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Allocate preview buffers */
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t allocPreviewBufs(int width, int height, const char* previewFormat, unsigned int bufferCount, unsigned int &max_queueable);
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Allocate video buffers */
132372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    status_t allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount);
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Allocate image capture buffers */
1326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t allocImageBufs(unsigned int width, unsigned int height, size_t length,
13271d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                            const char* previewFormat, unsigned int bufferCount);
1328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /** Allocate Raw buffers */
1330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t allocRawBufs(int width, int height, const char* previewFormat, int bufferCount);
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Free preview buffers */
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t freePreviewBufs();
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Free video bufs */
1336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t freeVideoBufs(CameraBuffer *bufs);
1337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /** Free RAW bufs */
1339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t freeRawBufs();
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Check if a given resolution is supported by the current camera
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //instance
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions);
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //Check if a given variable frame rate range is supported by the current camera
1346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //instance
1347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges);
1348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Check if a given parameter is supported by the current camera
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // instance
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool isParameterValid(const char *param, const char *supportedParams);
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool isParameterValid(int param, const char *supportedParams);
1353f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    status_t doesSetParameterNeedUpdate(const char *new_param, const char *old_params, bool &update);
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /** Initialize default parameters */
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void initDefaultParameters();
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void dumpProperties(CameraProperties::Properties& cameraProps);
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t startImageBracketing();
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t stopImageBracketing();
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setShutter(bool enable);
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void forceStopPreview();
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void getPreferredPreviewRes(int *width, int *height);
1369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    void resetPreviewRes(android::CameraParameters *params);
137072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Internal __takePicture function - used in public takePicture() and reprocess()
1372d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    int   __takePicture(const char* params, struct timeval *captureStart = NULL);
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //@}
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t setTapoutLocked(struct preview_stream_ops *out);
1376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t releaseTapoutLocked(struct preview_stream_ops *out);
1377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t setTapinLocked(struct preview_stream_ops *in);
1378f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t releaseTapinLocked(struct preview_stream_ops *in);
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*----------Member variables - Public ---------------------*/
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t mMsgEnabled;
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mRecordEnabled;
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    nsecs_t mCurrentTime;
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mFalsePreview;
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mPreviewEnabled;
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t mTakePictureQueue;
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mBracketingEnabled;
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mBracketingRunning;
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //User shutter override
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mShutterEnabled;
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mMeasurementEnabled;
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Google's parameter delimiter
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static const char PARAMS_DELIMITER[];
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter *mCameraAdapter;
1396f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<AppCallbackNotifier> mAppCallbackNotifier;
1397f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<DisplayAdapter> mDisplayAdapter;
1398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<MemoryManager> mMemoryManager;
1399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::Vector< android::sp<DisplayAdapter> > mOutAdapters;
1401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::Vector< android::sp<DisplayAdapter> > mInAdapters;
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TODO(XXX): Even though we support user setting multiple BufferSourceAdapters now
1404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // only one tap in surface and one tap out surface is supported at a time.
1405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<DisplayAdapter> mBufferSourceAdapter_In;
1406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<DisplayAdapter> mBufferSourceAdapter_Out;
1407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
1409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    preview_stream_extended_ops_t * mExtendedPreviewStreamOps;
1410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<android::IMemoryHeap> mPictureHeap;
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1414524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman    int* mGrallocHandles;
1415524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman    bool mFpsRangeChangedByApp;
1416524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
1417524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
1418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mRawWidth;
1419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int mRawHeight;
1420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool mRawCapture;
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///static member vars
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    static const int SW_SCALING_FPS_LIMIT;
1426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Timestamp from the CameraHal constructor
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static struct timeval ppm_start;
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Timestamp of the autoFocus command
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static struct timeval mStartFocus;
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Timestamp of the startPreview command
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static struct timeval mStartPreview;
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Timestamp of the takePicture command
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static struct timeval mStartCapture;
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*----------Member variables - Private ---------------------*/
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprivate:
14423a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu    bool mDynamicPreviewSwitch;
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //keeps paused state of display
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mDisplayPaused;
1445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
1447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool mTunnelSetup;
1448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool mVTCUseCase;
1449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Index of current camera adapter
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mCameraIndex;
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mutable android::Mutex mLock;
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<SensorListener> mSensorListener;
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void* mCameraAdapterHandle;
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters mParameters;
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mPreviewRunning;
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mPreviewStateOld;
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mRecordingEnabled;
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EventProvider *mEventProvider;
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mPreviewDataBuffers;
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *mPreviewDataOffsets;
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewDataFd;
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewDataLength;
1470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mImageBuffers;
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *mImageOffsets;
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mImageFd;
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mImageLength;
147476826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev    unsigned int mImageCount;
1475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mPreviewBuffers;
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *mPreviewOffsets;
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewLength;
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewFd;
1479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mVideoBuffers;
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *mVideoOffsets;
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mVideoFd;
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mVideoLength;
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mBracketRangePositive;
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mBracketRangeNegative;
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Rename this as preview buffer provider
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BufferProvider *mBufProvider;
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BufferProvider *mVideoBufProvider;
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraProperties::Properties* mCameraProperties;
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mPreviewStartInProgress;
1495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool mPreviewInitializationDone;
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mSetPreviewWindowCalled;
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t mPreviewWidth;
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t mPreviewHeight;
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t mMaxZoomSupported;
150272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
150372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int mVideoWidth;
150472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int mVideoHeight;
150572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::String8 mCapModeBackup;
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
1510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1513