BaseCameraAdapter.cpp revision 2010763a13490313d773d8bbabec46414649b3ab
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    Mutex::Autolock lock(mReturnFrameLock);
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frameBuf )
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid frameBuf");
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res)
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        refCount = getFrameRefCount(frameBuf,  frameType);
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
274c493114006e0e136c8c88c2fc9865994054959bfSundar Raman        if(frameType == CameraFrame::PREVIEW_FRAME_SYNC)
275c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            {
276c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mFramesWithDisplay--;
277c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            }
278c493114006e0e136c8c88c2fc9865994054959bfSundar Raman        else if(frameType == CameraFrame::VIDEO_FRAME_SYNC)
279c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            {
280c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mFramesWithEncoder--;
281c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            }
282c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 < refCount )
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refCount--;
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFrameRefCount(frameBuf, frameType, refCount);
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
289c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ( mRecording ) && (  CameraFrame::VIDEO_FRAME_SYNC == frameType ) )
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else if ( ( mRecording ) && (  CameraFrame::PREVIEW_FRAME_SYNC == frameType ) )
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
302c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            CAMHAL_LOGEA("Frame returned when ref count is already zero!!");
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return;
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
307c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    CAMHAL_LOGVB("REFCOUNT 0x%x %d", frameBuf, refCount);
308c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res )
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //check if someone is holding this buffer
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == refCount )
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
314c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#ifdef DEBUG_LOG
315c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            if(mBuffersWithDucati.indexOfKey((int)frameBuf)>=0)
316c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                {
317c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                LOGE("Buffer already with Ducati!! 0x%x", frameBuf);
318c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                for(int i=0;i<mBuffersWithDucati.size();i++) LOGE("0x%x", mBuffersWithDucati.keyAt(i));
319c493114006e0e136c8c88c2fc9865994054959bfSundar Raman                }
320c493114006e0e136c8c88c2fc9865994054959bfSundar Raman            mBuffersWithDucati.add((int)frameBuf,1);
321c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#endif
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            res = fillThisBuffer(frameBuf, frameType);
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3)
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct timeval *refTimestamp;
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BuffersDescriptor *desc = NULL;
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame *frame = NULL;
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( operation ) {
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW:
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for preview");
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid preview buffers!");
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -EINVAL;
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = setState(operation);
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    Mutex::Autolock lock(mPreviewBufferLock);
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffers = (int *) desc->mBuffers;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersLength = desc->mLength;
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersAvailable.clear();
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 0);
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // initial ref count for undeqeueued buffers is 1 since buffer provider
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // is still holding on to it
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 1);
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_PREVIEW,
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mBuffers,
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mCount,
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mLength,
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mMaxQueueable);
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = commitState();
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret |= rollbackState();
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA:
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDA("Use buffers for preview data");
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    desc = ( BuffersDescriptor * ) value1;
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL == desc )
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        CAMHAL_LOGEA("Invalid preview data buffers!");
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        return -EINVAL;
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = setState(operation);
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        Mutex::Autolock lock(mPreviewDataBufferLock);
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffers = (int *) desc->mBuffers;
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersLength = desc->mLength;
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersAvailable.clear();
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            {
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            mPreviewDataBuffersAvailable.add(mPreviewDataBuffers[i], true);
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            }
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        // initial ref count for undeqeueued buffers is 1 since buffer provider
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        // is still holding on to it
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            {
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            mPreviewDataBuffersAvailable.add(mPreviewBuffers[i], 1);
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            }
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL != desc )
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = useBuffers(CameraAdapter::CAMERA_MEASUREMENT,
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mBuffers,
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mCount,
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mLength,
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         desc->mMaxQueueable);
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( ret == NO_ERROR )
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = commitState();
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    else
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret |= rollbackState();
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for image capture");
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid capture buffers!");
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -EINVAL;
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = setState(operation);
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    Mutex::Autolock lock(mCaptureBufferLock);
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffers = (int *) desc->mBuffers;
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersLength = desc->mLength;
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersAvailable.clear();
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mCaptureBuffersAvailable.add(mCaptureBuffers[i], true);
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // initial ref count for undeqeueued buffers is 1 since buffer provider
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // is still holding on to it
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mCaptureBuffersAvailable.add(mPreviewBuffers[i], 1);
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_IMAGE_CAPTURE,
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mBuffers,
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mCount,
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mLength,
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mMaxQueueable);
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = commitState();
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret |= rollbackState();
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_SMOOTH_ZOOM:
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startSmoothZoom(value1);
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM:
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopSmoothZoom();
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_PREVIEW:
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Start Preview");
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startPreview();
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_PREVIEW:
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop Preview");
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopPreview();
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_VIDEO:
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Start video recording");
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startVideoCapture();
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_VIDEO:
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop video recording");
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopVideoCapture();
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS:
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = flushBuffers();
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_IMAGE_CAPTURE:
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = takePicture();
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE:
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopImageCapture();
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_BRACKET_CAPTURE:
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value2;
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startBracketing(value1);
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE:
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopBracketing();
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PERFORM_AUTOFOCUS:
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartFocus, refTimestamp, sizeof( struct timeval ));
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = autoFocus();
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_CANCEL_AUTOFOCUS:
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = cancelAutoFocus();
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW:
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameSize(frame->mWidth, frame->mHeight);
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getPictureBufferSize(frame->mLength, value2);
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameDataSize(frame->mLength, value2);
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_START_FD:
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = startFaceDetection();
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_STOP_FD:
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = stopFaceDetection();
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Command 0x%x unsupported!", operation);
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyFocusSubscribers(bool status)
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent focusEvent;
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFocusSubscribers.size() == 0 ) {
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No Focus Subscribers!");
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     //dump the AF latency
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     CameraHal::PPM("Focus finished in: ", &mStartFocus);
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == focusEvent.mEventData.get() ) {
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED;
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData->focusEvent.focusLocked = status;
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData->focusEvent.focusError = !status;
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ )
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusEvent.mCookie = (void *) mFocusSubscribers.keyAt(i);
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFocusSubscribers.valueAt(i);
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &focusEvent );
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData.clear();
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyShutterSubscribers()
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent shutterEvent;
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mShutterSubscribers.size() == 0 )
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No shutter Subscribers!");
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == shutterEvent.mEventData.get() ) {
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventType = CameraHalEvent::EVENT_SHUTTER;
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData->shutterEvent.shutterClosed = true;
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mShutterSubscribers.size() ; i++ ) {
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i);
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = ( event_callback ) mShutterSubscribers.valueAt(i);
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Sending shutter callback");
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &shutterEvent );
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData.clear();
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyZoomSubscribers(int zoomIdx, bool targetReached)
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent zoomEvent;
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mZoomSubscribers.size() == 0 ) {
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No zoom Subscribers!");
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == zoomEvent.mEventData.get() ) {
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventType = CameraHalEvent::EVENT_ZOOM_INDEX_REACHED;
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.currentZoomIndex = zoomIdx;
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.targetZoomIndexReached = targetReached;
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mZoomSubscribers.size(); i++ ) {
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomEvent.mCookie = (void *) mZoomSubscribers.keyAt(i);
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mZoomSubscribers.valueAt(i);
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &zoomEvent );
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData.clear();
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyFaceSubscribers(sp<CameraFDResult> &faces)
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent faceEvent;
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFaceSubscribers.size() == 0 ) {
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No face detection subscribers!");
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == faceEvent.mEventData.get() ) {
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventType = CameraHalEvent::EVENT_FACE;
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData->faceEvent = faces;
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFaceSubscribers.size(); i++ ) {
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        faceEvent.mCookie = (void *) mFaceSubscribers.keyAt(i);
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFaceSubscribers.valueAt(i);
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &faceEvent );
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData.clear();
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame)
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
11395e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    unsigned int mask;
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frame )
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid CameraFrame");
11445e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        return -EINVAL;
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
11475e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    for( mask = 1; mask < CameraFrame::ALL_FRAMES; mask <<= 1){
11485e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      if( mask & frame->mFrameMask ){
11495e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        switch( mask ){
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
11515e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::IMAGE_FRAME:
11525e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
11545e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng            CameraHal::PPM("Shot to Jpeg: ", &mStartCapture);
11555e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng#endif
1156348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mImageSubscribers, CameraFrame::IMAGE_FRAME);
11575e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11585e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11595e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::RAW_FRAME:
11605e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1161348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mRawSubscribers, CameraFrame::RAW_FRAME);
11625e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11635e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11645e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::PREVIEW_FRAME_SYNC:
11655e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1166348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
11675e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11685e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11695e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::SNAPSHOT_FRAME:
11705e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1171348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::SNAPSHOT_FRAME);
11725e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11735e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11745e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::VIDEO_FRAME_SYNC:
11755e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1176348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mVideoSubscribers, CameraFrame::VIDEO_FRAME_SYNC);
11775e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11785e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11795e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        case CameraFrame::FRAME_DATA_SYNC:
11805e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          {
1181348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            ret = __sendFrameToSubscribers(frame, &mFrameDataSubscribers, CameraFrame::FRAME_DATA_SYNC);
11825e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          }
11835e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          break;
11845e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        default:
11855e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", mask);
11865e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
11875e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }//SWITCH
11885e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        frame->mFrameMask &= ~mask;
1189348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1190348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (ret != NO_ERROR) {
1191348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            goto EXIT;
1192348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
11935e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      }//IF
11945e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }//FOR
1195348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1196348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu EXIT:
1197348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    return ret;
1198348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu}
1199348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1200348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luustatus_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
1201348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                                     KeyedVector<int, frame_callback> *subscribers,
1202348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                                     CameraFrame::FrameType frameType)
1203348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu{
1204348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    size_t refCount = 0;
1205348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    status_t ret = NO_ERROR;
1206348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    frame_callback callback = NULL;
1207348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1208348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    frame->mFrameType = frameType;
1209348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12108e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    if ( (frameType == CameraFrame::PREVIEW_FRAME_SYNC) || (frameType == CameraFrame::VIDEO_FRAME_SYNC)){
12118e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        if (mFrameQueue.size() > 0){
12128e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          CameraFrame *lframe = (CameraFrame *)mFrameQueue.valueFor(frame->mBuffer);
12138e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          frame->mYuv[0] = lframe->mYuv[0];
12148e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          frame->mYuv[1] = lframe->mYuv[1];
12158e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        }
12168e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        else{
12178e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          CAMHAL_LOGEA("Empty Frame Queue");
12188e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng          return -EINVAL;
12198e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng        }
12208e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng      }
12218e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng
1222348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    if (NULL != subscribers) {
1223348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        refCount = getFrameRefCount(frame->mBuffer, frameType);
1224348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1225348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (refCount == 0) {
12267b4990d47f1765a2264cdf925730e486791c2d1cTyler Luu            CAMHAL_LOGDA("Invalid ref count of 0");
1227348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            return -EINVAL;
1228348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1229348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1230348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        if (refCount > subscribers->size()) {
1231348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            CAMHAL_LOGEB("Invalid ref count for frame type: 0x%x", frameType);
1232348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            return -EINVAL;
1233348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1234348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1235348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        CAMHAL_LOGVB("Type of Frame: 0x%x address: 0x%x refCount start %d",
1236348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     frame->mFrameType,
1237348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     ( uint32_t ) frame->mBuffer,
1238348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                     refCount);
1239348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1240348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        for ( unsigned int i = 0 ; i < refCount; i++ ) {
1241348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            frame->mCookie = ( void * ) subscribers->keyAt(i);
1242348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            callback = (frame_callback) subscribers->valueAt(i);
1243348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1244348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            if (!callback) {
1245348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                CAMHAL_LOGEB("callback not set for frame type: 0x%x", frameType);
1246348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                return -EINVAL;
1247348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            }
1248348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
1249348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu            callback(frame);
1250348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        }
1251348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    } else {
12527b4990d47f1765a2264cdf925730e486791c2d1cTyler Luu        CAMHAL_LOGEA("Subscribers is null??");
1253348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu        return -EINVAL;
1254348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    }
1255348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12565e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    return ret;
12575e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng}
1258348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
12595e02dd977e79ee977ee063496033bbc363a70780Akwasi Boatengint BaseCameraAdapter::setInitFrameRefCount(void* buf, unsigned int mask)
12605e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng{
12615e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  int ret = NO_ERROR;
12625e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  unsigned int lmask;
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12645e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  LOG_FUNCTION_NAME;
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12665e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  if (buf == NULL)
12675e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    {
12685e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      return -EINVAL;
12695e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12715e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  for( lmask = 1; lmask < CameraFrame::ALL_FRAMES; lmask <<= 1){
12725e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    if( lmask & mask ){
12735e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      switch( lmask ){
1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
12755e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::IMAGE_FRAME:
12765e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
1277524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          setFrameRefCount(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12795e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12805e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::RAW_FRAME:
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
12825e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12845e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12855e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::PREVIEW_FRAME_SYNC:
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
12875e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
12895e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12905e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::SNAPSHOT_FRAME:
12915e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
12925e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::SNAPSHOT_FRAME, mFrameSubscribers.size());
12935e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
12945e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
12955e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::VIDEO_FRAME_SYNC:
12965e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
12975e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
12985e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
12995e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13005e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      case CameraFrame::FRAME_DATA_SYNC:
13015e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        {
13025e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng          setFrameRefCount(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
13035e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        }
13045e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13055e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      default:
13065e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", lmask);
13075e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng        break;
13085e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      }//SWITCH
13095e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng      mask &= ~lmask;
13105e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    }//IF
13115e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  }//FOR
13125e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
13135e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng  return ret;
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint BaseCameraAdapter::getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType)
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int res = -1;
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mCaptureBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewDataBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mVideoBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return res;
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount)
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mCaptureBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewDataBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mVideoBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startVideoCapture()
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mVideoBufferLock);
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //If the capture is already ongoing, return from here.
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mRecording )
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mPreviewBuffersAvailable.size() ; i++ )
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mVideoBuffersAvailable.add(mPreviewBuffersAvailable.keyAt(i), 0);
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = true;
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopVideoCapture()
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mRecording )
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            void *frameBuf = ( void * ) mVideoBuffersAvailable.keyAt(i);
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if( getFrameRefCount(frameBuf,  CameraFrame::VIDEO_FRAME_SYNC) > 0)
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mVideoBuffersAvailable.clear();
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = false;
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------Stub implementation of the interface ------------------------------
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::takePicture()
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopImageCapture()
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startBracketing(int range)
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopBracketing()
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::autoFocus()
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    notifyFocusSubscribers(false);
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::cancelAutoFocus()
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startSmoothZoom(int targetIdx)
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopSmoothZoom()
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startPreview()
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopPreview()
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable)
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType)
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameSize(size_t &width, size_t &height)
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameDataSize(size_t &dataFrameSize, size_t bufferCount)
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startFaceDetection()
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopFaceDetection()
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::setState(CameraCommands operation)
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.lock();
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( mAdapterState )
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case INTIALIZED_STATE:
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW:
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_RESOLUTION_PREVIEW:
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->INTIALIZED_STATE event = 0x%x",
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x%x",
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_PREVIEW_STATE:
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_PREVIEW:
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->PREVIEW_STATE event = 0x%x",
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW_DATA:
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW Invalid Op! event = 0x%x",
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case PREVIEW_STATE:
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_PREVIEW:
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->AF_STATE event = 0x%x",
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->ZOOM_STATE event = 0x%x",
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_CAPTURE_STATE event = 0x%x",
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_CAPTURE_STATE;
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_VIDEO:
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->VIDEO_STATE event = 0x%x",
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
176085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                case CAMERA_CANCEL_AUTOFOCUS:
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = 0x%x",
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0x%x",
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_CAPTURE_STATE:
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_BRACKET_CAPTURE:
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->BRACKETING_STATE event = 0x%x",
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CAPTURE_STATE:
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_IMAGE_CAPTURE:
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_STATE:
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_BRACKET_CAPTURE:
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->PREVIEW_STATE event = 0x%x",
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->CAPTURE_STATE event = 0x%x",
1838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_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 AF_STATE:
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
1858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->AF_ZOOM_STATE event = 0x%x",
1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_STATE Invalid Op! event = 0x%x",
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case ZOOM_STATE:
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18842010763a13490313d773d8bbabec46414649b3abSundar Raman                case CAMERA_CANCEL_AUTOFOCUS:
18852010763a13490313d773d8bbabec46414649b3abSundar Raman                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
18862010763a13490313d773d8bbabec46414649b3abSundar Raman                                 operation);
18872010763a13490313d773d8bbabec46414649b3abSundar Raman                    mNextState = ZOOM_STATE;
18882010763a13490313d773d8bbabec46414649b3abSundar Raman                    break;
18892010763a13490313d773d8bbabec46414649b3abSundar Raman
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->PREVIEW_STATE event = 0x%x",
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->AF_ZOOM_STATE event = 0x%x",
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19023f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_VIDEO:
19033f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->VIDEO_ZOOM_STATE event = 0x%x",
19043f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
19053f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
19063f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
19073f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch ZOOM_STATE Invalid Op! event = 0x%x",
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case VIDEO_STATE:
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_VIDEO:
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->PREVIEW_STATE event = 0x%x",
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19293f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_SMOOTH_ZOOM:
19303f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_ZOOM_STATE event = 0x%x",
19313f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
19323f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
19333f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
19343f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1935ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1936ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_LOADED_CAPTURE_STATE event = 0x%x",
1937ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1938ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_LOADED_CAPTURE_STATE;
1939ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1940ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1941ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1942ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_STATE event = 0x%x",
1943ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1944ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_STATE;
1945ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1946ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_STATE Invalid Op! event = 0x%x",
1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1957ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        case VIDEO_LOADED_CAPTURE_STATE:
1958ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1959ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            switch ( operation )
1960ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                {
1961ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1962ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_START_IMAGE_CAPTURE:
1963ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1964ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1965ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_CAPTURE_STATE;
1966ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1967ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1968ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                default:
1969ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1970ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1971ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    ret = INVALID_OPERATION;
1972ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1973ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1974ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
1975ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1976ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            break;
1977ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1978ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        case VIDEO_CAPTURE_STATE:
1979ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1980ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            switch ( operation )
1981ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                {
1982ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                case CAMERA_STOP_IMAGE_CAPTURE:
1983ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1984ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1985ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mNextState = VIDEO_STATE;
1986ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1987ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1988ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                default:
1989ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1990ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                 operation);
1991ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    ret = INVALID_OPERATION;
1992ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    break;
1993ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1994ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
1995ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1996ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            break;
1997ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
1998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case AF_ZOOM_STATE:
1999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->AF_STATE event = 0x%x",
2005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
2007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
2010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->ZOOM_STATE event = 0x%x",
2011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
2013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_ZOOM_STATE Invalid Op! event = 0x%x",
2017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case VIDEO_ZOOM_STATE:
2026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->VIDEO_STATE event = 0x%x",
2032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
2034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
20353f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
20363f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_STOP_VIDEO:
20373f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->ZOOM_STATE event = 0x%x",
20383f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
20393f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = ZOOM_STATE;
20403f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
2041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_ZOOM_STATE Invalid Op! event = 0x%x",
2044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_ZOOM_STATE:
2053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_ZOOM_STATE->BRACKETING_STATE event = 0x%x",
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_ZOOM_STATE Invalid Op! event = 0x%x",
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
2074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid Adapter state!");
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = INVALID_OPERATION;
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//State transition finished successfully.
2084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Commit the state and unlock the adapter state.
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::commitState()
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAdapterState = mNextState;
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::rollbackState()
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mNextState = mAdapterState;
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// publicly exposed functions to retrieve the adapter states
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are locked
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getState()
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAdapterState;
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getNextState()
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mNextState;
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal protected functions to retrieve the adapter states
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are NOT locked to help
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal functions query state in the middle of state
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// transition
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getState(AdapterState &state)
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mAdapterState;
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getNextState(AdapterState &state)
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mNextState;
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::onOrientationEvent(uint32_t orientation, uint32_t tilt)
2176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------------------------------------------------------------------
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Camera Adapter Class ENDS here-----------------------------*/
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2188