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* @file CameraHal.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file maps the Camera Hardware Interface to V4L2.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "ANativeWindowDisplayAdapter.h"
26f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "BufferSourceAdapter.h"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/properties.h>
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <poll.h>
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <math.h>
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern "C" CameraAdapter* OMXCameraAdapter_Factory(size_t);
38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern "C" CameraAdapter* V4LCameraAdapter_Factory(size_t);
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*****************************************************************************/
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////Constant definitions and declarations
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////@todo Have a CameraProperties class to store these parameters as constants for every camera
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////       Currently, they are hard-coded
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
47f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 5;
48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::SW_SCALING_FPS_LIMIT = 15;
49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 16;
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// TODO(XXX): Temporarily increase number of buffers we can allocate from ANW
55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// until faux-NPA mode is implemented
56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP = 15;
57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// HACK: Default path to directory where RAW images coming from video port will be saved to.
60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons//       If directory not exists the saving is skipped and video port frame is ignored.
61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons//       The directory name is choosed in so weird way to enable RAW images saving only when
62f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons//       directory has been created explicitly by user.
63f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kRawImagesOutputDirPath = "/data/misc/camera/RaW_PiCtUrEs";
64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kYuvImagesOutputDirPath = "/data/misc/camera/YuV_PiCtUrEs";
65f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************************/
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
70f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
71f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_update_and_get_buffer(preview_stream_ops_t*, buffer_handle_t**, int*) {
72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return INVALID_OPERATION;
73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
75f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_buffer_dimension(preview_stream_ops_t*, int*, int*) {
76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return INVALID_OPERATION;
77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_buffer_format(preview_stream_ops_t*, int*) {
80f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return INVALID_OPERATION;
81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
83f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_set_metadata(preview_stream_ops_t*, const camera_memory_t*) {
84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return INVALID_OPERATION;
85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_id(preview_stream_ops_t*, char *data, unsigned int dataSize) {
88f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return INVALID_OPERATION;
89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
901d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu
911d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luustatic int dummy_get_buffer_count(preview_stream_ops_t*, int *count) {
921d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu    return INVALID_OPERATION;
931d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu}
9411308f1fc42a01958b9c13fad908141028fda9adEmilian Peev
9511308f1fc42a01958b9c13fad908141028fda9adEmilian Peevstatic int dummy_get_crop(preview_stream_ops_t*,
9611308f1fc42a01958b9c13fad908141028fda9adEmilian Peev                          int *, int *, int *, int *) {
9711308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    return INVALID_OPERATION;
9811308f1fc42a01958b9c13fad908141028fda9adEmilian Peev}
9911308f1fc42a01958b9c13fad908141028fda9adEmilian Peev
10011308f1fc42a01958b9c13fad908141028fda9adEmilian Peevstatic int dummy_get_current_size(preview_stream_ops_t*,
10111308f1fc42a01958b9c13fad908141028fda9adEmilian Peev                                  int *, int *) {
10211308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    return INVALID_OPERATION;
10311308f1fc42a01958b9c13fad908141028fda9adEmilian Peev}
104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic preview_stream_extended_ops_t dummyPreviewStreamExtendedOps = {
108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    dummy_update_and_get_buffer,
110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    dummy_get_buffer_dimension,
111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    dummy_get_buffer_format,
112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    dummy_set_metadata,
113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    dummy_get_id,
1141d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu    dummy_get_buffer_count,
11511308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    dummy_get_crop,
11611308f1fc42a01958b9c13fad908141028fda9adEmilian Peev    dummy_get_current_size,
117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons};
119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsDisplayAdapter::DisplayAdapter()
123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mExtendedOps = &dummyPreviewStreamExtendedOps;
126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid DisplayAdapter::setExtendedOps(preview_stream_extended_ops_t * extendedOps) {
131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mExtendedOps = extendedOps ? extendedOps : &dummyPreviewStreamExtendedOps;
132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartPreview;
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartFocus;
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartCapture;
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *camera = NULL;
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (cookie) {
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera = (CameraHal*) cookie;
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->onOrientationEvent(orientation, tilt);
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  Callback function to receive orientation events from SensorListener
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->onOrientationEvent(orientation, tilt);
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the notification and data callbacks
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] notify_cb Notify callback for notifying the app about events and errors
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb   Buffer callback for sending the preview/raw frames to the app
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] user  Callback cookie
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setCallbacks(camera_notify_callback notify_cb,
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_callback data_cb,
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_timestamp_callback data_cb_timestamp,
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_request_memory get_memory,
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            void *user)
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mAppCallbackNotifier.get() )
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->setCallbacks(this,
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                notify_cb,
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb,
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb_timestamp,
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                get_memory,
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                user);
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != mCameraAdapter ) {
199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter->setSharedAllocator(get_memory);
200f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Enable a message, or set of messages.
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::enableMsgType(int32_t msgType)
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        msgType &= ~CAMERA_MSG_SHUTTER;
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2212ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    // ignoring enable focus message from camera service
2222ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    // we will enable internally in autoFocus call
223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    msgType &= ~CAMERA_MSG_FOCUS;
224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef ANDROID_API_JB_OR_LATER
225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    msgType &= ~CAMERA_MSG_FOCUS_MOVE;
226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
2272ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled |= msgType;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayPaused)
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }else
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling Preview Callback");
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier with the message callback required
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->enableMsgType (msgType);
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Disable a message, or set of messages.
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::disableMsgType(int32_t msgType)
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mLock);
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMsgEnabled &= ~msgType;
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( msgType & CAMERA_MSG_PREVIEW_FRAME)
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Disabling Preview Callback");
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->disableMsgType (msgType);
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Query whether a message, or a set of messages, is enabled.
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is operates as an AND, if any of the messages queried are off, this will
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   return false.
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If all message types are enabled
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          false If any message type
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::msgTypeEnabled(int32_t msgType)
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int32_t msgEnabled = 0;
297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    msgEnabled = mMsgEnabled;
302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!previewEnabled() && !mPreviewInitializationDone) {
303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        msgEnabled &= ~(CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_PREVIEW_METADATA);
304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (msgEnabled & msgType);
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const char* parameters)
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters params;
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::String8 str_params(parameters);
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.unflatten(str_params);
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return setParameters(params);
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint CameraHal::setParameters(const android::CameraParameters& params)
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int framerate;
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int maxFPS, minFPS;
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
350a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    int varint = 0;
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
352b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Needed for KEY_RECORDING_HINT
353b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
354f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    bool updateRequired = false;
355f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters oldParams = mParameters;
356f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
357f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef V4L_CAMERA_ADAPTER
358f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (strcmp (V4L_CAMERA_NAME_USB, mCameraProperties->get(CameraProperties::CAMERA_NAME)) == 0 ) {
359f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        updateRequired = true;
360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
363b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mLock);
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
366b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Ensure that preview is not enabled when the below parameters are changed.
367b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(!previewEnabled())
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ((valstr = params.getPreviewFormat()) != NULL) {
3703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    mParameters.setPreviewFormat(valstr);
372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGDB("PreviewFormat set %s", valstr);
3733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                } else {
374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGEB("Invalid preview format: %s. Supported: %s", valstr,
375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
376a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
377b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
3783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
379b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
380f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
381f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (strcmp(mCameraProperties->get(CameraProperties::VNF_SUPPORTED),
382f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                           android::CameraParameters::TRUE) == 0) {
383f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGDB("VNF %s", valstr);
384f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_VNF, valstr);
385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
386f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
387a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
388f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else {
389f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_VNF,
390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    android::CameraParameters::FALSE);
391b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
392f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
393b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ((valstr = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
3958b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // make sure we support vstab...if we don't and application is trying to set
3968b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab then return an error
3978b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                           android::CameraParameters::TRUE) == 0) {
399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGDB("VSTAB %s", valstr);
400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, valstr);
401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
402f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
403a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
4048b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else {
405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    android::CameraParameters::FALSE);
407b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
408f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
409b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) {
411a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if (strcmp(TICameraParameters::VIDEO_MODE, valstr)) {
413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mCapModeBackup = valstr;
414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
415a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGDB("Capture mode set %s", valstr);
417b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    const char *currentMode = mParameters.get(TICameraParameters::KEY_CAP_MODE);
419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ( NULL != currentMode ) {
420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        if ( strcmp(currentMode, valstr) != 0 ) {
421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            updateRequired = true;
422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        }
423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    } else {
424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        updateRequired = true;
425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
428f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else if (!mCapModeBackup.isEmpty()) {
429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                // Restore previous capture mode after stopPreview()
430f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_CAP_MODE,
431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                mCapModeBackup.string());
432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                updateRequired = true;
433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ((valstr = params.get(TICameraParameters::KEY_VTC_HINT)) != NULL ) {
437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_VTC_HINT, valstr);
438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mVTCUseCase = true;
440f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mVTCUseCase = false;
442b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("VTC Hint = %d", mVTCUseCase);
444f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
445b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (mVTCUseCase) {
447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL ) {
448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE, valstr);
449b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
450b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
451f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL ) {
452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT, valstr);
453b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
454b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
457b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
46059f5191dd90015ae76ee25956eee5bd5917ba34eAndriy Chepurnyy                if ((mParameters.get(TICameraParameters::KEY_IPP) == NULL) ||
46159f5191dd90015ae76ee25956eee5bd5917ba34eAndriy Chepurnyy                        (strcmp(valstr, mParameters.get(TICameraParameters::KEY_IPP)))) {
462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    restartPreviewRequired = true;
4653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
468a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (valstr = params.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL )
473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (strcmp(valstr, mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)))
4753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Stereo 3D preview image layout is %s", valstr);
477f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, valstr);
478f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                restartPreviewRequired = true;
4793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
4813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
483f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int orientation =0;
484f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            doesSetParameterNeedUpdate(valstr,
487f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                       mParameters.get(TICameraParameters::KEY_SENSOR_ORIENTATION),
488f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                       updateRequired);
489a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
490f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
491f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( orientation < 0 || orientation >= 360 || (orientation%90) != 0 ) {
492f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGE("Invalid sensor orientation: %s. Value must be one of: [0, 90, 180, 270]", valstr);
493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
494f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
495a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
496f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("Sensor Orientation is set to %d", orientation);
497f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
499a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
500a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
501f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        params.getPreviewSize(&w, &h);
502f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (w == -1 && h == -1) {
503f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("Unable to get preview size");
504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return BAD_VALUE;
505a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        }
506a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoWidth = w;
508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoHeight = h;
5093a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
510b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = params.get(android::CameraParameters::KEY_RECORDING_HINT);
512b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
516b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGVB("Video Resolution: %d x %d", mVideoWidth, mVideoHeight);
518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
519f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (!mVTCUseCase)
520f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                {
522f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    int maxFPS, minFPS;
52372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    params.getPreviewFpsRange(&minFPS, &maxFPS);
525f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    maxFPS /= CameraHal::VFR_SCALE;
526f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ( ( maxFPS <= SW_SCALING_FPS_LIMIT ) ) {
527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        getPreferredPreviewRes(&w, &h);
528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
529f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
5313dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                restartPreviewRequired |= setVideoModeParameters(params);
532b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
533f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            else if(strcmp(valstr, android::CameraParameters::FALSE) == 0)
534b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
536ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= resetVideoModeParameters();
537b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
538b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
539b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
540b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
541a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
542b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
546b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
547b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
548b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
549b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
550b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, "");
552ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu            restartPreviewRequired |= resetVideoModeParameters();
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES)))
557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES)))
558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES))) ) {
559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return BAD_VALUE;
561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int oldWidth, oldHeight;
564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.getPreviewSize(&oldWidth, &oldHeight);
565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( ( oldWidth != w ) || ( oldHeight != h ) )
566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.setPreviewSize(w, h);
568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            restartPreviewRequired = true;
569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
571f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Preview Resolution: %d x %d", w, h);
572f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) {
5749743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
575a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                CAMHAL_LOGDB("Focus mode set %s", valstr);
5769743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
5779743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // we need to take a decision on the capture mode based on whether CAF picture or
5789743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // video is chosen so the behavior of each is consistent to the application
579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if(strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
5809743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= resetVideoModeParameters();
581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else if (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
5829743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= setVideoModeParameters(params);
5839743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                }
5849743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_FOCUS_MODE, valstr);
5869743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             } else {
5879743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
588a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
5899743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             }
5909743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        }
5919743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
592f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mRawCapture = false;
593f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
594f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = params.get(TICameraParameters::KEY_CAP_MODE);
596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) &&
597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                access(kRawImagesOutputDirPath, F_OK) != -1 ) {
598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mRawCapture = true;
599a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        }
600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
601f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
602f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (valstr = params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL )
603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
604f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Stereo 3D capture image layout is %s", valstr);
605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, valstr);
606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES)))
610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES)))
611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES)))
612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES))) ) {
613b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
614f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("ERROR: Invalid picture resolution %d x %d", w, h);
616a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
617f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
619b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
620b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (valstr = params.getPictureFormat()) != NULL ) {
622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ((strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) &&
624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH) &&
625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT)) {
626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    unsigned int width = 0, height = 0;
627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    // Set picture size to full frame for raw bayer capture
628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    width = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH));
629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    height = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT));
630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mParameters.setPictureSize(width,height);
631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
632f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.setPictureFormat(valstr);
633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = BAD_VALUE;
636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
638a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
639f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
640f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
641f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
642a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                CAMHAL_LOGDB("Burst set %s", valstr);
643f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
646a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
649a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
650a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
6511521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
6521521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
6531521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
6541521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // If Port FPS needs to be used for configuring, then FPS RANGE should not be set by the APP.
656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = params.get(android::CameraParameters::KEY_PREVIEW_FPS_RANGE);
657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valstr != NULL && strlen(valstr)) {
658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int curMaxFPS = 0;
659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int curMinFPS = 0;
660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
661524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Set framerate = MAXFPS
663524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
664d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman
665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.getPreviewFpsRange(&curMinFPS, &curMaxFPS);
666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("## current minFPS = %d; maxFPS=%d",curMinFPS, curMaxFPS);
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            params.getPreviewFpsRange(&minFPS, &maxFPS);
669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("## requested minFPS = %d; maxFPS=%d",minFPS, maxFPS);
670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Validate VFR
671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (!isFpsRangeValid(minFPS, maxFPS, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)) &&
672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                !isFpsRangeValid(minFPS, maxFPS, params.get(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED))) {
673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEA("Invalid FPS Range");
674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                framerate = maxFPS / CameraHal::VFR_SCALE;
677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.setPreviewFrameRate(framerate);
678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("FPS Range = %s", valstr);
681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ( curMaxFPS == (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) &&
682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                     maxFPS < (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) ) {
683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    restartPreviewRequired = true;
684524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            framerate = params.getPreviewFrameRate();
688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (!isParameterValid(framerate, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)) &&
689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                !isParameterValid(framerate, params.get(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED))) {
690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEA("Invalid frame rate");
691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            char tmpBuffer[MAX_PROP_VALUE_LENGTH];
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            sprintf(tmpBuffer, "%d,%d", framerate * CameraHal::VFR_SCALE, framerate * CameraHal::VFR_SCALE);
696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.setPreviewFrameRate(framerate);
697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, tmpBuffer);
699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("FPS Range = %s", tmpBuffer);
700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(TICameraParameters::KEY_GBCE)) != NULL) {
703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GBCE),
704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    android::CameraParameters::TRUE) == 0) {
705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("GBCE %s", valstr);
706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_GBCE, valstr);
707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid GBCE: %s", valstr);
709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
717f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(TICameraParameters::KEY_GLBCE)) != NULL) {
718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE),
719f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    android::CameraParameters::TRUE) == 0) {
720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("GLBCE %s", valstr);
721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid GLBCE: %s", valstr);
724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
728f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_S3D
733b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE_MODE)) != NULL ) {
735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("AutoConvergence mode set = %s", valstr);
736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, valstr);
737f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
739f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (valstr = params.get(TICameraParameters::KEY_MANUAL_CONVERGENCE)) != NULL ) {
740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int manualConvergence = (int)strtol(valstr, 0, 0);
741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( ( manualConvergence < strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN), 0, 0) ) ||
743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    ( manualConvergence > strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX), 0, 0) ) ) {
744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid Manual Convergence = %d", manualConvergence);
745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("ManualConvergence Value = %d", manualConvergence);
748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, valstr);
7491521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
750f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if((valstr = params.get(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION)) != NULL) {
753f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( strcmp(mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED),
754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    android::CameraParameters::TRUE) == 0 ) {
755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Mechanical Mialignment Correction is %s", valstr);
756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, valstr);
757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION);
759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
762f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
763f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Exposure mode set = %s", valstr);
765f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (!strcmp(valstr, TICameraParameters::EXPOSURE_MODE_MANUAL)) {
767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    int manualVal;
768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE)) != NULL) {
769f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE);
770f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
772f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            CAMHAL_LOGEB("ERROR: Manual Exposure = %s is out of range - "
773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            "setting minimum supported value", valstr);
774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        }
776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        CAMHAL_LOGDB("Manual Exposure = %s", valstr);
777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE, valstr);
778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT)) != NULL) {
780f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT);
781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            CAMHAL_LOGEB("ERROR: Manual Exposure right = %s is out of range - "
784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            "setting minimum supported value", valstr);
785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        }
787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        CAMHAL_LOGDB("Manual Exposure right = %s", valstr);
788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, valstr);
789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO)) != NULL) {
791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO);
792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            CAMHAL_LOGEB("ERROR: Manual Gain = %s is out of range - "
795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            "setting minimum supported value", valstr);
796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        }
798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        CAMHAL_LOGDB("Manual Gain = %s", valstr);
799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, valstr);
800f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT)) != NULL) {
802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT);
803f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
804f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
805f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            CAMHAL_LOGEB("ERROR: Manual Gain right = %s is out of range - "
806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            "setting minimum supported value", valstr);
807f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
808f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        }
809f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        CAMHAL_LOGDB("Manual Gain right = %s", valstr);
810f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, valstr);
811f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
812f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
813f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
814f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("ERROR: Invalid Exposure mode = %s", valstr);
815a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
817f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
818a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
819a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
820f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
821f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
822f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
823f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons               mParameters.set(android::CameraParameters::KEY_WHITE_BALANCE, valstr);
824f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
825f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
826a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev               return BAD_VALUE;
827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
828f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
830a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
831f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
832f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
833f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
834f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
835f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
836f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
837a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
838b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
839f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
841f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
842f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
843f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
844f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
845f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
846f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
847a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
848b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
849f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
851f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
852f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
853f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
854f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
855f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
856f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
857a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
859f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
861f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
862f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
863f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
864f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
865f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
866f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
867a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
868f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
869f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
870a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
871a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
872f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_ANTIBANDING)) != NULL) {
873f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
874f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
875f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_ANTIBANDING, valstr);
876f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
877f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
878a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
879f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
880f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
881f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
882a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
883f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
884f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
885f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
886f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
887f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
888f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
889a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
890b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
891f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
892a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
893a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
894f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_FOCUS_AREAS)) != NULL )
895b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
896f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Focus areas position set %s", params.get(android::CameraParameters::KEY_FOCUS_AREAS));
897f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_FOCUS_AREAS, valstr);
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
900a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
903f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Measurements set to %s", valstr);
904b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
906f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (strcmp(valstr, android::CameraParameters::TRUE) == 0)
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
908b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
909b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
910f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            else if (strcmp(valstr, android::CameraParameters::FALSE) == 0)
911b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
912b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
913b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
914b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
916b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
917b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
919b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
920a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
921a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
922f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
924f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Exposure compensation set %s", params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION));
925f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
928f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_SCENE_MODE)) != NULL) {
929f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
930f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
931759396a116bb2caf006405777a626fe9a8708114Tyler Luu                doesSetParameterNeedUpdate(valstr,
932f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                           mParameters.get(android::CameraParameters::KEY_SCENE_MODE),
933759396a116bb2caf006405777a626fe9a8708114Tyler Luu                                           updateRequired);
934f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_SCENE_MODE, valstr);
935f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
936f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
937a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
939f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
941f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_FLASH_MODE)) != NULL) {
942f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
943f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
944f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_FLASH_MODE, valstr);
945f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
946f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
947a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
949f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
951f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_EFFECT)) != NULL) {
952f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
953f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
954f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_EFFECT, valstr);
955f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
956f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
957a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
958f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
959f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
961f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        varint = params.getInt(android::CameraParameters::KEY_ROTATION);
962f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( varint >= 0 ) {
963a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Rotation set %d", varint);
964f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_ROTATION, varint);
965f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
967f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        varint = params.getInt(android::CameraParameters::KEY_JPEG_QUALITY);
968f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( varint >= 0 ) {
969a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Jpeg quality set %d", varint);
970f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_JPEG_QUALITY, varint);
971f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
973f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
974f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( varint >= 0 ) {
975a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail width set %d", varint);
976f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint);
977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
980f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( varint >= 0 ) {
981a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail width set %d", varint);
982f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint);
983f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
985f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
986f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( varint >= 0 ) {
987a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail quality set %d", varint);
988f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint);
989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
991f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_GPS_LATITUDE)) != NULL )
992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
993f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("GPS latitude set %s", params.get(android::CameraParameters::KEY_GPS_LATITUDE));
994f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_GPS_LATITUDE, valstr);
995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
996f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(android::CameraParameters::KEY_GPS_LATITUDE);
997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
1000b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1001f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("GPS longitude set %s", params.get(android::CameraParameters::KEY_GPS_LONGITUDE));
1002f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_GPS_LONGITUDE, valstr);
1003b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1004f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(android::CameraParameters::KEY_GPS_LONGITUDE);
1005b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1007f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
1008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1009f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("GPS altitude set %s", params.get(android::CameraParameters::KEY_GPS_ALTITUDE));
1010f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_GPS_ALTITUDE, valstr);
1011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1012f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(android::CameraParameters::KEY_GPS_ALTITUDE);
1013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1015f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
1016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1017f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("GPS timestamp set %s", params.get(android::CameraParameters::KEY_GPS_TIMESTAMP));
1018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_GPS_TIMESTAMP, valstr);
1019b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1020f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(android::CameraParameters::KEY_GPS_TIMESTAMP);
1021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
1024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1025a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS datestamp set %s", valstr);
1026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
1027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
1029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1031f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
1032b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1033f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("GPS processing method set %s", params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD));
1034f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
1035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1036f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.remove(android::CameraParameters::KEY_GPS_PROCESSING_METHOD);
1037b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1039b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
1040b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1041a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
1042b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
1043b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1044b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
1045b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1047b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
1048b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1049a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
1050b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
1051b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
1052b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
1053b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1055b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
1056b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1057a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("EXIF Model set %s", valstr);
1058b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
1059b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1061b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
1062b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1063a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("EXIF Make set %s", valstr);
1064b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
1065b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1067a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
1068b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
1069b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1070b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
1071b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
1072f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
1073b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1074f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        else if ((valstr = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) {
1075f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("ABS Exposure+Gain Bracketing set %s", params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE));
1076f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valstr);
1077f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
1078f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else
1079b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1080b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
1081b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE)) != NULL ) {
1084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Zoom Bracketing range %s", valstr);
1085f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE, valstr);
1086f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1087f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.remove(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE);
1088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1089a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
1090a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
1091f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((valstr = params.get(android::CameraParameters::KEY_ZOOM)) != NULL ) {
1092f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            varint = atoi(valstr);
1093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( varint >= 0 && varint <= mMaxZoomSupported ) {
1094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Zoom set %d", varint);
1095f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
1096f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                           mParameters.get(android::CameraParameters::KEY_ZOOM),
1097f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
1098f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(android::CameraParameters::KEY_ZOOM, valstr);
1099f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
1100f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
1101a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
1102b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1103f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
1106b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
1107a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr);
1108f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
1109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                       mParameters.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
1110f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
1111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
1112b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
1115b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
1116a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr);
1117f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
1118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                       mParameters.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
1119f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
1120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
1121b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
1122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(android::CameraParameters::KEY_METERING_AREAS)) != NULL )
1123708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
1124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Metering areas position set %s", params.get(android::CameraParameters::KEY_METERING_AREAS));
1125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_METERING_AREAS, valstr);
1126708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::RAW_WIDTH)) != NULL ) {
1129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Raw image width set %s", params.get(TICameraParameters::RAW_WIDTH));
1130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::RAW_WIDTH, valstr);
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::RAW_HEIGHT)) != NULL ) {
1134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Raw image height set %s", params.get(TICameraParameters::RAW_HEIGHT));
1135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::RAW_HEIGHT, valstr);
1136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1137a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
1138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        //TI extensions for enable/disable algos
11390db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov        if( (valstr = params.get(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA)) != NULL )
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
11410db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            CAMHAL_LOGDB("External Gamma set %s", valstr);
11420db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            mParameters.set(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA, valstr);
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF1)) != NULL )
1146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("NSF1 set %s", valstr);
1148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ALGO_NSF1, valstr);
1149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF2)) != NULL )
1152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("NSF2 set %s", valstr);
1154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ALGO_NSF2, valstr);
1155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ALGO_SHARPENING)) != NULL )
1158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Sharpening set %s", valstr);
1160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ALGO_SHARPENING, valstr);
1161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ALGO_THREELINCOLORMAP)) != NULL )
1164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Color Conversion set %s", valstr);
1166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, valstr);
1167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( (valstr = params.get(TICameraParameters::KEY_ALGO_GIC)) != NULL )
1170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Green Inballance Correction set %s", valstr);
1172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_ALGO_GIC, valstr);
1173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
11750db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov        if( (valstr = params.get(TICameraParameters::KEY_GAMMA_TABLE)) != NULL )
11760db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            {
11770db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            CAMHAL_LOGDB("Manual gamma table set %s", valstr);
11780db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            mParameters.set(TICameraParameters::KEY_GAMMA_TABLE, valstr);
11790db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov            }
11800db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov
1181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::CameraParameters adapterParams = mParameters;
1182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
1184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
1185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
1187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( 0 < posBracketRange )
1188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                {
1189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mBracketRangePositive = posBracketRange;
1190f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
1191f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1192f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
1193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1197b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
1198b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
1199b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
1200b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
1201b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1203b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1205b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
1206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ( strcmp(valstr, android::CameraParameters::TRUE) == 0 )) {
1207f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( !mBracketingEnabled ) {
1208b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
1209b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
1210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
1211b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
1214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
1215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
1216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ( strcmp(valstr, android::CameraParameters::FALSE) == 0 )) {
1217b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
1218b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
1220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
1221b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
1222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( mBracketingRunning ) {
1223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                stopImageBracketing();
1224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1225b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            adapterParams.remove(TICameraParameters::KEY_TEMP_BRACKETING);
1228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.remove(TICameraParameters::KEY_TEMP_BRACKETING);
1229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1231b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
1233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mVTCUseCase && !mTunnelSetup && (mCameraAdapter != NULL) &&
1234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL )&&
1235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL )) {
1236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            uint32_t sliceHeight = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT);
1238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            uint32_t encoderHandle = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE);
1239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int w, h;
1240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.getPreviewSize(&w, &h);
1241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            status_t done = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SETUP_TUNNEL, sliceHeight, encoderHandle, w, h);
1242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (done == NO_ERROR) mTunnelSetup = true;
1243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret |= done;
1244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Only send parameters to adapter if preview is already
1248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
1249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // will be called in startPreview()
1250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // TODO(XXX): Need to identify other parameters that need update from camera adapter
1251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (NULL != mCameraAdapter) &&
1252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             (mPreviewEnabled || updateRequired) &&
1253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             (!(mPreviewEnabled && restartPreviewRequired)) ) {
1254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret |= mCameraAdapter->setParameters(adapterParams);
1255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
1258b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
1259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ( strcmp(valstr, android::CameraParameters::TRUE) == 0 ))
1260b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1261b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1263b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
1264b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
1265b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
1266b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1267b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
1268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ( strcmp(valstr, android::CameraParameters::FALSE) == 0 ))
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1270b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
1271b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1272b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
1273b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
1274b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1276a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
1277b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1279b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
1280b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
1281a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mParameters = oldParams;
1282b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
1283b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
1284b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
1285b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
12863dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
1287ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Restarting Preview");
1288b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
12893dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    } else if (restartPreviewRequired && !previewEnabled() &&
12903dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                mDisplayPaused && !mRecordingEnabled) {
1291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Restarting preview in paused mode");
1292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = restartPreview();
1293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // TODO(XXX): If there is some delay between the restartPreview call and the code
1295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // below, then the user could see some preview frames and callbacks. Let's find
1296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // a better place to put this later...
1297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret == NO_ERROR) {
1298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mDisplayPaused = true;
1299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPreviewEnabled = false;
1300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( !mBracketingRunning && mBracketingEnabled ) {
1305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        startImageBracketing();
1306ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    }
1307ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu
1308b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1310b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
1311b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1317b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!mPreviewBuffers)
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewBuffers = mDisplayAdapter->allocateBufferList(width, height,
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (NULL == mPreviewBuffers ) {
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1356f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDB("mPreviewBuffers = %p", mPreviewBuffers);
1370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(mPreviewBuffers)
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mBufProvider->freeBufferList(mPreviewBuffers);
1373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewBuffers = NULL;
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1393f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL != mPreviewDataBuffers )
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1401c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewDataBuffers = mMemoryManager->allocateBufferList(0, 0, NULL, bytes, bufferCount);
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL == mPreviewDataBuffers )
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL != mPreviewDataBuffers )
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = mMemoryManager->freeBufferList(mPreviewDataBuffers);
1447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPreviewDataBuffers = NULL;
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size,
14581d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                   const char* previewFormat, unsigned int bufferCount)
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
14611d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu    int bytes = size;
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1465fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // allocate image buffers only if not already allocated
1466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(NULL != mImageBuffers) {
1467fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
1468fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
14701d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu    if ( NO_ERROR == ret ) {
14711d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        bytes = ((bytes+4095)/4096)*4096;
1472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mImageBuffers = mMemoryManager->allocateBufferList(0, 0, previewFormat, bytes, bufferCount);
14731d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
14741d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        if( NULL == mImageBuffers ) {
14751d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
14761d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            ret = -NO_MEMORY;
14771d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        } else {
14781d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            bytes = size;
14791d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        }
1480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
148676826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev        mImageCount = bufferCount;
1487f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
149176826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev        mImageCount = 0;
1492f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1494f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
149972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
150072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
150172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
150272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
150372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons  if( NULL != mVideoBuffers ){
1505f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = freeVideoBufs(mVideoBuffers);
1506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mVideoBuffers = NULL;
150772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
150872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
150972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( NO_ERROR == ret ){
151072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int32_t stride;
1511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *buffers = new CameraBuffer [bufferCount];
151272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1513f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    memset (buffers, 0, sizeof(CameraBuffer) * bufferCount);
1514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (buffers != NULL){
1516f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      for (unsigned int i = 0; i< bufferCount; i++){
1517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
1518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        buffer_handle_t handle;
1519f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &handle, &stride);
152072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if (ret != NO_ERROR){
152172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
152272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          ret = -NO_MEMORY;
1523f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          for (unsigned int j=0; j< i; j++){
1524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Freeing Gralloc Buffer %p", buffers[i].opaque);
1525f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            GrallocAlloc.free((buffer_handle_t)buffers[i].opaque);
152672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
1527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          delete [] buffers;
152872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          goto exit;
152972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        }
1530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        buffers[i].type = CAMERA_BUFFER_GRALLOC;
1531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        buffers[i].opaque = (void *)handle;
1532f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", handle);
153372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
153472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      mVideoBuffers = buffers;
153672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
153772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    else{
153872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("Couldn't allocate video buffers ");
153972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      ret = -NO_MEMORY;
154072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
154172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
154272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
154372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit:
1544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons  LOG_FUNCTION_NAME_EXIT;
154572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
154672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
154772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
154872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1549f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::allocRawBufs(int width, int height, const char* previewFormat, int bufferCount)
1550f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
1551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   status_t ret = NO_ERROR;
1552f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME
1554f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///@todo Enhance this method allocImageBufs() to take in a flag for burst capture
1557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///Always allocate the buffers for image capture using MemoryManager
1558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR == ret) {
1559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(( NULL != mVideoBuffers )) {
1560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Re-use the buffer for raw capture.
1561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return ret;
1562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
1566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoLength = 0;
1567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoLength = (((width * height * 2) + 4095)/4096)*4096;
1568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoBuffers = mMemoryManager->allocateBufferList(width, height, previewFormat,
1569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                           mVideoLength, bufferCount);
1570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1571f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Size of Video cap buffer (used for RAW capture) %d", mVideoLength);
1572f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL == mVideoBuffers ) {
1573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("Couldn't allocate Video buffers using memory manager");
1574f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = -NO_MEMORY;
1575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1576f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
1579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoFd = mMemoryManager->getFd();
1580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoOffsets = mMemoryManager->getOffsets();
1581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
1582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoFd = -1;
1583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mVideoOffsets = NULL;
1584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
1587f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
1589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1608fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (NULL != userData) {
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1611fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_Out.get()) {
1625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_Out->disableDisplay();
1626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_In.get()) {
1629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_In->disableDisplay();
1630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
163288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( mBracketingRunning ) {
163388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        stopImageBracketing();
163488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    } else {
163588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
163688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NULL == mImageBuffers) {
1650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -EINVAL;
1651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_Out.get()) {
16541d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        mBufferSourceAdapter_Out = 0;
1655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
1656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mMemoryManager->freeBufferList(mImageBuffers);
1657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1659ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu    mImageBuffers = NULL;
1660ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::freeVideoBufs(CameraBuffer *bufs)
166772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
166872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
167072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
167172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
167272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons  if(bufs == NULL)
167472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    {
167572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
167672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
167772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      return BAD_VALUE;
167872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
167972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons  android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
168172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
168272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  for(int i = 0; i < count; i++){
1683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", bufs[i].opaque);
1684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    GrallocAlloc.free((buffer_handle_t)bufs[i].opaque);
168572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
168672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
168772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
168872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
168972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
169072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::freeRawBufs()
1693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
1694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
1695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME
1697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
1699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if( NULL != mVideoBuffers ) {
1700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ///@todo Pluralise the name of this method to freeBuffers
1701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = mMemoryManager->freeBufferList(mVideoBuffers);
1702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mVideoBuffers = NULL;
1703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = -EINVAL;
1705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT
1709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
1711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::startPreview() {
1722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
1723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // When tunneling is enabled during VTC, startPreview happens in 2 steps:
1725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // When the application sends the command CAMERA_CMD_PREVIEW_INITIALIZATION,
1726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // cameraPreviewInitialization() is called, which in turn causes the CameraAdapter
1727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // to move from loaded to idle state. And when the application calls startPreview,
1728f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // the CameraAdapter moves from idle to executing state.
1729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //
1730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // If the application calls startPreview() without sending the command
1731f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // CAMERA_CMD_PREVIEW_INITIALIZATION, then the function cameraPreviewInitialization()
1732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // AND startPreview() are executed. In other words, if the application calls
1733f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // startPreview() without sending the command CAMERA_CMD_PREVIEW_INITIALIZATION,
1734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // then the CameraAdapter moves from loaded to idle to executing state in one shot.
1735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = cameraPreviewInitialization();
1736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1737f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // The flag mPreviewInitializationDone is set to true at the end of the function
1738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // cameraPreviewInitialization(). Therefore, if everything goes alright, then the
1739f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // flag will be set. Sometimes, the function cameraPreviewInitialization() may
1740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // return prematurely if all the resources are not available for starting preview.
1741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // For example, if the preview window is not set, then it would return NO_ERROR.
1742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Under such circumstances, one should return from startPreview as well and should
1743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // not continue execution. That is why, we check the flag and not the return value.
1744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!mPreviewInitializationDone) return ret;
1745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Once startPreview is called, there is no need to continue to remember whether
1747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // the function cameraPreviewInitialization() was called earlier or not. And so
1748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // the flag mPreviewInitializationDone is reset here. Plus, this preserves the
1749f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // current behavior of startPreview under the circumstances where the application
1750f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // calls startPreview twice or more.
1751f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewInitializationDone = false;
1752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1753f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(mDisplayAdapter.get() != NULL) {
1755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Enabling display");
1756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int width, height;
1757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.getPreviewSize(&width, &height);
1758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview);
1761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else
1762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mDisplayAdapter->enableDisplay(width, height, NULL);
1763f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( ret != NO_ERROR ) {
1766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("Couldn't enable display");
1767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // FIXME: At this stage mStateSwitchLock is locked and unlock is supposed to be called
1769f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            //        only from mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW)
1770f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            //        below. But this will never happen because of goto error. Thus at next
1771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            //        startPreview() call CameraHAL will be deadlocked.
1772f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            //        Need to revisit mStateSwitch lock, for now just abort the process.
1773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_ASSERT_X(false,
1774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                "At this stage mCameraAdapter->mStateSwitchLock is still locked, "
1775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                "deadlock is guaranteed");
1776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto error;
1778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1780f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///Send START_PREVIEW command to adapter
1783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(ret!=NO_ERROR) {
1788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto error;
1790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDA("Started preview");
1792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewEnabled = true;
1794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewStartInProgress = false;
1795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
1796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    error:
1798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("Performing cleanup after error");
1800f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        //Do all the cleanup
1802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        freePreviewBufs();
1803f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1804f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(mDisplayAdapter.get() != NULL) {
1805f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mDisplayAdapter->disableDisplay(false);
1806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1807f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mAppCallbackNotifier->stop();
1808f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewStartInProgress = false;
1809f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewEnabled = false;
1810f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT;
1811f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1812f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return ret;
1813f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1814f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1815f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons////////////
1816f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
1817f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Set preview mode related initialization
1818f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          -> Camera Adapter set params
1819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          -> Allocate buffers
1820f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          -> Set use buffers for preview
1821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param none
1822f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR
1823f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Update function header with the different errors that are possible
1824f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1825f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
1826f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::cameraPreviewInitialization()
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1841f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mPreviewInitializationDone) {
1842f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
1843f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1844f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
18457016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ( mPreviewEnabled ){
18467016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      CAMHAL_LOGDA("Preview already running");
18477016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
18487016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return ALREADY_EXISTS;
1849e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1850e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1851e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
18527016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->setParameters(mParameters);
18537016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    }
18547016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
18557016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
18567016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
18577016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
18587016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
18597016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
18607016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
18617016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
18627016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ///Update the current preview width and height
18637016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewWidth = frame.mWidth;
18647016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewHeight = frame.mHeight;
1865e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1866e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1867e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
18687016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
1869f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      CAMHAL_LOGD("Preview not started. Preview in progress flag set");
18707016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewStartInProgress = true;
18717016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
18727016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
18737016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
18747016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
18757016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
18767016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return NO_ERROR;
1877e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1878e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1899f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1900f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        signalEndImageCapture();
1901ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        return ret;
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
19077016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1935f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            desc.mBuffers = mPreviewDataBuffers;
1936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1949f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mBuffers = mPreviewBuffers;
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19568fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
19578fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
19588fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
19598fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
19608fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
19618fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
19628fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
19638fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
19648fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1985f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret == NO_ERROR) mPreviewInitializationDone = true;
1986f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1987f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1988f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
1990f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1991f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    error:
1992f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1993f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("Performing cleanup after error");
1994f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1995f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        //Do all the cleanup
1996f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        freePreviewBufs();
1997f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(mDisplayAdapter.get() != NULL)
1999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
2000f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mDisplayAdapter->disableDisplay(false);
2001f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
2002f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mAppCallbackNotifier->stop();
2003f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewStartInProgress = false;
2004f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPreviewEnabled = false;
2005f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT;
2006f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2007f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return ret;
2008f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2009f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2010f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2011f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Sets ANativeWindow object.
2012f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2013f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
2014f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   to render buffers to display.
2015f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2016f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2017f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2020f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2021f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
2022f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2023f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2024f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraAdapter::BuffersDescriptor desc;
2025f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2026f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2027f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mSetPreviewWindowCalled = true;
2028f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2029f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
2030f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!window)
2031f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
2032f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(mDisplayAdapter.get() != NULL)
2033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2034f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ///NULL window passed, destroy the display adapter if present
2035f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("NULL window passed, destroying display adapter");
2036f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mDisplayAdapter.clear();
2037f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
2038f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ///@remarks so, we will wait until it passes a valid window to begin the preview again
2039f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mSetPreviewWindowCalled = false;
2040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2041f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("NULL ANativeWindow passed to setPreviewWindow");
2042f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
2043f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }else if(mDisplayAdapter.get() == NULL)
2044f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
2045f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Need to create the display adapter since it has not been created
2046f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Create display adapter
2047f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mDisplayAdapter = new ANativeWindowDisplayAdapter();
2048f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
2049f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mDisplayAdapter->setExtendedOps(mExtendedPreviewStreamOps);
2050f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
2051f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = NO_ERROR;
2052f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
2053f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
2054f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if(ret!=NO_ERROR)
2055f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
2056f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mDisplayAdapter.clear();
2057f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEA("DisplayAdapter initialize failed");
2058f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                LOG_FUNCTION_NAME_EXIT;
2059f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return ret;
2060f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
2062f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
2063f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
2064f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                LOG_FUNCTION_NAME_EXIT;
2065f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return NO_MEMORY;
2066f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
2067f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2068f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2069f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
2070f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
2071f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mDisplayAdapter->setFrameProvider(mCameraAdapter);
2072f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2073f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
2074f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2075f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Set it as the error handler for the DisplayAdapter
2076f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
2077f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2078f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Update the display adapter with the new window that is passed from CameraService
2079f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret  = mDisplayAdapter->setPreviewWindow(window);
2080f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(ret!=NO_ERROR)
2081f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
2082f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
2083f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
2084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2085f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(mPreviewStartInProgress)
2086f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
2087f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("setPreviewWindow called when preview running");
2088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Start the preview since the window is now available
2089f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = startPreview();
2090f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2091f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
2092f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Update the display adapter with the new window that is passed from CameraService
2093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mDisplayAdapter->setPreviewWindow(window);
2094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (NO_ERROR == ret) && previewEnabled() ) {
2095f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            restartPreview();
2096f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (ret == ALREADY_EXISTS) {
2097f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // ALREADY_EXISTS should be treated as a noop in this case
2098f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = NO_ERROR;
2099f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
2109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops)
2110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mExtendedPreviewStreamOps = ops;
2112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Sets Tapout Surfaces.
2116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   Buffers provided to CameraHal via this object for tap-out
2118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   functionality.
2119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setTapoutLocked(struct preview_stream_ops *tapout)
2126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index = -1;
2129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!tapout) {
2133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("Missing argument");
2134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT;
2135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
2136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Set tapout point
2139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Check name of tap-out
2140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 2. If not already set, then create a new one
2141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate
2142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //    in case dimensions have changed
2143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
2145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> out;
2146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        out = mOutAdapters.itemAt(i);
2147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = out->setPreviewWindow(tapout);
2148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret == ALREADY_EXISTS) {
2149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("Tap Out already set at index = %d", i);
2150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            index = i;
2151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = NO_ERROR;
2152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (index < 0) {
2156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> out  = new BufferSourceAdapter();
2157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = out->initialize();
2159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret != NO_ERROR) {
2160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            out.clear();
2161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("DisplayAdapter initialize failed");
2162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
2163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // BufferSourceAdapter will be handler of the extended OPS
2166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        out->setExtendedOps(mExtendedPreviewStreamOps);
2167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // CameraAdapter will be the frame provider for BufferSourceAdapter
2169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        out->setFrameProvider(mCameraAdapter);
2170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // BufferSourceAdapter will use ErrorHandler to send errors back to
2172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // the application
2173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        out->setErrorHandler(mAppCallbackNotifier.get());
2174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Update the display adapter with the new window that is passed from CameraService
2176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret  = out->setPreviewWindow(tapout);
2177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(ret != NO_ERROR) {
2178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
2179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
2180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
21821d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        if (NULL != mCameraAdapter) {
21831d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            unsigned int bufferCount, max_queueable;
21841d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            CameraFrame frame;
21851d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu
21861d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            bufferCount = out->getBufferCount();
21871d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            if (bufferCount < 1) bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
21881d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu
21891d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
21901d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                                  ( int ) &frame,
21911d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                                  bufferCount);
21921d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            if (NO_ERROR != ret) {
21931d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
21941d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            }
21951d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            if (NO_ERROR == ret) {
21961d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                CameraBuffer *bufs = NULL;
21971d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                unsigned int stride;
21981d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                unsigned int height = frame.mHeight;
21991d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                int size = frame.mLength;
22001d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu
22011d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                stride = frame.mAlignment / getBPP(mParameters.getPictureFormat());
22021d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                bufs = out->allocateBufferList(stride,
22031d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                               height,
22041d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                               mParameters.getPictureFormat(),
22051d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                               size,
22061d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                               bufferCount);
22071d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                if (bufs == NULL){
22081d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                    CAMHAL_LOGEB("error allocating buffer list");
22091d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                    goto exit;
22101d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                }
22111d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            }
22121d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        }
2213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mOutAdapters.add(out);
2214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit:
2217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Releases Tapout Surfaces.
2225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseTapoutLocked(struct preview_stream_ops *tapout)
2232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char id[OP_STR_SIZE];
2235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!tapout) {
2239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("Missing argument");
2240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT;
2241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
2242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Get the name of tapout
2245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = mExtendedPreviewStreamOps->get_id(tapout, id, sizeof(id));
2246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR != ret) {
2247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("get_id OPS returned error %d", ret);
2248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return ret;
2249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Check name of tap-out
2252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 2. If exist, then free buffers and then remove it
2253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_Out.get() && mBufferSourceAdapter_Out->match(id)) {
2254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("REMOVE tap out %p previously set as current", tapout);
2255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_Out.clear();
2256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
2258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> out;
2259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        out = mOutAdapters.itemAt(i);
2260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (out->match(id)) {
2261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("REMOVE tap out %p \"%s\" at position %d", tapout, id, i);
2262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mOutAdapters.removeAt(i);
2263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            break;
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Sets Tapin Surfaces.
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   Buffers provided to CameraHal via this object for tap-in
2276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   functionality.
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setTapinLocked(struct preview_stream_ops *tapin)
2284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index = -1;
2287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!tapin) {
2291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("Missing argument");
2292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT;
2293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
2294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Set tapin point
2297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Check name of tap-in
2298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 2. If not already set, then create a new one
2299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate
2300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //    in case dimensions have changed
2301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for (unsigned int i = 0; i < mInAdapters.size(); i++) {
2302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> in;
2303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        in = mInAdapters.itemAt(i);
2304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = in->setPreviewWindow(tapin);
2305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret == ALREADY_EXISTS) {
2306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("Tap In already set at index = %d", i);
2307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            index = i;
2308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = NO_ERROR;
2309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (index < 0) {
2313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> in  = new BufferSourceAdapter();
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = in->initialize();
2316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret != NO_ERROR) {
2317f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            in.clear();
2318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("DisplayAdapter initialize failed");
2319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // BufferSourceAdapter will be handler of the extended OPS
2323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        in->setExtendedOps(mExtendedPreviewStreamOps);
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // CameraAdapter will be the frame provider for BufferSourceAdapter
2326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        in->setFrameProvider(mCameraAdapter);
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // BufferSourceAdapter will use ErrorHandler to send errors back to
2329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // the application
2330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        in->setErrorHandler(mAppCallbackNotifier.get());
2331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Update the display adapter with the new window that is passed from CameraService
2333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret  = in->setPreviewWindow(tapin);
2334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(ret != NO_ERROR) {
2335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
2336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mInAdapters.add(in);
2340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit:
2343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Releases Tapin Surfaces.
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2355f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2356f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2357f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2358f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseTapinLocked(struct preview_stream_ops *tapin)
2359f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char id[OP_STR_SIZE];
2362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!tapin) {
2366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("Missing argument");
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
2369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Get the name of tapin
2372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = mExtendedPreviewStreamOps->get_id(tapin, id, sizeof(id));
2373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR != ret) {
2374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("get_id OPS returned error %d", ret);
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2378f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Check name of tap-in
2379f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 2. If exist, then free buffers and then remove it
2380f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_In.get() && mBufferSourceAdapter_In->match(id)) {
2381f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("REMOVE tap in %p previously set as current", tapin);
2382f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_In.clear();
2383f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2384f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for (unsigned int i = 0; i < mInAdapters.size(); i++) {
2385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::sp<DisplayAdapter> in;
2386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        in = mInAdapters.itemAt(i);
2387f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (in->match(id)) {
2388f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("REMOVE tap in %p \"%s\" at position %d", tapin, id, i);
2389f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mInAdapters.removeAt(i);
2390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            break;
2391f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2392f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2393f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2395f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2396f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   Buffers provided to CameraHal via this object for tap-in/tap-out
2404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   functionality.
2405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   TODO(XXX): this is just going to use preview_stream_ops for now, but we
2407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   most likely need to extend it when we want more functionality
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout)
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index = -1;
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGD ("setBufferSource(%p, %p)", tapin, tapout);
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = setTapoutLocked(tapout);
2426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret != NO_ERROR) {
2427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("setTapoutLocked returned error 0x%x", ret);
2428f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
2429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = setTapinLocked(tapin);
2432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret != NO_ERROR) {
2433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("setTapinLocked returned error 0x%x", ret);
2434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
2435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit:
2438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
2439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
2442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
2445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Releases ANativeWindow object.
2446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   Release Buffers previously released with setBufferSource()
2448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   TODO(XXX): this is just going to use preview_stream_ops for now, but we
2450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   most likely need to extend it when we want more functionality
2451f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param[in] window The ANativeWindow object created by Surface flinger
2453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If the ANativeWindow object passes validation criteria
2454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
2455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
2457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout)
2458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
2459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
2460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index = -1;
2461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
2463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
2465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGD ("releaseBufferSource(%p, %p)", tapin, tapout);
2466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (tapout) {
2467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret |= releaseTapoutLocked(tapout);
2468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret != NO_ERROR) {
2469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Error %d to release tap out", ret);
2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (tapin) {
2474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret |= releaseTapinLocked(tapin);
2475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret != NO_ERROR) {
2476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Error %d to release tap in", ret);
247739371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        }
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit:
2481f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
2497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2500150f3c891ce774b1546e90fab640ccb9c29ce536Akwasi Boateng    if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
2501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool imageCaptureRunning = (mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) &&
25070e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
25080e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
251497db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2520b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
2521b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
2556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
2558b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2559b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
2560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
25769743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // set internal recording hint in case camera adapter needs to make some
25779743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
2578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mParameters.set(TICameraParameters::KEY_RECORDING_HINT, android::CameraParameters::TRUE);
25799743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
25809743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // if application starts recording in continuous focus picture mode...
25819743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // then we need to force default capture mode (as opposed to video mode)
2582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ((valstr = mParameters.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
2583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
25849743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        restartPreviewRequired = resetVideoModeParameters();
25859743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
25869743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
25879743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // only need to check recording hint if preview restart is not already needed
2588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
25899743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( !restartPreviewRequired &&
2590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         (!valstr || (valstr && (strcmp(valstr, android::CameraParameters::TRUE) != 0))) ) {
25918b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        restartPreviewRequired = setVideoModeParameters(mParameters);
25929743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
2593b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
25949743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if (restartPreviewRequired) {
2595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
2596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            android::AutoMutex lock(mLock);
2597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mCapModeBackup = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
25999743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        ret = restartPreview();
26009743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
2601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
260372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
260472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
260572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        mParameters.getPreviewSize(&w, &h);
260672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
260772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
260872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if ((w != mVideoWidth) && (h != mVideoHeight))
260972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
261072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
261172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            if ( NO_ERROR != ret )
261272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
261372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
26149743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
261572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                return ret;
261672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
261772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
261872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(true);
261972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
2620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBuffers);
262172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
262272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        else
262372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
262472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(false);
262572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
2626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
262772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
262872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
2633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
2638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
2639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2659b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraHal::setVideoModeParameters(const android::CameraParameters& params)
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
2666a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    const char *valstrRemote = NULL;
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
2668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
2672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
2674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ( (valstr != NULL) && ( (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) &&
2675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE_HQ ) != 0) ) ) ) {
2676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
2677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
2678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
2679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // set VSTAB. restart is required if vstab value has changed
2682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (valstrRemote = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL ) {
2683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // make sure we support vstab
2684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
2685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                   android::CameraParameters::TRUE) == 0) {
2686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
2687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // vstab value has changed
2688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ((valstr != NULL) &&
2689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                 strcmp(valstr, valstrRemote) != 0) {
2690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                restartPreviewRequired = true;
2691cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
2692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
2693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            valstrRemote);
26948b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
2695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else if (mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) {
2696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // vstab was configured but now unset
2697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        restartPreviewRequired = true;
2698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.remove(android::CameraParameters::KEY_VIDEO_STABILIZATION);
2699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Set VNF
2702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((valstrRemote = params.get(TICameraParameters::KEY_VNF)) == NULL) {
2703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Enable VNF");
2704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
2705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        restartPreviewRequired = true;
2706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
2707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = mParameters.get(TICameraParameters::KEY_VNF);
2708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valstr && strcmp(valstr, valstrRemote) != 0) {
2709cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
27108b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
2711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.set(TICameraParameters::KEY_VNF, valstrRemote);
2712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#if !defined(OMAP_ENHANCEMENT) && !defined(ENHANCED_DOMX)
2715cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
2716cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
2717cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
2718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int w, h;
2719f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        params.getPreviewSize(&w, &h);
2720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
2721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valstr && (strcmp(valstr, android::CameraParameters::TRUE) == 0) && (w == 1920)) {
2722cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
2723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            const char *valKeyVnf = mParameters.get(TICameraParameters::KEY_VNF);
2724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if(!valKeyVnf || (strcmp(valKeyVnf, android::CameraParameters::TRUE) != 0)) {
2725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
2726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                restartPreviewRequired = true;
2727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
2728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
2730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2731b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2732b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2733b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2734b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2735b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2736b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2737b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
2738b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2739b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
2740b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2741b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2742b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
2743b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2744b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2745b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
2746b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2747b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2748b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
2749b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2750b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2751b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2752b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2753d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
2754d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
2755d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
2756d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
2757d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
2758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
2759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
27608b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
2761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
2762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2763b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
27648b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
2765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2767b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2768b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2771b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
2773b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2774b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
2775b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2776b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2777b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
2778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2779b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
2781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2783b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2784b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2785b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2787b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2788ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    forceStopPreview();
2789b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2790b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
2791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mLock);
2792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (!mCapModeBackup.isEmpty()) {
2793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_CAP_MODE, mCapModeBackup.string());
2794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mCapModeBackup = "";
2795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
2796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2798b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
2799b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
2800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
2802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
28177d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
28187d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
28227d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
28287d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
28297d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
28307d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
28317d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
28327d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
283972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
2840f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      freeVideoBufs(mVideoBuffers);
2841f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      if (mVideoBuffers){
2842f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGVB(" FREEING mVideoBuffers %p", mVideoBuffers);
2843f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        delete [] mVideoBuffers;
284472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2845f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons      mVideoBuffers = NULL;
284672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
284772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
28489743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // reset internal recording hint in case camera adapter needs to make some
28499743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
28509743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
28519743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2921f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
292278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
29232ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled |= CAMERA_MSG_FOCUS;
29242ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
292578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if ( NULL == mCameraAdapter )
292678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
292778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            ret = -1;
292878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
292978dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
293078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
293178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    CameraAdapter::AdapterState state;
293278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    ret = mCameraAdapter->getState(state);
293378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (ret != NO_ERROR)
293478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
293578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
293678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
29372ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
293878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (state == CameraAdapter::AF_STATE)
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2940e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev            CAMHAL_LOGI("Ignoring start-AF (already in progress)");
294178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
294278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
295578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan MalchevEXIT:
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
29772ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2978f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
2979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters adapterParams = mParameters;
29802ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled &= ~CAMERA_MSG_FOCUS;
29812ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2984f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, android::CameraParameters::FALSE);
2985fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mCameraAdapter->setParameters(adapterParams);
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
29873ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman        mAppCallbackNotifier->flushEventQueue();
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2989fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3038f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
3039f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraFrame frame;
3040f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraAdapter::BuffersDescriptor desc;
3041f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    unsigned int max_queueable = 0;
3042f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3043f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
30981d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu                                 ( mBracketRangeNegative + 1 ));
3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
310072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
310272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            desc.mBuffers = mImageBuffers;
3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
31131d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
3139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
3141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
3143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
314488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        if( !previewEnabled() )
3145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
314988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mBracketingRunning = false;
315088006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman
315188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Take a picture.
3160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @param none
3162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @return NO_ERROR If able to switch to image capture
3163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @todo Define error codes if unable to switch to image capture
3164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
3166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::takePicture(const char *params)
3167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
3168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
3169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return __takePicture(params);
3170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
3171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
3173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Internal function for getting a captured image.
3174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          shared by takePicture and reprocess.
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3180d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peevstatus_t CameraHal::__takePicture(const char *params, struct timeval *captureStart)
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // cancel AF state if needed (before any operation and mutex lock)
3183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mCameraAdapter->getState() == CameraAdapter::AF_STATE) {
3184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        cancelAutoFocus();
3185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
3190f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int burst = -1;
3191ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
3193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    unsigned int max_queueable = 0;
3194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    unsigned int rawBufferCount = 1;
3195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool isCPCamMode = false;
3196ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu    android::sp<DisplayAdapter> outAdapter = 0;
319776826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev    bool reuseTapout = false;
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3201d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    if ( NULL == captureStart ) {
3202d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev        gettimeofday(&mStartCapture, NULL);
3203d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    } else {
3204d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev        memcpy(&mStartCapture, captureStart, sizeof(struct timeval));
3205d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    }
3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
3214ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
3215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
3216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
3219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    isCPCamMode = valstr && !strcmp(valstr, TICameraParameters::CP_CAM_MODE);
3221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3222ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
3223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // however, we can queue a capture when in cpcam mode
3224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ((mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
3225ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
3226ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
3227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE)) &&
3228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         !isCPCamMode) {
3229ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
3230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
3231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3233ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
3234ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
3235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         (valstr && ( strcmp(valstr, TICameraParameters::VIDEO_MODE) &&
3236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      strcmp(valstr, TICameraParameters::VIDEO_MODE_HQ ) ) ) ) {
3237ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
3238ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
3239ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
3240ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
3241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
3242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // check if camera application is using shots parameters
3243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // api. parameters set here override anything set using setParameters
3244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TODO(XXX): Just going to use legacy TI parameters for now. Need
3245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // add new APIs in CameraHal to utilize android::ShotParameters later, so
3246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // we don't have to parse through the whole set of parameters
3247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // in camera adapter
3248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (strlen(params) > 0) {
3249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::ShotParameters shotParams;
3250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        const char *valStr;
3251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        const char *valExpComp, *valExpGain;
3252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int valNum;
3253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::String8 shotParams8(params);
3255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        shotParams.unflatten(shotParams8);
3257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
3258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
3259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valExpGain = shotParams.get(android::ShotParameters::KEY_EXP_GAIN_PAIRS);
3261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valExpComp = shotParams.get(android::ShotParameters::KEY_EXP_COMPENSATION);
3262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (NULL != valExpComp) {
3263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valExpComp);
3264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (NULL != valExpGain) {
3265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valExpGain);
3266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valNum = shotParams.getInt(android::ShotParameters::KEY_BURST);
3269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valNum >= 0) {
3270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(TICameraParameters::KEY_BURST, valNum);
3271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            burst = valNum;
3272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valStr = shotParams.get(android::ShotParameters::KEY_FLUSH_CONFIG);
3275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valStr!= NULL) {
3276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( 0 == strcmp(valStr, android::ShotParameters::TRUE) ) {
3277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
3278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                android::CameraParameters::TRUE);
3279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else if ( 0 == strcmp(valStr, android::ShotParameters::FALSE) ) {
3280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
3281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                android::CameraParameters::FALSE);
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_OUT);
3286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (valStr != NULL) {
3287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            int index = -1;
3288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
3289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if(mOutAdapters.itemAt(i)->match(valStr)) {
3290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    index = i;
3291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    break;
3292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
3293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
3294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (index < 0) {
3295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGE("Invalid tap out surface passed to camerahal");
3296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return BAD_VALUE;
3297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
3298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGD("Found matching out adapter at %d", index);
3299ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu            outAdapter = mOutAdapters.itemAt(index);
330076826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev            if ( outAdapter == mBufferSourceAdapter_Out ) {
330176826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                reuseTapout = true;
330276826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev            }
3303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter->setParameters(mParameters);
3306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else
3307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
3309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // TODO(XXX): Should probably reset burst and bracketing params
3310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // when we remove legacy TI parameters implementation
3311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3313d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3314d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3315d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture parameters set: ", &mStartCapture);
3316d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3317d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3318d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
331995395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev    // if we are already in the middle of a capture and using the same
332095395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev    // tapout ST...then we just need setParameters and start image
332195395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev    // capture to queue more shots
332295395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev    if (((mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) ==
332395395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev              CameraAdapter::CAPTURE_STATE) &&
332495395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev         (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) &&
332595395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev         (reuseTapout) ) {
332695395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
332795395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev        //pass capture timestamp along with the camera adapter command
332895395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,
332995395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev                                          (int) &mStartCapture);
333095395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev#else
333195395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
333295395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev#endif
333395395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev        return ret;
333495395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev    }
333595395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev
3336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( !mBracketingRunning )
3337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
3338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         // if application didn't set burst through android::ShotParameters
3339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         // then query from TICameraParameters
3340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         if ((burst == -1) && (NO_ERROR == ret)) {
3341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
3342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         }
3343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
3345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         if ( burst > 0 ) {
3346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             // For CPCam mode...allocate for worst case burst
3347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             bufferCount = isCPCamMode || (burst > CameraHal::NO_BUFFERS_IMAGE_CAPTURE) ?
3348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               CameraHal::NO_BUFFERS_IMAGE_CAPTURE : burst;
3349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3350ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu             if (outAdapter.get()) {
335176826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                if ( reuseTapout ) {
335276826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    bufferCount = mImageCount;
335376826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                } else {
335476826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    bufferCount = outAdapter->getBufferCount();
335576826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    if (bufferCount < 1) {
335676826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                        bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
335776826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    }
3358ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                }
3359f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             }
3360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             if ( NULL != mAppCallbackNotifier.get() ) {
3362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
3363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
3364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         } else if ( mBracketingEnabled ) {
3365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             bufferCount = mBracketRangeNegative + 1;
3366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             if ( NULL != mAppCallbackNotifier.get() ) {
3367f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                 mAppCallbackNotifier->setBurst(false);
3368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             }
3369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         } else {
3370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons             if ( NULL != mAppCallbackNotifier.get() ) {
3371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
3372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
3373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         }
3374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3375ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
3376ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
3377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( (NO_ERROR == ret) && (NULL != mDisplayAdapter.get()) ) {
3378ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
3379ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
3380ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
3381ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
3382ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
3383ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
3384ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
3385ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
3386ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
3387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
3390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3391ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
3392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3393c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        // if we taking video snapshot...
3394c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
3395c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // enable post view frames if not already enabled so we can internally
3396c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // save snapshot frames for generating thumbnail
3397c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
3398c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu                mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
3399c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            }
3400c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        }
3401c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu
3402ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
3403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
3405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
3406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
3407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
3408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
3410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
3411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
3412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
3413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3415d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3416d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3417d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture buffer size queried: ", &mStartCapture);
3418d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3419d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3420d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3421ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu        if (outAdapter.get()) {
342276826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev            // Avoid locking the tapout again when reusing it
342376826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev            if (!reuseTapout) {
342476826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                // Need to reset buffers if we are switching adapters since we don't know
342576826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                // the state of the new buffer list
342676826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                ret = outAdapter->maxQueueableBuffers(max_queueable);
342776826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                if (NO_ERROR != ret) {
342876826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    CAMHAL_LOGE("Couldn't get max queuable");
342976826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                    return ret;
343076826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                }
343176826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mImageBuffers = outAdapter->getBuffers(true);
343276826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mImageOffsets = outAdapter->getOffsets();
343376826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mImageFd = outAdapter->getFd();
343476826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mImageLength = outAdapter->getSize();
343576826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mImageCount = bufferCount;
343676826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev                mBufferSourceAdapter_Out = outAdapter;
3437ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu            }
3438ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu        } else {
3439ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu            mBufferSourceAdapter_Out.clear();
3440ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu            // allocImageBufs will only allocate new buffers if mImageBuffers is NULL
3441ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu            if ( NO_ERROR == ret ) {
3442ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                max_queueable = bufferCount;
3443ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                ret = allocImageBufs(frame.mAlignment / getBPP(mParameters.getPictureFormat()),
3444ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                                     frame.mHeight,
3445ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                                     frame.mLength,
3446ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                                     mParameters.getPictureFormat(),
3447ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                                     bufferCount);
3448ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                if ( NO_ERROR != ret ) {
3449ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                    CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
3450ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu                }
3451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
34521d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu        }
3453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3454d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3455d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3456d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture buffers allocated: ", &mStartCapture);
3457d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    memcpy(&mImageBuffers->ppmStamp, &mStartCapture, sizeof(struct timeval));
3458d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3459d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3460d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3461d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
3462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            desc.mBuffers = mImageBuffers;
3464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
3465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
3466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
3467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
3468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            desc.mMaxQueueable = ( size_t ) max_queueable;
3469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
3471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
3472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mRawCapture) {
3474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( NO_ERROR == ret ) {
3475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Raw capture buffers setup - %s", mParameters.getPictureFormat());
3476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = allocRawBufs(mParameters.getInt(TICameraParameters::RAW_WIDTH),
3477f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   mParameters.getInt(TICameraParameters::RAW_HEIGHT),
3478f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB,
3479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   rawBufferCount);
3480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3481f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ( NO_ERROR != ret ) {
3482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    CAMHAL_LOGEB("allocRawBufs (for RAW capture) returned error 0x%x", ret);
3483f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
3484f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
3485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ((NO_ERROR == ret) && ( NULL != mCameraAdapter )) {
3487f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mBuffers = mVideoBuffers;
3488f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mOffsets = mVideoOffsets;
3489f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mFd = mVideoFd;
3490f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mLength = mVideoLength;
3491f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mCount = ( size_t ) rawBufferCount;
3492f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                desc.mMaxQueueable = ( size_t ) rawBufferCount;
3493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3494f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE,
3495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        ( int ) &desc);
3496f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
3497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3500d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3501d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3502d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev        CameraHal::PPM("Takepicture buffers registered: ", &mStartCapture);
3503d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3504d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3505d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((ret == NO_ERROR) && mBufferSourceAdapter_Out.get()) {
3507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_Out->enableDisplay(0, 0, NULL);
3508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((NO_ERROR == ret) && (NULL != mCameraAdapter)) {
3511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
3515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
3516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3517d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev        CameraHal::PPM("Takepicture capture started: ", &mStartCapture);
3518d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
3520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
3522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3525f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
3532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
3534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
3537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
3538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
3541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
3544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3545f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = signalEndImageCapture();
3546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
3547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
3551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
3554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
3557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::String8 params_str8;
3559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
356072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    const char * valstr = NULL;
3561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
3565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
3566f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
3567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) {
3570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
3571f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
3572f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
3573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
3574f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
3575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
3576f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
3577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL ) {
3581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
3582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
3583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
3584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
3585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
3586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
3587f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
3588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters mParams = mParameters;
359272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
359372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
3594f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
359572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if(valstr != NULL)
359672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
3597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
359872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
359972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            //HACK FOR MMS MODE
3600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            resetPreviewRes(&mParams);
360172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
360272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
3603524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
36049743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // do not send internal parameters to upper layers
36059743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
3606fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
36079743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
360872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    params_str8 = mParams.flatten();
3609524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
3610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
3611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
3612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
3613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
3617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
3619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
3623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
3624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Starts reprocessing operation.
3625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
3626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::reprocess(const char *params)
3627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
3628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
3629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int bufferCount = 0;
3630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraAdapter::BuffersDescriptor desc;
3631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *reprocBuffers = NULL;
3632f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::ShotParameters shotParams;
3633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char *valStr = NULL;
3634d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    struct timeval startReprocess;
3635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mLock);
3637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3638f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
3639f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3640d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3641d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3642d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    gettimeofday(&startReprocess, NULL);
3643d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3644d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3645d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 0. Get tap in surface
3647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (strlen(params) > 0) {
3648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::String8 shotParams8(params);
3649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        shotParams.unflatten(shotParams8);
3650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3652f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_IN);
3653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (valStr != NULL) {
3654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int index = -1;
3655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        for (unsigned int i = 0; i < mInAdapters.size(); i++) {
3656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if(mInAdapters.itemAt(i)->match(valStr)) {
3657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                index = i;
3658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                break;
3659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
3660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (index < 0) {
3662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Invalid tap in surface passed to camerahal");
3663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return BAD_VALUE;
3664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("Found matching in adapter at %d", index);
3666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBufferSourceAdapter_In = mInAdapters.itemAt(index);
3667f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
3668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("No tap in surface sent with shot config!");
3669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return BAD_VALUE;
3670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 1. Get buffers
3673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mBufferSourceAdapter_In.get()) {
3674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        reprocBuffers = mBufferSourceAdapter_In->getBufferList(&bufferCount);
3675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!reprocBuffers) {
3678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Error: couldn't get input buffers for reprocess()");
3679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
3680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3682d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3683d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3684d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3685d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Got reprocess buffers: ", &startReprocess);
3686d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3687d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3688d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 2. Get buffer information and parse parameters
3690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
3691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        shotParams.setBurst(bufferCount);
3692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3694d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3695d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3696d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    memcpy(&reprocBuffers->ppmStamp, &startReprocess, sizeof(struct timeval));
3697d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3698d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3699d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 3. Give buffer to camera adapter
3701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mBuffers = reprocBuffers;
3702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mOffsets = 0;
3703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mFd = 0;
3704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mLength = 0;
3705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mCount = (size_t) bufferCount;
3706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    desc.mMaxQueueable = (size_t) bufferCount;
3707d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS, (int) &desc);
3709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret != NO_ERROR) {
3710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Error calling camera use buffers");
3711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
3712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3714d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3715d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3716d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Reprocess buffers registered: ", &startReprocess);
3717d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3718d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
3719d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
3720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 4. Start reprocessing
3721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = mBufferSourceAdapter_In->enableDisplay(0, 0, NULL);
3722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret != NO_ERROR) {
3723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Error enabling tap in point");
3724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
3725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // 5. Start capturing
3728d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    ret = __takePicture(shotParams.flatten().string(), &startReprocess);
3729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3730d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peevexit:
3731f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
3732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
3733f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
3735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons   @brief Cancels current reprocessing operation
3736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3737f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
3738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::cancel_reprocess( )
3739f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
3740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
3741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
3742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = signalEndImageCapture();
3744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return NO_ERROR;
3745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
3746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
3750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
3752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
3756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
3759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
3760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
3763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
3769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
3771057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        return -EINVAL;
3772057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        }
3773057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
3774057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
3775057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands do NOT need preview to be started
3776057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
3777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    switch ( cmd ) {
3779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef ANDROID_API_JB_OR_LATER
3780f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
3781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    {
3782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        const bool enable = static_cast<bool>(arg1);
3783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mLock);
3784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( enable ) {
3785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE;
3786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
3787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE;
3788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
3789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return OK;
3791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3792057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    }
3793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ret == OK && !previewEnabled()
3795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
3796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            && (cmd != CAMERA_CMD_PREVIEW_INITIALIZATION)
3797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         ) {
3799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
3800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
3801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
3802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3803057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
3804057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands NEED preview to be started
3805057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
3806057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
3807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
3810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
3812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
3814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
3816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
3817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
3819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                break;
3820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
3822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
3824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
3826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
3828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
3832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3833f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
3834f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            case CAMERA_CMD_PREVIEW_DEINITIALIZATION:
3835f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if(mDisplayAdapter.get() != NULL) {
3836f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    ///Stop the buffer display first
3837f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mDisplayAdapter->disableDisplay();
3838f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
3839f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3840f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if(mAppCallbackNotifier.get() != NULL) {
3841f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    //Stop the callback sending
3842f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mAppCallbackNotifier->stop();
3843f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mAppCallbackNotifier->flushAndReturnFrames();
3844f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mAppCallbackNotifier->stopPreviewCallbacks();
3845f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
3846f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3847f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_DESTROY_TUNNEL);
3848f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mTunnelSetup = false;
3849f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3850f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                break;
3851f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3852f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            case CAMERA_CMD_PREVIEW_INITIALIZATION:
3853f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = cameraPreviewInitialization();
3854f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3855f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                break;
3856f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3857f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
3859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
3860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
3861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
3870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
3872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
3878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
3881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
3882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
3883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
3889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
3891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
3892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
3893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
3894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
3897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
3900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
3901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
3904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
3909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
3912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
3914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
3915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
3918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
3922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3923f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewBuffers = NULL;
3924f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mImageBuffers = NULL;
3925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
3926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
3927f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mVideoBuffers = NULL;
3928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
3929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
3930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
3933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
3934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
3935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
3936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
3937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
3938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
3939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
3940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
3941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
3942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
3943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
3944f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewDataBuffers = NULL;
3945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
3946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
3947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
3948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
3949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
3950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
395176826979c296e44f7d8b14a9597d2eaf3c59b7d7Emilian Peev    mImageCount = 0;
3952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
3953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
3954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
3955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
3956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
3957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
3958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
3959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
3960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
3961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
3962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
3963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
3964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
3965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
3966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
3967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
396872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoWidth = 0;
396972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoHeight = 0;
3970f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC
3971f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mVTCUseCase = false;
3972f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mTunnelSetup = false;
3973f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3974f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPreviewInitializationDone = false;
3975f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3976f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
3977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mExtendedPreviewStreamOps = 0;
3978f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
3979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3980f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //These values depends on the sensor characteristics
3981f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
3982f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mRawCapture = false;
3983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
3985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
3987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
3988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
3989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
3991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
3993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
3999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
4001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
4002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
4003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
4004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
4008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
4009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
4011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
4013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
4014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
4015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
4018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
4019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
4021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
4022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
4024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
4025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
4027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
4029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4031de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
4032f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    freeRawBufs();
4033de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
4034de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
4035de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
4036de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
4037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
4041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
4042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
4044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
4046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
4047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
4048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
4049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
4051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
4053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
4057f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char* sensor_name = NULL;
4058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
4060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
4061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
4062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
4064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
4065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
4067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
4068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
4069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
4072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
4073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
4074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
4076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
4078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4080f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_NAME)) != 0 ) {
4081f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        sensor_name = mCameraProperties->get(CameraProperties::CAMERA_NAME);
4082f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4083f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDB("Sensor index= %d; Sensor name= %s", sensor_index, sensor_name);
4084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4085f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (strcmp(sensor_name, V4L_CAMERA_NAME_USB) == 0) {
4086f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef V4L_CAMERA_ADAPTER
4087f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter = V4LCameraAdapter_Factory(sensor_index);
4088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
4089f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4090f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    else {
4091f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMX_CAMERA_ADAPTER
4092f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCameraAdapter = OMXCameraAdapter_Factory(sensor_index);
4093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
4094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
40969a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
4097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
4099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
4100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
4101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
4104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
4105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
4106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
4108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
4110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
4111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
4112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
4114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
4115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
4119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
4121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
4122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
4123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
4125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
4126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
4130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
4132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
4133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
4134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
4135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
4136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
4137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
4138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
4139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
4141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
4142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
4143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
4144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
4146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
4147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
4148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
4149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
4150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
4151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
4153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
4154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
4156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
4157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
4160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
4162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
4165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
4166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
4167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
4168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
4169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
4170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
4171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
4172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
4173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
4174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
4180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
4182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
4184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
4185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
4186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
4188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
4192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool ret = false;
4194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
4195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char tmpBuffer[MAX_PROP_VALUE_LENGTH];
4196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
4197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4200f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NULL == supportedResolutions) {
4201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
4202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%dx%d", width, height);
4206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (0 > status) {
4207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
4208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = isParameterValid(tmpBuffer, supportedResolutions);
4212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
4214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
4215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
4217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
4218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraHal::isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges)
4220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
4221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool ret = false;
4222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char supported[MAX_PROP_VALUE_LENGTH];
4223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char *pos;
4224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int suppFpsRangeArray[2];
4225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int i = 0;
4226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
4228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL == supportedFpsRanges ) {
4230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("Invalid supported FPS ranges string");
4231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return false;
4232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (fpsMin <= 0 || fpsMax <= 0 || fpsMin > fpsMax) {
4235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return false;
4236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    strncpy(supported, supportedFpsRanges, MAX_PROP_VALUE_LENGTH);
4239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    pos = strtok(supported, " (,)");
4240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    while (pos != NULL) {
4241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        suppFpsRangeArray[i] = atoi(pos);
4242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (i++) {
4243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (fpsMin >= suppFpsRangeArray[0] && fpsMax <= suppFpsRangeArray[1]) {
4244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = true;
4245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                break;
4246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
4247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            i = 0;
4248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
4249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        pos = strtok(NULL, " (,)");
4250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
4255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
4258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool ret = false;
4260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char *pos;
4261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char supported[MAX_PROP_VALUE_LENGTH];
4262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NULL == supportedParams) {
4266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
4267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NULL == param) {
4271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
4272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    strncpy(supported, supportedParams, MAX_PROP_VALUE_LENGTH - 1);
4276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    pos = strtok(supported, ",");
4278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    while (pos != NULL) {
4279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (!strcmp(pos, param)) {
4280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = true;
4281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            break;
4282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        pos = strtok(NULL, ",");
4284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
4287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
4290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
4293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool ret = false;
4295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
4296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char tmpBuffer[MAX_PROP_VALUE_LENGTH];
4297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NULL == supportedParams) {
4301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
4302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%d", param);
4306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (0 > status) {
4307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
4308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
4309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = isParameterValid(tmpBuffer, supportedParams);
4312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
4314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
4317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4319f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
4320f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
4321f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
4322f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
4323f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
4324f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
4325f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
4326f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
4327f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
4328f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
4329f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
4330f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
4331f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
4332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
4333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
4335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
4336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
4337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
4341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
4343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
4346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
4347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != resStr_copy )
4348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
4350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        pWidth = strtok_r(resStr_copy, sep, &ctx);
4351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
4353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
4355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
4357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
4359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
4360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
4364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
4366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
4368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
4370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
4372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
4373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
4374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
4375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
4376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4378f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    free(resStr_copy);
4379f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    resStr_copy = NULL;
4380f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
4384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
4387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters &p = mParameters;
4391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
4393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
4394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
4396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4397f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
4398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
4399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
4400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
4401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
4402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
4403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
4404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
4405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
4406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
4407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
4408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES_EXT));
4409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
4410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_EXT_SUPPORTED));
4411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
4412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
4413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
4414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
4415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
4416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
4417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
4418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
4419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
4420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
4421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
4422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
4423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX));
4424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP));
4425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
4426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX));
4427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP));
4428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
4429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
4430f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
4431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
4432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
4433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
4434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES));
4435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES));
4436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE_VALUES, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE_VALUES));
4437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN));
4438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX));
4439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_STEP));
4440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
4441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_VNF_SUPPORTED, mCameraProperties->get(CameraProperties::VNF_SUPPORTED));
4442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
4443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
4444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
4445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED));
4446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_CAP_MODE_VALUES, mCameraProperties->get(CameraProperties::CAP_MODE_VALUES));
4447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
4453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
4455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
4456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::CameraParameters &p = mParameters;
4458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
4459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
4460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
4461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char *valstr;
4462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    insertSupportedParams();
4466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
4468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
4470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
4472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
4474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
4476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
4479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
4481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
4483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
4485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
4487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
4490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
4492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
4494f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
4495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
4497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
4499f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
4500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
4501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
4503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
4504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
4505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
4506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
4507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
4508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
4509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
4510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
4511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
4512f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
4513f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
4514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
4515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
4516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
4517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
4518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
4519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
4520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
4521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MANUAL_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
4522f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
4523f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
4524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
4525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
4526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
4527d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
4528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_GBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GBCE));
4529f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_GLBCE, mCameraProperties->get(CameraProperties::GLBCE));
4530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_GLBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE));
4531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT));
4532f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT));
4533f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
4534f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, mCameraProperties->get(CameraProperties::MANUAL_CONVERGENCE));
4535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
4536f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_VNF, mCameraProperties->get(CameraProperties::VNF));
4537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
4538f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
4539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
4540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
4541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
4542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
4543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
4544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
4545f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
4546f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
4547f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION));
4548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
4549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
4550f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
4551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
4552f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
4553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(android::CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
4554f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::RAW_WIDTH, mCameraProperties->get(CameraProperties::RAW_WIDTH));
4555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::RAW_HEIGHT,mCameraProperties->get(CameraProperties::RAW_HEIGHT));
4556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TI extensions for enable/disable algos
4558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Hadcoded for now
45590db9de9c050c698df5c160249e4060efa96e10a7Vladimir Petrov    p.set(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA, android::CameraParameters::FALSE);
4560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_ALGO_NSF1, android::CameraParameters::TRUE);
4561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_ALGO_NSF2, android::CameraParameters::TRUE);
4562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_ALGO_SHARPENING, android::CameraParameters::TRUE);
4563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, android::CameraParameters::TRUE);
4564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    p.set(TICameraParameters::KEY_ALGO_GIC, android::CameraParameters::TRUE);
4565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
4570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
4571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
4572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
4573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
4575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
4576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
4580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( mBracketingRunning ) {
4581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        stopImageBracketing();
4582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
4583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
4585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
4586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
4587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
4590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
4591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
459226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
4593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
4594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
4597342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
4598342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
4599a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) {
4600342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
4601342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
4602342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
4603342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
4604342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
4605342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
4606a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        mCameraAdapter->rollbackToInitializedState();
4607a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
4608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
4611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
4612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
4614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
4615342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
4616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
4621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
4622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
4624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
4625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
4627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
4628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
4630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
4631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4634f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
4635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
4636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
4639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
4641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
4642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
4643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
4644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
4645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mBufferSourceAdapter_Out.clear();
4647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mBufferSourceAdapter_In.clear();
4648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mOutAdapters.clear();
4649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mInAdapters.clear();
4650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
4656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
4657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
4658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
4660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
4662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
4663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::getPreferredPreviewRes(int *width, int *height)
4665a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
4666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
4667a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
4668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // We request Ducati for a higher resolution so preview looks better and then downscale the frame before the callback.
4669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TODO: This should be moved to configuration constants and boolean flag whether to provide such optimization
4670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Also consider providing this configurability of the desired display resolution from the application
4671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ( *width == 320 ) && ( *height == 240 ) ) {
4672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        *width = 640;
4673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        *height = 480;
4674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else if ( ( *width == 176 ) && ( *height == 144 ) ) {
4675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        *width = 704;
4676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        *height = 576;
4677a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
4678a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
4679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
4680a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
4681a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
4682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::resetPreviewRes(android::CameraParameters *params)
468372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
468472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
468572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
4686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons  if ( (mVideoWidth <= 320) && (mVideoHeight <= 240)){
4687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    params->setPreviewSize(mVideoWidth, mVideoHeight);
468872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
468972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
469072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
469172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
469272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
4693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid *
4694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonscamera_buffer_get_omx_ptr (CameraBuffer *buffer)
469572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
4696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGV("buffer_type %d opaque %p", buffer->type, buffer->opaque);
4697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
4698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (buffer->type == CAMERA_BUFFER_ANW) {
4699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        buffer_handle_t *handle = (buffer_handle_t *)buffer->opaque;
4700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGV("anw %08x", *handle);
4701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return (void *)*handle;
4702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else if (buffer->type == CAMERA_BUFFER_ION) {
4703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return (void *)buffer->fd;
4704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
4705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGV("other %08x", buffer->opaque);
4706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return (void *)buffer->opaque;
4707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
470872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
470972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
4710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
4711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
4712