1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "BaseCameraAdapter.h"
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Camera Adapter Class STARTS here-----------------------------*/
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevBaseCameraAdapter::BaseCameraAdapter()
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mReleaseImageBuffersCallback = NULL;
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEndImageCaptureCallback = NULL;
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mErrorNotifier = NULL;
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEndCaptureData = NULL;
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mReleaseData = NULL;
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecording = false;
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBuffers = NULL;
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufferCount = 0;
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBuffersLength = 0;
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBuffers = NULL;
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBuffersCount = 0;
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBuffersLength = 0;
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureBuffers = NULL;
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureBuffersCount = 0;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureBuffersLength = 0;
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBuffers = NULL;
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBuffersCount = 0;
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBuffersLength = 0;
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAdapterState = INTIALIZED_STATE;
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mStartFocus.tv_sec = 0;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mStartFocus.tv_usec = 0;
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mStartCapture.tv_sec = 0;
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mStartCapture.tv_usec = 0;
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevBaseCameraAdapter::~BaseCameraAdapter()
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     LOG_FUNCTION_NAME;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     Mutex::Autolock lock(mSubscriberLock);
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mFrameSubscribers.clear();
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mImageSubscribers.clear();
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mRawSubscribers.clear();
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mVideoSubscribers.clear();
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mFocusSubscribers.clear();
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mShutterSubscribers.clear();
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mZoomSubscribers.clear();
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     mFaceSubscribers.clear();
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     LOG_FUNCTION_NAME_EXIT;
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data)
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mReleaseImageBuffersCallback = callback;
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mReleaseData = user_data;
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::registerEndCaptureCallback(end_image_capture_callback callback, void *user_data)
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEndImageCaptureCallback= callback;
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEndCaptureData = user_data;
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::setErrorHandler(ErrorNotifier *errorNotifier)
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == errorNotifier )
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid Error Notifier reference");
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mErrorNotifier = errorNotifier;
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::enableMsgType(int32_t msgs, frame_callback callback, event_callback eventCb, void* cookie)
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mSubscriberLock);
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( CameraFrame::PREVIEW_FRAME_SYNC == msgs )
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameSubscribers.add((int) cookie, callback);
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::FRAME_DATA_SYNC == msgs )
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameDataSubscribers.add((int) cookie, callback);
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::IMAGE_FRAME == msgs)
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageSubscribers.add((int) cookie, callback);
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::RAW_FRAME == msgs)
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRawSubscribers.add((int) cookie, callback);
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::VIDEO_FRAME_SYNC == msgs)
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mVideoSubscribers.add((int) cookie, callback);
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraHalEvent::ALL_EVENTS == msgs)
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFocusSubscribers.add((int) cookie, eventCb);
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mShutterSubscribers.add((int) cookie, eventCb);
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mZoomSubscribers.add((int) cookie, eventCb);
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFaceSubscribers.add((int) cookie, eventCb);
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Message type subscription no supported yet!");
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::disableMsgType(int32_t msgs, void* cookie)
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mSubscriberLock);
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( CameraFrame::PREVIEW_FRAME_SYNC == msgs )
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameSubscribers.removeItem((int) cookie);
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::FRAME_DATA_SYNC == msgs )
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameDataSubscribers.removeItem((int) cookie);
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::IMAGE_FRAME == msgs)
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageSubscribers.removeItem((int) cookie);
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::RAW_FRAME == msgs)
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRawSubscribers.removeItem((int) cookie);
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::VIDEO_FRAME_SYNC == msgs)
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mVideoSubscribers.removeItem((int) cookie);
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraFrame::ALL_FRAMES  == msgs )
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameSubscribers.removeItem((int) cookie);
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFrameDataSubscribers.removeItem((int) cookie);
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageSubscribers.removeItem((int) cookie);
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRawSubscribers.removeItem((int) cookie);
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mVideoSubscribers.removeItem((int) cookie);
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( CameraHalEvent::ALL_EVENTS == msgs)
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Subscribe only for focus
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //TODO: Process case by case
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFocusSubscribers.removeItem((int) cookie);
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mShutterSubscribers.removeItem((int) cookie);
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mZoomSubscribers.removeItem((int) cookie);
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFaceSubscribers.removeItem((int) cookie);
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Message type 0x%x subscription no supported yet!", msgs);
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2238e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boatengvoid BaseCameraAdapter::addFramePointers(void *frameBuf, void *buf)
2248e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng{
2258e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  unsigned int *pBuf = (unsigned int *)buf;
2268e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  Mutex::Autolock lock(mSubscriberLock);
2278e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
2288e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  if ((frameBuf != NULL) && ( pBuf != NULL) )
2298e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    {
2308e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      CameraFrame *frame = new CameraFrame;
2318e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      frame->mBuffer = frameBuf;
2328e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      frame->mYuv[0] = pBuf[0];
2338e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      frame->mYuv[1] = pBuf[1];
2348e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      mFrameQueue.add(frameBuf, frame);
2358e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
2368e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      CAMHAL_LOGVB("Adding Frame=0x%x Y=0x%x UV=0x%x", frame->mBuffer, frame->mYuv[0], frame->mYuv[1]);
2378e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    }
2388e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng}
2398e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
2408e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boatengvoid BaseCameraAdapter::removeFramePointers()
2418e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng{
2428e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  Mutex::Autolock lock(mSubscriberLock);
2438e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
2448e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  int size = mFrameQueue.size();
2458e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  CAMHAL_LOGVB("Removing %d Frames = ", size);
2468e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  for (int i = 0; i < size; i++)
2478e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    {
2488e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      CameraFrame *frame = (CameraFrame *)mFrameQueue.valueAt(i);
2498e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      CAMHAL_LOGVB("Free Frame=0x%x Y=0x%x UV=0x%x", frame->mBuffer, frame->mYuv[0], frame->mYuv[1]);
2508e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      delete frame;
2518e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    }
2528e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng  mFrameQueue.clear();
2538e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng}
2548e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frameType)
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t res = NO_ERROR;
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t subscriberCount = 0;
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int refCount = -1;
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frameBuf )
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid frameBuf");
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res)
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
269609bc02b21c725825bd469391e9ecd4e2d462fe1Tyler Luu        Mutex::Autolock lock(mReturnFrameLock);
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        refCount = getFrameRefCount(frameBuf,  frameType);
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
273c493114006e0e136c8c88c2fc9865994054959bfSundar Raman        if(frameType == CameraFrame::PREVIEW_FRAME_SYNC)
274c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            {
275c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mFramesWithDisplay--;
276c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            }
277c493114006e0e136c8c88c2fc9865994054959bfSundar Raman        else if(frameType == CameraFrame::VIDEO_FRAME_SYNC)
278c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            {
279c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mFramesWithEncoder--;
280c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            }
281c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 < refCount )
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refCount--;
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFrameRefCount(frameBuf, frameType, refCount);
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
288c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
2894f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu            if ( mRecording && (CameraFrame::VIDEO_FRAME_SYNC == frameType) ) {
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
2914f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu            } else if ( mRecording && (CameraFrame::PREVIEW_FRAME_SYNC == frameType) ) {
2924f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu                refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
2934f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu            } else if ( mRecording && (CameraFrame::SNAPSHOT_FRAME == frameType) ) {
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
2954f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu            }
2964f29332694e8222b3f1fae39d40edcdec1dec1bdTyler Luu
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
301e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev            CAMHAL_LOGDA("Frame returned when ref count is already zero!!");
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return;
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
306c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    CAMHAL_LOGVB("REFCOUNT 0x%x %d", frameBuf, refCount);
307c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res )
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //check if someone is holding this buffer
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == refCount )
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
313c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#ifdef DEBUG_LOG
314c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            if(mBuffersWithDucati.indexOfKey((int)frameBuf)>=0)
315c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                {
31646de639b23db99d7b99ff1c676ac98b84b6336c6Steve Block                ALOGE("Buffer already with Ducati!! 0x%x", frameBuf);
31746de639b23db99d7b99ff1c676ac98b84b6336c6Steve Block                for(int i=0;i<mBuffersWithDucati.size();i++) ALOGE("0x%x", mBuffersWithDucati.keyAt(i));
318c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                }
319c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mBuffersWithDucati.add((int)frameBuf,1);
320c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#endif
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            res = fillThisBuffer(frameBuf, frameType);
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3)
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct timeval *refTimestamp;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BuffersDescriptor *desc = NULL;
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame *frame = NULL;
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( operation ) {
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW:
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for preview");
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid preview buffers!");
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -EINVAL;
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = setState(operation);
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    Mutex::Autolock lock(mPreviewBufferLock);
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffers = (int *) desc->mBuffers;
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersLength = desc->mLength;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersAvailable.clear();
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 0);
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // initial ref count for undeqeueued buffers is 1 since buffer provider
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // is still holding on to it
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 1);
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_PREVIEW,
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mBuffers,
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mCount,
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mLength,
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mMaxQueueable);
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = commitState();
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret |= rollbackState();
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA:
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDA("Use buffers for preview data");
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    desc = ( BuffersDescriptor * ) value1;
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL == desc )
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        CAMHAL_LOGEA("Invalid preview data buffers!");
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        return -EINVAL;
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = setState(operation);
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        Mutex::Autolock lock(mPreviewDataBufferLock);
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffers = (int *) desc->mBuffers;
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersLength = desc->mLength;
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersAvailable.clear();
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            {
41388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                            mPreviewDataBuffersAvailable.add(mPreviewDataBuffers[i], 0);
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            }
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        // initial ref count for undeqeueued buffers is 1 since buffer provider
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        // is still holding on to it
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            {
41988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                            mPreviewDataBuffersAvailable.add(mPreviewDataBuffers[i], 1);
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            }
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL != desc )
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = useBuffers(CameraAdapter::CAMERA_MEASUREMENT,
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mBuffers,
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mCount,
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mLength,
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mMaxQueueable);
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = commitState();
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    else
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret |= rollbackState();
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for image capture");
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid capture buffers!");
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -EINVAL;
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = setState(operation);
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    Mutex::Autolock lock(mCaptureBufferLock);
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffers = (int *) desc->mBuffers;
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersLength = desc->mLength;
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersAvailable.clear();
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
46688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                        mCaptureBuffersAvailable.add(mCaptureBuffers[i], 0);
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // initial ref count for undeqeueued buffers is 1 since buffer provider
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // is still holding on to it
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
47288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                        mCaptureBuffersAvailable.add(mCaptureBuffers[i], 1);
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_IMAGE_CAPTURE,
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mBuffers,
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mCount,
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mLength,
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mMaxQueueable);
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = commitState();
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret |= rollbackState();
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_SMOOTH_ZOOM:
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startSmoothZoom(value1);
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM:
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopSmoothZoom();
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_PREVIEW:
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Start Preview");
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startPreview();
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_PREVIEW:
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop Preview");
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopPreview();
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_VIDEO:
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Start video recording");
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startVideoCapture();
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_VIDEO:
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop video recording");
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopVideoCapture();
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS:
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = flushBuffers();
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_IMAGE_CAPTURE:
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = takePicture();
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE:
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopImageCapture();
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_BRACKET_CAPTURE:
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value2;
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startBracketing(value1);
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE:
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopBracketing();
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PERFORM_AUTOFOCUS:
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartFocus, refTimestamp, sizeof( struct timeval ));
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = autoFocus();
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_CANCEL_AUTOFOCUS:
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = cancelAutoFocus();
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW:
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameSize(frame->mWidth, frame->mHeight);
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getPictureBufferSize(frame->mLength, value2);
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameDataSize(frame->mLength, value2);
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_START_FD:
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = startFaceDetection();
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_STOP_FD:
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = stopFaceDetection();
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
9747016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng         case CameraAdapter::CAMERA_SWITCH_TO_EXECUTING:
9757016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng           ret = switchToExecuting();
9767016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng           break;
9777016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Command 0x%x unsupported!", operation);
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
987057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luustatus_t BaseCameraAdapter::notifyFocusSubscribers(CameraHalEvent::FocusStatus status)
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent focusEvent;
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFocusSubscribers.size() == 0 ) {
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No Focus Subscribers!");
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1001057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu     if (status == CameraHalEvent::FOCUS_STATUS_PENDING) {
1002057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        gettimeofday(&mStartFocus, NULL);
1003057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu     } else {
1004057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        //dump the AF latency
1005057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        CameraHal::PPM("Focus finished in: ", &mStartFocus);
1006057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    }
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == focusEvent.mEventData.get() ) {
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED;
1015057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    focusEvent.mEventData->focusEvent.focusStatus = status;
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ )
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusEvent.mCookie = (void *) mFocusSubscribers.keyAt(i);
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFocusSubscribers.valueAt(i);
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &focusEvent );
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData.clear();
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyShutterSubscribers()
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent shutterEvent;
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mShutterSubscribers.size() == 0 )
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No shutter Subscribers!");
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == shutterEvent.mEventData.get() ) {
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventType = CameraHalEvent::EVENT_SHUTTER;
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData->shutterEvent.shutterClosed = true;
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mShutterSubscribers.size() ; i++ ) {
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i);
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = ( event_callback ) mShutterSubscribers.valueAt(i);
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
105741a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev        CAMHAL_LOGDA("Sending shutter callback");
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &shutterEvent );
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData.clear();
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyZoomSubscribers(int zoomIdx, bool targetReached)
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent zoomEvent;
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mZoomSubscribers.size() == 0 ) {
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No zoom Subscribers!");
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == zoomEvent.mEventData.get() ) {
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventType = CameraHalEvent::EVENT_ZOOM_INDEX_REACHED;
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.currentZoomIndex = zoomIdx;
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.targetZoomIndexReached = targetReached;
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mZoomSubscribers.size(); i++ ) {
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomEvent.mCookie = (void *) mZoomSubscribers.keyAt(i);
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mZoomSubscribers.valueAt(i);
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &zoomEvent );
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData.clear();
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyFaceSubscribers(sp<CameraFDResult> &faces)
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent faceEvent;
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFaceSubscribers.size() == 0 ) {
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No face detection subscribers!");
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == faceEvent.mEventData.get() ) {
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventType = CameraHalEvent::EVENT_FACE;
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData->faceEvent = faces;
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFaceSubscribers.size(); i++ ) {
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        faceEvent.mCookie = (void *) mFaceSubscribers.keyAt(i);
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFaceSubscribers.valueAt(i);
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &faceEvent );
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData.clear();
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame)
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
11435e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    unsigned int mask;
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frame )
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid CameraFrame");
11485e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        return -EINVAL;
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
11515e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    for( mask = 1; mask < CameraFrame::ALL_FRAMES; mask <<= 1){
11525e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      if( mask & frame->mFrameMask ){
11535e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        switch( mask ){
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
11555e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::IMAGE_FRAME:
11565e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
11585e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng            CameraHal::PPM("Shot to Jpeg: ", &mStartCapture);
11595e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng#endif
1160348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mImageSubscribers, CameraFrame::IMAGE_FRAME);
11615e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11625e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11635e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::RAW_FRAME:
11645e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1165348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mRawSubscribers, CameraFrame::RAW_FRAME);
11665e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11675e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11685e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::PREVIEW_FRAME_SYNC:
11695e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1170348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
11715e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11725e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11735e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::SNAPSHOT_FRAME:
11745e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1175348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::SNAPSHOT_FRAME);
11765e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11775e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11785e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::VIDEO_FRAME_SYNC:
11795e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1180348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mVideoSubscribers, CameraFrame::VIDEO_FRAME_SYNC);
11815e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11825e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11835e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::FRAME_DATA_SYNC:
11845e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1185348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameDataSubscribers, CameraFrame::FRAME_DATA_SYNC);
11865e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11875e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11885e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        default:
11895e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", mask);
11905e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
11915e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }//SWITCH
11925e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        frame->mFrameMask &= ~mask;
1193348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1194348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (ret != NO_ERROR) {
1195348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            goto EXIT;
1196348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
11975e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      }//IF
11985e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }//FOR
1199348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1200348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu EXIT:
1201348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    return ret;
1202348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu}
1203348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1204348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luustatus_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
1205348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                                     KeyedVector<int, frame_callback> *subscribers,
1206348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                                     CameraFrame::FrameType frameType)
1207348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu{
1208348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    size_t refCount = 0;
1209348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    status_t ret = NO_ERROR;
1210348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    frame_callback callback = NULL;
1211348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1212348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    frame->mFrameType = frameType;
1213348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12148a01f97380aad5b6a30a2d248aa07af4d92373d0Tyler Luu    if ( (frameType == CameraFrame::PREVIEW_FRAME_SYNC) ||
12158a01f97380aad5b6a30a2d248aa07af4d92373d0Tyler Luu         (frameType == CameraFrame::VIDEO_FRAME_SYNC) ||
12168a01f97380aad5b6a30a2d248aa07af4d92373d0Tyler Luu         (frameType == CameraFrame::SNAPSHOT_FRAME) ){
12178e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        if (mFrameQueue.size() > 0){
12188e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          CameraFrame *lframe = (CameraFrame *)mFrameQueue.valueFor(frame->mBuffer);
12198e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          frame->mYuv[0] = lframe->mYuv[0];
12208e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          frame->mYuv[1] = lframe->mYuv[1];
12218e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        }
12228e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        else{
1223e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev          CAMHAL_LOGDA("Empty Frame Queue");
12248e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          return -EINVAL;
12258e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        }
12268e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      }
12278e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
1228348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    if (NULL != subscribers) {
1229348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        refCount = getFrameRefCount(frame->mBuffer, frameType);
1230348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1231348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (refCount == 0) {
12327b4990d47f1765a2264cdf925730e486791c2d1cTyler Luu            CAMHAL_LOGDA("Invalid ref count of 0");
1233348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            return -EINVAL;
1234348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1235348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1236348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (refCount > subscribers->size()) {
1237348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            CAMHAL_LOGEB("Invalid ref count for frame type: 0x%x", frameType);
1238348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            return -EINVAL;
1239348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1240348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1241348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        CAMHAL_LOGVB("Type of Frame: 0x%x address: 0x%x refCount start %d",
1242348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     frame->mFrameType,
1243348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     ( uint32_t ) frame->mBuffer,
1244348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     refCount);
1245348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1246348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        for ( unsigned int i = 0 ; i < refCount; i++ ) {
1247348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            frame->mCookie = ( void * ) subscribers->keyAt(i);
1248348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            callback = (frame_callback) subscribers->valueAt(i);
1249348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1250348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            if (!callback) {
1251348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                CAMHAL_LOGEB("callback not set for frame type: 0x%x", frameType);
1252348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                return -EINVAL;
1253348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            }
1254348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1255348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            callback(frame);
1256348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1257348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    } else {
12587b4990d47f1765a2264cdf925730e486791c2d1cTyler Luu        CAMHAL_LOGEA("Subscribers is null??");
1259348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        return -EINVAL;
1260348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    }
1261348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12625e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    return ret;
12635e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng}
1264348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12655e02dd977e79ee977ee063496033bbc363a70780Akwasi Boatengint BaseCameraAdapter::setInitFrameRefCount(void* buf, unsigned int mask)
12665e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng{
12675e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  int ret = NO_ERROR;
12685e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  unsigned int lmask;
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12705e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  LOG_FUNCTION_NAME;
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12725e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  if (buf == NULL)
12735e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    {
12745e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      return -EINVAL;
12755e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12775e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  for( lmask = 1; lmask < CameraFrame::ALL_FRAMES; lmask <<= 1){
12785e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    if( lmask & mask ){
12795e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      switch( lmask ){
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12815e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::IMAGE_FRAME:
12825e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
1283524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          setFrameRefCount(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12855e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12865e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::RAW_FRAME:
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
12885e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12905e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12915e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::PREVIEW_FRAME_SYNC:
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
12935e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12955e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12965e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::SNAPSHOT_FRAME:
12975e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
12985e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::SNAPSHOT_FRAME, mFrameSubscribers.size());
12995e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
13005e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13015e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::VIDEO_FRAME_SYNC:
13025e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
13035e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
13045e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
13055e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13065e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::FRAME_DATA_SYNC:
13075e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
13085e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
13095e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
13105e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13115e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      default:
13125e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", lmask);
13135e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13145e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      }//SWITCH
13155e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      mask &= ~lmask;
13165e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }//IF
13175e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  }//FOR
13185e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
13195e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  return ret;
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint BaseCameraAdapter::getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType)
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int res = -1;
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mCaptureBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewDataBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mVideoBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return res;
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount)
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mCaptureBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewDataBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mVideoBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startVideoCapture()
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mVideoBufferLock);
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //If the capture is already ongoing, return from here.
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mRecording )
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1424b6a9d10508e321ebc53193a117bf6c65d98ae888Emilian Peev        mVideoBuffersAvailable.clear();
1425b6a9d10508e321ebc53193a117bf6c65d98ae888Emilian Peev
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mPreviewBuffersAvailable.size() ; i++ )
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mVideoBuffersAvailable.add(mPreviewBuffersAvailable.keyAt(i), 0);
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = true;
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopVideoCapture()
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mRecording )
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            void *frameBuf = ( void * ) mVideoBuffersAvailable.keyAt(i);
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if( getFrameRefCount(frameBuf,  CameraFrame::VIDEO_FRAME_SYNC) > 0)
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = false;
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------Stub implementation of the interface ------------------------------
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::takePicture()
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopImageCapture()
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startBracketing(int range)
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopBracketing()
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::autoFocus()
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1521057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    notifyFocusSubscribers(CameraHalEvent::FOCUS_STATUS_FAIL);
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::cancelAutoFocus()
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startSmoothZoom(int targetIdx)
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopSmoothZoom()
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startPreview()
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopPreview()
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable)
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType)
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameSize(size_t &width, size_t &height)
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameDataSize(size_t &dataFrameSize, size_t bufferCount)
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startFaceDetection()
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopFaceDetection()
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
16607016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boatengstatus_t BaseCameraAdapter::switchToExecuting()
16617016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng{
16627016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng  status_t ret = NO_ERROR;
16637016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng  LOG_FUNCTION_NAME;
16647016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
16657016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng  return ret;
16667016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng}
16677016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::setState(CameraCommands operation)
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.lock();
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( mAdapterState )
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case INTIALIZED_STATE:
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW:
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_RESOLUTION_PREVIEW:
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->INTIALIZED_STATE event = 0x%x",
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
169941a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev                case CAMERA_CANCEL_AUTOFOCUS:
170041a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev                case CAMERA_STOP_BRACKET_CAPTURE:
170141a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev                case CAMERA_STOP_IMAGE_CAPTURE:
170241a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev                    ret = INVALID_OPERATION;
170341a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev                    break;
170441a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x%x",
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_PREVIEW_STATE:
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_PREVIEW:
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->PREVIEW_STATE event = 0x%x",
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1726fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu                case CAMERA_STOP_PREVIEW:
1727fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
1728fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu                                 operation);
1729fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu                    mNextState = INTIALIZED_STATE;
1730fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu                    break;
1731fe3dccf76b03fe7e226ecc7c128dbc9e53d835a9Tyler Luu
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW_DATA:
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW Invalid Op! event = 0x%x",
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case PREVIEW_STATE:
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_PREVIEW:
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->AF_STATE event = 0x%x",
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->ZOOM_STATE event = 0x%x",
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_CAPTURE_STATE event = 0x%x",
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_CAPTURE_STATE;
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_VIDEO:
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->VIDEO_STATE event = 0x%x",
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
178685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                case CAMERA_CANCEL_AUTOFOCUS:
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = 0x%x",
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0x%x",
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_CAPTURE_STATE:
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_BRACKET_CAPTURE:
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->BRACKETING_STATE event = 0x%x",
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CAPTURE_STATE:
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_IMAGE_CAPTURE:
183688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                case CAMERA_STOP_BRACKET_CAPTURE:
1837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_STATE:
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
185788006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                case CAMERA_STOP_IMAGE_CAPTURE:
1858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_BRACKET_CAPTURE:
1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->PREVIEW_STATE event = 0x%x",
1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->CAPTURE_STATE event = 0x%x",
1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_STATE Invalid Op! event = 0x%x",
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case AF_STATE:
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18912bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray                case CAMERA_START_IMAGE_CAPTURE:
18922bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray                    CAMHAL_LOGDB("Adapter state switch AF_STATE->CAPTURE_STATE event = 0x%x",
18932bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray                                 operation);
18942bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray                    mNextState = CAPTURE_STATE;
18952bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray                    break;
18962bfd180d5257d72f7c22c80741e6b03470f3aa60Alex Ray
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->AF_ZOOM_STATE event = 0x%x",
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_STATE Invalid Op! event = 0x%x",
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case ZOOM_STATE:
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19182010763a13490313d773d8bbabec46414649b3abSundar Raman                case CAMERA_CANCEL_AUTOFOCUS:
19192010763a13490313d773d8bbabec46414649b3abSundar Raman                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
19202010763a13490313d773d8bbabec46414649b3abSundar Raman                                 operation);
19212010763a13490313d773d8bbabec46414649b3abSundar Raman                    mNextState = ZOOM_STATE;
19222010763a13490313d773d8bbabec46414649b3abSundar Raman                    break;
19232010763a13490313d773d8bbabec46414649b3abSundar Raman
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->PREVIEW_STATE event = 0x%x",
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->AF_ZOOM_STATE event = 0x%x",
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19363f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_VIDEO:
19373f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->VIDEO_ZOOM_STATE event = 0x%x",
19383f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
19393f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
19403f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
19413f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch ZOOM_STATE Invalid Op! event = 0x%x",
1944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case VIDEO_STATE:
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_VIDEO:
1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->PREVIEW_STATE event = 0x%x",
1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1963c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                case CAMERA_PERFORM_AUTOFOCUS:
1964c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_AF_STATE event = 0x%x",
1965c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                                 operation);
1966c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    mNextState = VIDEO_AF_STATE;
1967c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    break;
1968c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
19693f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_SMOOTH_ZOOM:
19703f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_ZOOM_STATE event = 0x%x",
19713f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
19723f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
19733f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
19743f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1975ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1976ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_LOADED_CAPTURE_STATE event = 0x%x",
1977ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1978ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_LOADED_CAPTURE_STATE;
1979ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1980ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1981ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1982ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_STATE event = 0x%x",
1983ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1984ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_STATE;
1985ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1986ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_STATE Invalid Op! event = 0x%x",
1989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1997c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu        case VIDEO_AF_STATE:
1998c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
1999c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu            switch ( operation )
2000c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                {
2001c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
2002c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                case CAMERA_CANCEL_AUTOFOCUS:
2003c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_AF_STATE->VIDEO_STATE event = 0x%x",
2004c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                                 operation);
2005c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    mNextState = VIDEO_STATE;
2006c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    break;
2007c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
2008c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                default:
2009c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    CAMHAL_LOGEB("Adapter state switch VIDEO_AF_STATE Invalid Op! event = 0x%x",
2010c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                                 operation);
2011c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    ret = INVALID_OPERATION;
2012c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                    break;
2013c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
2014c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu                }
2015c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
2016c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu            break;
2017c11c07d676f130e6e28ab1611f4862a01a160389Tyler Luu
2018ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        case VIDEO_LOADED_CAPTURE_STATE:
2019ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2020ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            switch ( operation )
2021ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                {
2022ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2023ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_START_IMAGE_CAPTURE:
2024ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
2025ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
2026ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_CAPTURE_STATE;
2027ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
2028ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2029ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                default:
2030ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
2031ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
2032ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    ret = INVALID_OPERATION;
2033ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
2034ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2035ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2036ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2037ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            break;
2038ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2039ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        case VIDEO_CAPTURE_STATE:
2040ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2041ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            switch ( operation )
2042ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                {
2043ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_STOP_IMAGE_CAPTURE:
2044ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
2045ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
2046ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_STATE;
2047ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
2048ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2049ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                default:
2050ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
2051ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
2052ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    ret = INVALID_OPERATION;
2053ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
2054ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2055ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2056ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2057ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            break;
2058ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case AF_ZOOM_STATE:
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->AF_STATE event = 0x%x",
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->ZOOM_STATE event = 0x%x",
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
2074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_ZOOM_STATE Invalid Op! event = 0x%x",
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case VIDEO_ZOOM_STATE:
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->VIDEO_STATE event = 0x%x",
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
20963f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
20973f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_STOP_VIDEO:
20983f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->ZOOM_STATE event = 0x%x",
20993f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
21003f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = ZOOM_STATE;
21013f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_ZOOM_STATE Invalid Op! event = 0x%x",
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_ZOOM_STATE:
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_ZOOM_STATE->BRACKETING_STATE event = 0x%x",
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_ZOOM_STATE Invalid Op! event = 0x%x",
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid Adapter state!");
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = INVALID_OPERATION;
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2144a58c483de2c8188e41fd9635042c31820d13b845Tyler Luustatus_t BaseCameraAdapter::rollbackToInitializedState()
2145a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu{
2146a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    status_t ret = NO_ERROR;
2147a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2148a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    LOG_FUNCTION_NAME;
2149a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2150a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    while ((getState() != INTIALIZED_STATE) && (ret == NO_ERROR)) {
2151a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        ret = rollbackToPreviousState();
2152a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    }
2153a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2154a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    LOG_FUNCTION_NAME_EXIT;
2155a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2156a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    return ret;
2157a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu}
2158a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2159a58c483de2c8188e41fd9635042c31820d13b845Tyler Luustatus_t BaseCameraAdapter::rollbackToPreviousState()
2160a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu{
2161a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    status_t ret = NO_ERROR;
2162a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2163a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    LOG_FUNCTION_NAME;
2164a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2165a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    CameraAdapter::AdapterState currentState = getState();
2166a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2167a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    switch (currentState) {
2168a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case INTIALIZED_STATE:
2169a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            return NO_ERROR;
2170a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2171a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case PREVIEW_STATE:
2172a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_PREVIEW);
2173a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2174a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2175a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case CAPTURE_STATE:
2176a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_IMAGE_CAPTURE);
2177a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2178a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2179a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case BRACKETING_STATE:
2180a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_BRACKET_CAPTURE);
2181a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2182a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2183a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case AF_STATE:
2184a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_CANCEL_AUTOFOCUS);
2185a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2186a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2187a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case ZOOM_STATE:
2188a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
2189a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2190a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2191a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case VIDEO_STATE:
2192a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_VIDEO);
2193a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2194a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2195a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case VIDEO_AF_STATE:
2196a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_CANCEL_AUTOFOCUS);
2197a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2198a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2199a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case VIDEO_CAPTURE_STATE:
2200a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_IMAGE_CAPTURE);
2201a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2202a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2203a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case AF_ZOOM_STATE:
2204a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
2205a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2206a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2207a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case VIDEO_ZOOM_STATE:
2208a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
2209a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2210a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2211a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        case BRACKETING_ZOOM_STATE:
2212a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
2213a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            break;
2214a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2215a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        default:
2216a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            CAMHAL_LOGEA("Invalid Adapter state!");
2217a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu            ret = INVALID_OPERATION;
2218a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    }
2219a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2220a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    LOG_FUNCTION_NAME_EXIT;
2221a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2222a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    return ret;
2223a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu}
2224a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
2225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//State transition finished successfully.
2226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Commit the state and unlock the adapter state.
2227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::commitState()
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAdapterState = mNextState;
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::rollbackState()
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mNextState = mAdapterState;
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// publicly exposed functions to retrieve the adapter states
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are locked
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getState()
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAdapterState;
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getNextState()
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mNextState;
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal protected functions to retrieve the adapter states
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are NOT locked to help
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal functions query state in the middle of state
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// transition
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getState(AdapterState &state)
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mAdapterState;
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getNextState(AdapterState &state)
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mNextState;
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::onOrientationEvent(uint32_t orientation, uint32_t tilt)
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------------------------------------------------------------------
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Camera Adapter Class ENDS here-----------------------------*/
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2330