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