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