BaseCameraAdapter.cpp revision 3f7a29d44c52729f037056a634423fda6db834e3
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
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frameType)
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t res = NO_ERROR;
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t subscriberCount = 0;
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int refCount = -1;
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mReturnFrameLock);
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frameBuf )
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid frameBuf");
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res)
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        refCount = getFrameRefCount(frameBuf,  frameType);
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 < refCount )
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refCount--;
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFrameRefCount(frameBuf, frameType, refCount);
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ( mRecording ) && (  CameraFrame::VIDEO_FRAME_SYNC == frameType ) )
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else if ( ( mRecording ) && (  CameraFrame::PREVIEW_FRAME_SYNC == frameType ) )
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return;
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == res )
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //check if someone is holding this buffer
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == refCount )
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            res = fillThisBuffer(frameBuf, frameType);
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3)
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct timeval *refTimestamp;
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BuffersDescriptor *desc = NULL;
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame *frame = NULL;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( operation ) {
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW:
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for preview");
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid preview buffers!");
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -EINVAL;
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = setState(operation);
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    Mutex::Autolock lock(mPreviewBufferLock);
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffers = (int *) desc->mBuffers;
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersLength = desc->mLength;
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mPreviewBuffersAvailable.clear();
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 0);
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // initial ref count for undeqeueued buffers is 1 since buffer provider
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    // is still holding on to it
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 1);
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_PREVIEW,
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mBuffers,
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mCount,
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mLength,
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                     desc->mMaxQueueable);
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( ret == NO_ERROR )
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = commitState();
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret |= rollbackState();
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA:
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDA("Use buffers for preview data");
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    desc = ( BuffersDescriptor * ) value1;
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL == desc )
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        CAMHAL_LOGEA("Invalid preview data 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(mPreviewDataBufferLock);
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffers = (int *) desc->mBuffers;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersLength = desc->mLength;
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mPreviewDataBuffersAvailable.clear();
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            {
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            mPreviewDataBuffersAvailable.add(mPreviewDataBuffers[i], true);
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                            mPreviewDataBuffersAvailable.add(mPreviewBuffers[i], 1);
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            }
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NULL != desc )
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = useBuffers(CameraAdapter::CAMERA_MEASUREMENT,
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_IMAGE_CAPTURE:
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Use buffers for image capture");
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                desc = ( BuffersDescriptor * ) value1;
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL == desc )
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEA("Invalid capture 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(mCaptureBufferLock);
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffers = (int *) desc->mBuffers;
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersLength = desc->mLength;
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mCaptureBuffersAvailable.clear();
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        mCaptureBuffersAvailable.add(mCaptureBuffers[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                        mCaptureBuffersAvailable.add(mPreviewBuffers[i], 1);
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NULL != desc )
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = useBuffers(CameraAdapter::CAMERA_IMAGE_CAPTURE,
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_START_SMOOTH_ZOOM:
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startSmoothZoom(value1);
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM:
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopSmoothZoom();
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_PREVIEW:
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDA("Start Preview");
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startPreview();
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_PREVIEW:
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop Preview");
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopPreview();
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_VIDEO:
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Start video recording");
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startVideoCapture();
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_VIDEO:
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Stop video recording");
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopVideoCapture();
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS:
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = flushBuffers();
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_IMAGE_CAPTURE:
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = takePicture();
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE:
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopImageCapture();
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_START_BRACKET_CAPTURE:
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value2;
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = startBracketing(value1);
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE:
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = stopBracketing();
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_PERFORM_AUTOFOCUS:
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            refTimestamp = ( struct timeval * ) value1;
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != refTimestamp )
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                memcpy( &mStartFocus, refTimestamp, sizeof( struct timeval ));
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = autoFocus();
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_CANCEL_AUTOFOCUS:
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = setState(operation);
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = cancelAutoFocus();
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( ret == NO_ERROR )
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = commitState();
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret |= rollbackState();
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW:
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameSize(frame->mWidth, frame->mHeight);
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getPictureBufferSize(frame->mLength, value2);
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = setState(operation);
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 frame = ( CameraFrame * ) value1;
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 if ( NULL != frame )
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = getFrameDataSize(frame->mLength, value2);
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 else
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     {
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     ret = -EINVAL;
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     }
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( ret == NO_ERROR )
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret = commitState();
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             else
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 ret |= rollbackState();
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_START_FD:
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = startFaceDetection();
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         case CameraAdapter::CAMERA_STOP_FD:
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             ret = stopFaceDetection();
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             break;
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Command 0x%x unsupported!", operation);
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyFocusSubscribers(bool status)
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent focusEvent;
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFocusSubscribers.size() == 0 ) {
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No Focus Subscribers!");
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     //dump the AF latency
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     CameraHal::PPM("Focus finished in: ", &mStartFocus);
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData = new CameraHalEvent::CameraHalEventData();
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == focusEvent.mEventData.get() ) {
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED;
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData->focusEvent.focusLocked = status;
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData->focusEvent.focusError = !status;
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ )
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusEvent.mCookie = (void *) mFocusSubscribers.keyAt(i);
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFocusSubscribers.valueAt(i);
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &focusEvent );
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focusEvent.mEventData.clear();
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyShutterSubscribers()
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent shutterEvent;
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mShutterSubscribers.size() == 0 )
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No shutter Subscribers!");
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData = new CameraHalEvent::CameraHalEventData();
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == shutterEvent.mEventData.get() ) {
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventType = CameraHalEvent::EVENT_SHUTTER;
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData->shutterEvent.shutterClosed = true;
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mShutterSubscribers.size() ; i++ ) {
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i);
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = ( event_callback ) mShutterSubscribers.valueAt(i);
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Sending shutter callback");
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &shutterEvent );
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    shutterEvent.mEventData.clear();
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyZoomSubscribers(int zoomIdx, bool targetReached)
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent zoomEvent;
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mZoomSubscribers.size() == 0 ) {
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No zoom Subscribers!");
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == zoomEvent.mEventData.get() ) {
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventType = CameraHalEvent::EVENT_ZOOM_INDEX_REACHED;
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.currentZoomIndex = zoomIdx;
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData->zoomEvent.targetZoomIndexReached = targetReached;
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mZoomSubscribers.size(); i++ ) {
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomEvent.mCookie = (void *) mZoomSubscribers.keyAt(i);
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mZoomSubscribers.valueAt(i);
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &zoomEvent );
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomEvent.mEventData.clear();
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::notifyFaceSubscribers(sp<CameraFDResult> &faces)
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    event_callback eventCb;
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHalEvent faceEvent;
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mFaceSubscribers.size() == 0 ) {
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("No face detection subscribers!");
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == faceEvent.mEventData.get() ) {
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventType = CameraHalEvent::EVENT_FACE;
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData->faceEvent = faces;
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for (unsigned int i = 0 ; i < mFaceSubscribers.size(); i++ ) {
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        faceEvent.mCookie = (void *) mFaceSubscribers.keyAt(i);
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb = (event_callback) mFaceSubscribers.valueAt(i);
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eventCb ( &faceEvent );
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    faceEvent.mEventData.clear();
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame)
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    frame_callback callback;
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t i = 0;
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> *subscribers = NULL;
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t refCount = 0;
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == frame )
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid CameraFrame");
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(frame->mFrameType)
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::IMAGE_FRAME:
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CameraHal::PPM("Shot to Jpeg: ", &mStartCapture);
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    subscribers = &mImageSubscribers;
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::RAW_FRAME:
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    subscribers = &mRawSubscribers;
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::VIDEO_FRAME_SYNC:
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    subscribers = &mVideoSubscribers;
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::FRAME_DATA_SYNC:
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    subscribers = &mFrameDataSubscribers;
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::PREVIEW_FRAME_SYNC:
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CameraFrame::SNAPSHOT_FRAME:
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    subscribers = &mFrameSubscribers;
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = -EINVAL;
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) &&
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ( NULL != subscribers ) )
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mSubscriberLock);
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        refCount = subscribers->size();
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGVB("Type of Frame: 0x%x address: 0x%x refCount start %d",
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    frame->mFrameType,
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    ( uint32_t ) frame->mBuffer,
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    refCount);
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        setFrameRefCount(frame->mBuffer,
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         (  CameraFrame::FrameType ) frame->mFrameType,
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         refCount);
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( i = 0 ; i < subscribers->size(); i++ )
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            frame->mCookie = ( void * ) subscribers->keyAt(i);
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            callback = (frame_callback) subscribers->valueAt(i);
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            callback(frame);
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 == i )
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //No subscribers for this frame
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint BaseCameraAdapter::getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType)
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int res = -1;
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mCaptureBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mPreviewDataBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                res = mVideoBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return res;
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount)
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( frameType )
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::IMAGE_FRAME:
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::RAW_FRAME:
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mCaptureBufferLock);
1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mCaptureBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::PREVIEW_FRAME_SYNC:
1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::SNAPSHOT_FRAME:
1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewBufferLock);
1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::FRAME_DATA_SYNC:
1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mPreviewDataBufferLock);
1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mPreviewDataBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CameraFrame::VIDEO_FRAME_SYNC:
1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                Mutex::Autolock lock(mVideoBufferLock);
1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mVideoBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        };
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startVideoCapture()
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mVideoBufferLock);
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //If the capture is already ongoing, return from here.
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mRecording )
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mPreviewBuffersAvailable.size() ; i++ )
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mVideoBuffersAvailable.add(mPreviewBuffersAvailable.keyAt(i), 0);
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = true;
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopVideoCapture()
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mRecording )
1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_INIT;
1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            void *frameBuf = ( void * ) mVideoBuffersAvailable.keyAt(i);
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if( getFrameRefCount(frameBuf,  CameraFrame::VIDEO_FRAME_SYNC) > 0)
1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mVideoBuffersAvailable.clear();
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecording = false;
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------Stub implementation of the interface ------------------------------
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::takePicture()
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopImageCapture()
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startBracketing(int range)
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopBracketing()
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::autoFocus()
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    notifyFocusSubscribers(false);
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::cancelAutoFocus()
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startSmoothZoom(int targetIdx)
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopSmoothZoom()
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startPreview()
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopPreview()
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable)
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType)
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameSize(size_t &width, size_t &height)
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getFrameDataSize(size_t &dataFrameSize, size_t bufferCount)
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::startFaceDetection()
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::stopFaceDetection()
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::setState(CameraCommands operation)
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.lock();
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch ( mAdapterState )
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case INTIALIZED_STATE:
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW:
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_RESOLUTION_PREVIEW:
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->INTIALIZED_STATE event = 0x%x",
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x%x",
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_PREVIEW_STATE:
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_PREVIEW:
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->PREVIEW_STATE event = 0x%x",
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //These events don't change the current state
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_PREVIEW_DATA:
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_PREVIEW_STATE;
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW Invalid Op! event = 0x%x",
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case PREVIEW_STATE:
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_PREVIEW:
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = INTIALIZED_STATE;
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->AF_STATE event = 0x%x",
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->ZOOM_STATE event = 0x%x",
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_CAPTURE_STATE event = 0x%x",
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = LOADED_CAPTURE_STATE;
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_VIDEO:
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->VIDEO_STATE event = 0x%x",
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = 0x%x",
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0x%x",
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case LOADED_CAPTURE_STATE:
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_BRACKET_CAPTURE:
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->BRACKETING_STATE event = 0x%x",
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case CAPTURE_STATE:
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_IMAGE_CAPTURE:
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_STATE:
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_BRACKET_CAPTURE:
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->PREVIEW_STATE event = 0x%x",
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_IMAGE_CAPTURE:
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->CAPTURE_STATE event = 0x%x",
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = CAPTURE_STATE;
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_STATE Invalid Op! event = 0x%x",
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case AF_STATE:
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_START_SMOOTH_ZOOM:
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_STATE->AF_ZOOM_STATE event = 0x%x",
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_STATE Invalid Op! event = 0x%x",
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case ZOOM_STATE:
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->PREVIEW_STATE event = 0x%x",
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_PERFORM_AUTOFOCUS:
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->AF_ZOOM_STATE event = 0x%x",
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_ZOOM_STATE;
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17553f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_VIDEO:
17563f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->VIDEO_ZOOM_STATE event = 0x%x",
17573f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
17583f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
17593f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
17603f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch ZOOM_STATE Invalid Op! event = 0x%x",
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case VIDEO_STATE:
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_VIDEO:
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->PREVIEW_STATE event = 0x%x",
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = PREVIEW_STATE;
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17823f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_START_SMOOTH_ZOOM:
17833f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_ZOOM_STATE event = 0x%x",
17843f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
17853f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = VIDEO_ZOOM_STATE;
17863f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
17873f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_STATE Invalid Op! event = 0x%x",
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case AF_ZOOM_STATE:
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->AF_STATE event = 0x%x",
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = AF_STATE;
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_CANCEL_AUTOFOCUS:
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->ZOOM_STATE event = 0x%x",
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = ZOOM_STATE;
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch AF_ZOOM_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 VIDEO_ZOOM_STATE:
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->VIDEO_STATE event = 0x%x",
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = VIDEO_STATE;
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
18353f7a29d44c52729f037056a634423fda6db834e3Tyler Luu
18363f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                case CAMERA_STOP_VIDEO:
18373f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->ZOOM_STATE event = 0x%x",
18383f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                                 operation);
18393f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    mNextState = ZOOM_STATE;
18403f7a29d44c52729f037056a634423fda6db834e3Tyler Luu                    break;
1841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch VIDEO_ZOOM_STATE Invalid Op! event = 0x%x",
1844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case BRACKETING_ZOOM_STATE:
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch ( operation )
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                case CAMERA_STOP_SMOOTH_ZOOM:
1858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGDB("Adapter state switch BRACKETING_ZOOM_STATE->BRACKETING_STATE event = 0x%x",
1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    mNextState = BRACKETING_STATE;
1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                default:
1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    CAMHAL_LOGEB("Adapter state switch BRACKETING_ZOOM_STATE Invalid Op! event = 0x%x",
1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 operation);
1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret = INVALID_OPERATION;
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid Adapter state!");
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = INVALID_OPERATION;
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//State transition finished successfully.
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Commit the state and unlock the adapter state.
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::commitState()
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAdapterState = mNextState;
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::rollbackState()
1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mNextState = mAdapterState;
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mLock.unlock();
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// publicly exposed functions to retrieve the adapter states
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are locked
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getState()
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAdapterState;
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraAdapter::AdapterState BaseCameraAdapter::getNextState()
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mNextState;
1942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// getNextState() and getState()
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal protected functions to retrieve the adapter states
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// please notice that these functions are NOT locked to help
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// internal functions query state in the middle of state
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// transition
1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getState(AdapterState &state)
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mAdapterState;
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t BaseCameraAdapter::getNextState(AdapterState &state)
1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    state = mNextState;
1969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid BaseCameraAdapter::onOrientationEvent(uint32_t orientation, uint32_t tilt)
1976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//-----------------------------------------------------------------------------
1981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------Camera Adapter Class ENDS here-----------------------------*/
1987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1988