CameraHal.cpp revision d2d3968a441810c81cf9f46ff43af29cb6fdfb93
1/*
2 * Copyright (C) Texas Instruments - http://www.ti.com/
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18* @file CameraHal.cpp
19*
20* This file maps the Camera Hardware Interface to V4L2.
21*
22*/
23
24#define LOG_TAG "CameraHAL"
25
26#include "CameraHal.h"
27#include "ANativeWindowDisplayAdapter.h"
28#include "TICameraParameters.h"
29#include "CameraProperties.h"
30#include <cutils/properties.h>
31
32#include <poll.h>
33#include <math.h>
34
35namespace android {
36
37extern "C" CameraAdapter* CameraAdapter_Factory();
38
39/*****************************************************************************/
40
41////Constant definitions and declarations
42////@todo Have a CameraProperties class to store these parameters as constants for every camera
43////       Currently, they are hard-coded
44
45const int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
46const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 2;
47
48const uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 0;
49const uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
50
51/******************************************************************************/
52
53#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
54
55struct timeval CameraHal::mStartPreview;
56struct timeval CameraHal::mStartFocus;
57struct timeval CameraHal::mStartCapture;
58
59#endif
60
61static void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
62    CameraHal *camera = NULL;
63
64    if (cookie) {
65        camera = (CameraHal*) cookie;
66        camera->onOrientationEvent(orientation, tilt);
67    }
68
69}
70/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
71
72/**
73  Callback function to receive orientation events from SensorListener
74 */
75void CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
76    LOG_FUNCTION_NAME;
77
78    if ( NULL != mCameraAdapter ) {
79        mCameraAdapter->onOrientationEvent(orientation, tilt);
80    }
81
82    LOG_FUNCTION_NAME_EXIT;
83}
84
85/**
86   @brief Set the notification and data callbacks
87
88   @param[in] notify_cb Notify callback for notifying the app about events and errors
89   @param[in] data_cb   Buffer callback for sending the preview/raw frames to the app
90   @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
91   @param[in] user  Callback cookie
92   @return none
93
94 */
95void CameraHal::setCallbacks(camera_notify_callback notify_cb,
96                            camera_data_callback data_cb,
97                            camera_data_timestamp_callback data_cb_timestamp,
98                            camera_request_memory get_memory,
99                            void *user)
100{
101    LOG_FUNCTION_NAME;
102
103    if ( NULL != mAppCallbackNotifier.get() )
104    {
105            mAppCallbackNotifier->setCallbacks(this,
106                                                notify_cb,
107                                                data_cb,
108                                                data_cb_timestamp,
109                                                get_memory,
110                                                user);
111    }
112
113    LOG_FUNCTION_NAME_EXIT;
114}
115
116/**
117   @brief Enable a message, or set of messages.
118
119   @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
120   @return none
121
122 */
123void CameraHal::enableMsgType(int32_t msgType)
124{
125    LOG_FUNCTION_NAME;
126
127    if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
128        {
129        msgType &= ~CAMERA_MSG_SHUTTER;
130        }
131
132    {
133    Mutex::Autolock lock(mLock);
134    mMsgEnabled |= msgType;
135    }
136
137    if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
138    {
139        if(mDisplayPaused)
140        {
141            CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
142            msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
143        }else
144        {
145            CAMHAL_LOGDA("Enabling Preview Callback");
146        }
147    }
148    else
149    {
150        CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
151    }
152
153
154    ///Configure app callback notifier with the message callback required
155    mAppCallbackNotifier->enableMsgType (msgType);
156
157    LOG_FUNCTION_NAME_EXIT;
158}
159
160/**
161   @brief Disable a message, or set of messages.
162
163   @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
164   @return none
165
166 */
167void CameraHal::disableMsgType(int32_t msgType)
168{
169    LOG_FUNCTION_NAME;
170
171        {
172        Mutex::Autolock lock(mLock);
173        mMsgEnabled &= ~msgType;
174        }
175
176    if( msgType & CAMERA_MSG_PREVIEW_FRAME)
177        {
178        CAMHAL_LOGDA("Disabling Preview Callback");
179        }
180
181    ///Configure app callback notifier
182    mAppCallbackNotifier->disableMsgType (msgType);
183
184    LOG_FUNCTION_NAME_EXIT;
185}
186
187/**
188   @brief Query whether a message, or a set of messages, is enabled.
189
190   Note that this is operates as an AND, if any of the messages queried are off, this will
191   return false.
192
193   @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
194   @return true If all message types are enabled
195          false If any message type
196
197 */
198int CameraHal::msgTypeEnabled(int32_t msgType)
199{
200    LOG_FUNCTION_NAME;
201    Mutex::Autolock lock(mLock);
202    LOG_FUNCTION_NAME_EXIT;
203    return (mMsgEnabled & msgType);
204}
205
206/**
207   @brief Set the camera parameters.
208
209   @param[in] params Camera parameters to configure the camera
210   @return NO_ERROR
211   @todo Define error codes
212
213 */
214int CameraHal::setParameters(const char* parameters)
215{
216
217   LOG_FUNCTION_NAME;
218
219    CameraParameters params;
220
221    String8 str_params(parameters);
222    params.unflatten(str_params);
223
224    LOG_FUNCTION_NAME_EXIT;
225
226    return setParameters(params);
227}
228
229/**
230   @brief Set the camera parameters.
231
232   @param[in] params Camera parameters to configure the camera
233   @return NO_ERROR
234   @todo Define error codes
235
236 */
237int CameraHal::setParameters(const CameraParameters& params)
238{
239
240   LOG_FUNCTION_NAME;
241
242    int w, h;
243    int w_orig, h_orig;
244    int framerate,minframerate;
245    int maxFPS, minFPS;
246    int error;
247    int base;
248    const char *valstr = NULL;
249    const char *prevFormat;
250    char *af_coord;
251    TIUTILS::Message msg;
252    status_t ret = NO_ERROR;
253    // Needed for KEY_RECORDING_HINT
254    bool restartPreviewRequired = false;
255    bool updateRequired = false;
256    CameraParameters oldParams(mParameters.flatten());
257    bool videoMode = false;
258    char range[MAX_PROP_VALUE_LENGTH];
259
260    {
261        Mutex::Autolock lock(mLock);
262
263        ///Ensure that preview is not enabled when the below parameters are changed.
264        if(!previewEnabled())
265            {
266
267            CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat());
268
269            if ((valstr = params.getPreviewFormat()) != NULL) {
270                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
271                    mParameters.setPreviewFormat(valstr);
272                } else {
273                    CAMHAL_LOGEB("Invalid preview format.Supported: %s",  mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
274                    return -EINVAL;
275                }
276            }
277
278            if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
279                if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) {
280                    CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF));
281                    mParameters.set(TICameraParameters::KEY_VNF, valstr);
282                } else {
283                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
284                    ret = -EINVAL;
285                }
286            }
287
288            if ((valstr = params.get(TICameraParameters::KEY_VSTAB)) != NULL) {
289                if ((params.getInt(TICameraParameters::KEY_VSTAB)==0) || (params.getInt(TICameraParameters::KEY_VSTAB)==1)) {
290                    CAMHAL_LOGDB("VSTAB set %s", params.get(TICameraParameters::KEY_VSTAB));
291                    mParameters.set(TICameraParameters::KEY_VSTAB, valstr);
292                } else {
293                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
294                    ret = -EINVAL;
295                }
296            }
297
298            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL)
299                {
300                CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE));
301                mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
302                }
303
304            if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
305                if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
306                    CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
307                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
308                } else {
309                    CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
310                    ret = -EINVAL;
311                }
312            }
313
314            if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL)
315                {
316                CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW));
317                mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr);
318                }
319
320            if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
321                {
322                CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
323                mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
324                }
325
326            }
327
328        //CTS requirement, we should be able to change the preview resolution
329        //while in paused display state
330        if ( !previewEnabled() || mDisplayPaused )
331            {
332            params.getPreviewSize(&w, &h);
333            if (w == -1 && h == -1) {
334                CAMHAL_LOGEA("Unable to get preview size");
335                return -EINVAL;
336              }
337
338            int oldWidth, oldHeight;
339            mParameters.getPreviewSize(&oldWidth, &oldHeight);
340
341            int orientation =0;
342            if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
343                {
344                CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION));
345                mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
346                orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
347                }
348
349            if(orientation ==90 || orientation ==270)
350           {
351              if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
352               {
353                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
354                return -EINVAL;
355               }
356              else
357              {
358                mParameters.setPreviewSize(w, h);
359               }
360           }
361           else
362           {
363            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
364                {
365                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
366                return -EINVAL;
367                }
368            else
369                {
370                mParameters.setPreviewSize(w, h);
371                }
372           }
373
374            if ( ( oldWidth != w ) || ( oldHeight != h ) )
375                {
376                mDynamicPreviewSwitch = true;
377                }
378
379            CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
380            }
381
382        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
383        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
384        if(valstr != NULL)
385            {
386            if(strcmp(valstr, CameraParameters::TRUE) == 0)
387                {
388                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
389                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
390                restartPreviewRequired = setVideoModeParameters();
391                videoMode = true;
392                }
393            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
394                {
395                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
396                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
397                restartPreviewRequired = resetVideoModeParameters();
398                }
399            else
400                {
401                CAMHAL_LOGEA("Invalid RECORDING_HINT");
402                return -EINVAL;
403                }
404            }
405        else
406            {
407            // This check is required in following case.
408            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
409            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
410            // then Video Mode parameters may remain present in ImageCapture activity as well.
411            CAMHAL_LOGDA("Recording Hint is set to NULL");
412            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
413            restartPreviewRequired = resetVideoModeParameters();
414            }
415
416        ///Below parameters can be changed when the preview is running
417        if ( (valstr = params.getPictureFormat()) != NULL ) {
418            if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
419                mParameters.setPictureFormat(valstr);
420            } else {
421                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
422                ret = -EINVAL;
423            }
424            }
425
426        params.getPictureSize(&w, &h);
427        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
428            mParameters.setPictureSize(w, h);
429        } else {
430            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
431            ret = -EINVAL;
432        }
433
434        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
435
436        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
437            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
438                CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST));
439                mParameters.set(TICameraParameters::KEY_BURST, valstr);
440            } else {
441                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
442                ret = -EINVAL;
443            }
444        }
445
446        framerate = params.getPreviewFrameRate();
447        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
448        CAMHAL_LOGDB("FRAMERATE %d", framerate);
449
450        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
451                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
452        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
453                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
454
455
456        //Perform parameter validation
457        if(!isParameterValid(valstr
458                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
459                        || !isParameterValid(framerate,
460                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
461        {
462            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
463            return -EINVAL;
464        }
465
466        // Variable framerate ranges have higher priority over
467        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
468        // be cleared by the client in order for constant FPS to get
469        // applied.
470        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
471          {
472            // APP wants to set FPS range
473            //Set framerate = MAXFPS
474            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
475            params.getPreviewFpsRange(&minFPS, &maxFPS);
476
477            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
478              {
479                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
480                return -EINVAL;
481              }
482
483            framerate = maxFPS /CameraHal::VFR_SCALE;
484
485          }
486        else
487          {
488              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
489              {
490                selectFPSRange(framerate, &minFPS, &maxFPS);
491              }
492              else
493                {
494                    if (videoMode) {
495                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
496                        CameraParameters temp;
497                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
498                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
499                    }
500                    else {
501                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
502                        CameraParameters temp;
503                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
504                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
505                    }
506
507                    framerate = maxFPS / CameraHal::VFR_SCALE;
508                }
509
510          }
511
512        CAMHAL_LOGDB("FPS Range = %s", valstr);
513        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
514
515        minFPS /= CameraHal::VFR_SCALE;
516        maxFPS /= CameraHal::VFR_SCALE;
517
518        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
519          {
520            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
521            ret = -EINVAL;
522          }
523
524        if ( maxFPS < minFPS )
525          {
526            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
527            ret = -EINVAL;
528          }
529        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
530        mParameters.setPreviewFrameRate(framerate);
531
532        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
533        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
534        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
535
536        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
537            {
538            CAMHAL_LOGDB("GBCE Value = %s", valstr);
539            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
540            }
541
542        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
543            {
544            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
545            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
546            }
547
548        ///Update the current parameter set
549        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
550            {
551            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
552            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
553            }
554
555        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
556            {
557            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
558            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
559            }
560
561        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
562            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
563                CAMHAL_LOGDB("Exposure set = %s", valstr);
564                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
565            } else {
566                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
567                ret = -EINVAL;
568            }
569        }
570
571        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
572           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
573               CAMHAL_LOGDB("White balance set %s", valstr);
574               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
575            } else {
576               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
577               ret = -EINVAL;
578            }
579        }
580
581        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
582            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
583                CAMHAL_LOGDB("Contrast set %s", valstr);
584                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
585            } else {
586                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
587                ret = -EINVAL;
588            }
589        }
590
591        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
592            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
593                CAMHAL_LOGDB("Sharpness set %s", valstr);
594                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
595            } else {
596                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
597                ret = -EINVAL;
598            }
599        }
600
601        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
602            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
603                CAMHAL_LOGDB("Saturation set %s", valstr);
604                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
605             } else {
606                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
607                ret = -EINVAL;
608            }
609        }
610
611        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
612            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
613                CAMHAL_LOGDB("Brightness set %s", valstr);
614                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
615            } else {
616                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
617                ret = -EINVAL;
618            }
619         }
620
621        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
622            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
623                CAMHAL_LOGDB("Antibanding set %s", valstr);
624                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
625             } else {
626                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
627                ret = -EINVAL;
628             }
629         }
630
631        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
632            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
633                CAMHAL_LOGDB("ISO set %s", valstr);
634                mParameters.set(TICameraParameters::KEY_ISO, valstr);
635            } else {
636                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
637                ret = -EINVAL;
638            }
639        }
640
641        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
642            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
643                CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE));
644                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
645             } else {
646                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
647                ret = -EINVAL;
648             }
649        }
650
651        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
652            {
653            CAMHAL_LOGEB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS));
654            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
655            }
656
657        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
658            {
659            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
660            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
661
662            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
663                {
664                mMeasurementEnabled = true;
665                }
666            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
667                {
668                mMeasurementEnabled = false;
669                }
670            else
671                {
672                mMeasurementEnabled = false;
673                }
674
675            }
676
677        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
678            {
679            CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION));
680            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
681            }
682
683        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
684            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
685                CAMHAL_LOGDB("Scene mode set %s", valstr);
686                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
687            } else {
688                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
689                ret = -EINVAL;
690            }
691        }
692
693        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
694            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
695                CAMHAL_LOGDB("Flash mode set %s", valstr);
696                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
697            } else {
698                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
699                ret = -EINVAL;
700            }
701        }
702
703        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
704            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
705                CAMHAL_LOGDB("Effect set %s", valstr);
706                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
707             } else {
708                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
709                ret = -EINVAL;
710             }
711        }
712
713        if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL)
714            && (params.getInt(CameraParameters::KEY_ROTATION) >=0))
715            {
716            CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION));
717            mParameters.set(CameraParameters::KEY_ROTATION, valstr);
718            }
719
720        if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL)
721            && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0))
722            {
723            CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY));
724            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr);
725            }
726
727        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL)
728            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0))
729            {
730            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH));
731            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr);
732            }
733
734        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL)
735            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0))
736            {
737            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT));
738            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr);
739            }
740
741        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL )
742            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0))
743            {
744            CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY));
745            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr);
746            }
747
748        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
749            {
750            CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE));
751            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
752            }else{
753                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
754            }
755
756        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
757            {
758            CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE));
759            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
760            }else{
761                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
762            }
763
764        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
765            {
766            CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE));
767            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
768            }else{
769                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
770            }
771
772        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
773            {
774            CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP));
775            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
776            }else{
777                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
778            }
779
780        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
781            {
782            CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP));
783            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
784            }else{
785                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
786            }
787
788        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
789            {
790            CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD));
791            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
792            }else{
793                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
794            }
795
796        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
797            {
798            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM));
799            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
800            }else{
801                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
802            }
803
804        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
805            {
806            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION));
807            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
808            }else{
809                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
810            }
811
812        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
813            {
814            CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL));
815            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
816            }
817
818        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
819            {
820            CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE));
821            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
822            }
823
824        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
825            {
826            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
827            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
828            }
829        else
830            {
831            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
832            }
833
834        if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) {
835            if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) &&
836                (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) {
837                CAMHAL_LOGDB("Zoom set %s", valstr);
838                doesSetParameterNeedUpdate(valstr,
839                                           mParameters.get(CameraParameters::KEY_ZOOM),
840                                           updateRequired);
841                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
842             } else {
843                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
844                ret = -EINVAL;
845            }
846        }
847
848        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
849          {
850            CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
851            doesSetParameterNeedUpdate(valstr,
852                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
853                                       updateRequired);
854            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
855          }
856
857        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
858          {
859            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
860            doesSetParameterNeedUpdate(valstr,
861                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
862                                       updateRequired);
863            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
864          }
865        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
866            {
867            CAMHAL_LOGEB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS));
868            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
869            }
870
871        CameraParameters adapterParams = mParameters;
872
873        // Only send parameters to adapter if preview is already
874        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
875        // will be called in startPreview()
876        // TODO(XXX): Need to identify other parameters that need update from camera adapter
877        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
878            ret |= mCameraAdapter->setParameters(adapterParams);
879        }
880
881        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
882            {
883            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
884            if ( 0 < posBracketRange )
885                {
886                mBracketRangePositive = posBracketRange;
887                }
888            }
889        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
890
891
892        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
893            {
894            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
895            if ( 0 < negBracketRange )
896                {
897                mBracketRangeNegative = negBracketRange;
898                }
899            }
900        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
901
902        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
903            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
904            {
905            if ( !mBracketingEnabled )
906                {
907                CAMHAL_LOGDA("Enabling bracketing");
908                mBracketingEnabled = true;
909
910                //Wait for AF events to enable bracketing
911                if ( NULL != mCameraAdapter )
912                    {
913                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
914                    }
915                }
916            else
917                {
918                CAMHAL_LOGDA("Bracketing already enabled");
919                }
920            }
921        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
922            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
923            {
924            CAMHAL_LOGDA("Disabling bracketing");
925
926            mBracketingEnabled = false;
927            stopImageBracketing();
928
929            //Remove AF events subscription
930            if ( NULL != mEventProvider )
931                {
932                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
933                delete mEventProvider;
934                mEventProvider = NULL;
935                }
936
937            }
938
939        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
940            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
941            {
942            CAMHAL_LOGDA("Enabling shutter sound");
943
944            mShutterEnabled = true;
945            mMsgEnabled |= CAMERA_MSG_SHUTTER;
946            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
947            }
948        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
949            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
950            {
951            CAMHAL_LOGDA("Disabling shutter sound");
952
953            mShutterEnabled = false;
954            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
955            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
956            }
957
958    }
959
960    //On fail restore old parameters
961    if ( NO_ERROR != ret ) {
962        mParameters.unflatten(oldParams.flatten());
963    }
964
965    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
966    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
967    if(restartPreviewRequired && previewEnabled())
968        {
969        CAMHAL_LOGDA("Restarting Preview as needed by KEY_RECODING_HINT");
970        ret = restartPreview();
971        }
972    if (ret != NO_ERROR)
973        {
974        CAMHAL_LOGEA("Failed to restart Preview");
975        return ret;
976        }
977
978    LOG_FUNCTION_NAME_EXIT;
979
980    return ret;
981}
982
983status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
984                                        unsigned int buffercount, unsigned int &max_queueable)
985{
986    status_t ret = NO_ERROR;
987
988    LOG_FUNCTION_NAME;
989
990    if(mDisplayAdapter.get() == NULL)
991    {
992        // Memory allocation of preview buffers is now placed in gralloc
993        // CameraHal should not allocate preview buffers without DisplayAdapter
994        return NO_MEMORY;
995    }
996
997    if(!mPreviewBufs)
998    {
999        ///@todo Pluralise the name of this method to allocateBuffers
1000        mPreviewLength = 0;
1001        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1002                                                                    previewFormat,
1003                                                                    mPreviewLength,
1004                                                                    buffercount);
1005
1006	if (NULL == mPreviewBufs ) {
1007            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1008            return NO_MEMORY;
1009         }
1010
1011        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1012        if ( NULL == mPreviewOffsets ) {
1013            CAMHAL_LOGEA("Buffer mapping failed");
1014            return BAD_VALUE;
1015         }
1016
1017        mPreviewFd = mDisplayAdapter->getFd();
1018        if ( -1 == mPreviewFd ) {
1019            CAMHAL_LOGEA("Invalid handle");
1020            return BAD_VALUE;
1021          }
1022
1023        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1024
1025        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1026        if (ret != NO_ERROR) {
1027            return ret;
1028         }
1029
1030    }
1031
1032    LOG_FUNCTION_NAME_EXIT;
1033
1034    return ret;
1035
1036}
1037
1038status_t CameraHal::freePreviewBufs()
1039{
1040    status_t ret = NO_ERROR;
1041    LOG_FUNCTION_NAME;
1042
1043    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1044    if(mPreviewBufs)
1045        {
1046        ///@todo Pluralise the name of this method to freeBuffers
1047        ret = mBufProvider->freeBuffer(mPreviewBufs);
1048        mPreviewBufs = NULL;
1049        LOG_FUNCTION_NAME_EXIT;
1050        return ret;
1051        }
1052    LOG_FUNCTION_NAME_EXIT;
1053    return ret;
1054}
1055
1056
1057status_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1058{
1059    status_t ret = NO_ERROR;
1060    int bytes;
1061
1062    LOG_FUNCTION_NAME;
1063
1064    bytes = size;
1065
1066    if ( NO_ERROR == ret )
1067        {
1068        if( NULL != mPreviewDataBufs )
1069            {
1070            ret = freePreviewDataBufs();
1071            }
1072        }
1073
1074    if ( NO_ERROR == ret )
1075        {
1076        bytes = ((bytes+4095)/4096)*4096;
1077        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1078
1079        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1080        if( NULL == mPreviewDataBufs )
1081            {
1082            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1083            ret = -NO_MEMORY;
1084            }
1085        else
1086            {
1087            bytes = size;
1088            }
1089        }
1090
1091    if ( NO_ERROR == ret )
1092        {
1093        mPreviewDataFd = mMemoryManager->getFd();
1094        mPreviewDataLength = bytes;
1095        mPreviewDataOffsets = mMemoryManager->getOffsets();
1096        }
1097    else
1098        {
1099        mPreviewDataFd = -1;
1100        mPreviewDataLength = 0;
1101        mPreviewDataOffsets = NULL;
1102        }
1103
1104    LOG_FUNCTION_NAME;
1105
1106    return ret;
1107}
1108
1109status_t CameraHal::freePreviewDataBufs()
1110{
1111    status_t ret = NO_ERROR;
1112
1113    LOG_FUNCTION_NAME;
1114
1115    if ( NO_ERROR == ret )
1116        {
1117
1118        if( NULL != mPreviewDataBufs )
1119            {
1120
1121            ///@todo Pluralise the name of this method to freeBuffers
1122            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1123            mPreviewDataBufs = NULL;
1124
1125            }
1126        }
1127
1128    LOG_FUNCTION_NAME_EXIT;
1129
1130    return ret;
1131}
1132
1133status_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1134{
1135    status_t ret = NO_ERROR;
1136    int bytes;
1137
1138    LOG_FUNCTION_NAME;
1139
1140    bytes = size;
1141
1142    ///Always allocate the buffers for image capture using MemoryManager
1143    if ( NO_ERROR == ret )
1144        {
1145        if( ( NULL != mImageBufs ) )
1146            {
1147            ret = freeImageBufs();
1148            }
1149        }
1150
1151    if ( NO_ERROR == ret )
1152        {
1153        bytes = ((bytes+4095)/4096)*4096;
1154        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1155
1156        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1157        if( NULL == mImageBufs )
1158            {
1159            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1160            ret = -NO_MEMORY;
1161            }
1162        else
1163            {
1164            bytes = size;
1165            }
1166        }
1167
1168    if ( NO_ERROR == ret )
1169        {
1170        mImageFd = mMemoryManager->getFd();
1171        mImageLength = bytes;
1172        mImageOffsets = mMemoryManager->getOffsets();
1173        }
1174    else
1175        {
1176        mImageFd = -1;
1177        mImageLength = 0;
1178        mImageOffsets = NULL;
1179        }
1180
1181    LOG_FUNCTION_NAME;
1182
1183    return ret;
1184}
1185
1186void endImageCapture( void *userData)
1187{
1188    LOG_FUNCTION_NAME;
1189
1190    if ( NULL != userData )
1191        {
1192        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1193        c->signalEndImageCapture();
1194        }
1195
1196    LOG_FUNCTION_NAME_EXIT;
1197}
1198
1199void releaseImageBuffers(void *userData)
1200{
1201    LOG_FUNCTION_NAME;
1202
1203// Make releaseImageBuffers a no-op for now because it is racing against AppCallbackNotifier
1204// in the home screen use-case. Image capture buffers are anyways reallocated on subsequent
1205// captures and also released as part of final camera hal cleanup
1206#if 0
1207    if ( NULL != userData )
1208        {
1209        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1210        c->freeImageBufs();
1211        }
1212#endif
1213
1214    LOG_FUNCTION_NAME_EXIT;
1215}
1216
1217status_t CameraHal::signalEndImageCapture()
1218{
1219    status_t ret = NO_ERROR;
1220    int w,h;
1221    CameraParameters adapterParams = mParameters;
1222    Mutex::Autolock lock(mLock);
1223
1224    LOG_FUNCTION_NAME;
1225
1226    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
1227
1228    LOG_FUNCTION_NAME_EXIT;
1229
1230    return ret;
1231}
1232
1233status_t CameraHal::freeImageBufs()
1234{
1235    status_t ret = NO_ERROR;
1236
1237    LOG_FUNCTION_NAME;
1238
1239    if ( NO_ERROR == ret )
1240        {
1241
1242        if( NULL != mImageBufs )
1243            {
1244
1245            ///@todo Pluralise the name of this method to freeBuffers
1246            ret = mMemoryManager->freeBuffer(mImageBufs);
1247            mImageBufs = NULL;
1248
1249            }
1250        else
1251            {
1252            ret = -EINVAL;
1253            }
1254
1255        }
1256
1257    LOG_FUNCTION_NAME_EXIT;
1258
1259    return ret;
1260}
1261
1262
1263
1264/**
1265   @brief Start preview mode.
1266
1267   @param none
1268   @return NO_ERROR Camera switched to VF mode
1269   @todo Update function header with the different errors that are possible
1270
1271 */
1272status_t CameraHal::startPreview()
1273{
1274
1275    status_t ret = NO_ERROR;
1276    CameraAdapter::BuffersDescriptor desc;
1277    CameraFrame frame;
1278    const char *valstr = NULL;
1279    unsigned int required_buffer_count;
1280    unsigned int max_queueble_buffers;
1281
1282#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1283
1284        gettimeofday(&mStartPreview, NULL);
1285
1286#endif
1287
1288    LOG_FUNCTION_NAME;
1289
1290    if ( mPreviewEnabled )
1291    {
1292    CAMHAL_LOGDA("Preview already running");
1293
1294    LOG_FUNCTION_NAME_EXIT;
1295
1296    return ALREADY_EXISTS;
1297    }
1298
1299    if ( NULL != mCameraAdapter ) {
1300
1301        ret = mCameraAdapter->setParameters(mParameters);
1302    }
1303
1304    ///If we don't have the preview callback enabled and display adapter,
1305    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL))
1306    {
1307        CAMHAL_LOGEA("Preview not started. Preview in progress flag set");
1308        mPreviewStartInProgress = true;
1309        return NO_ERROR;
1310    }
1311
1312    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1313        {
1314        CAMHAL_LOGDA("Preview is in paused state");
1315
1316        mDisplayPaused = false;
1317        mPreviewEnabled = true;
1318        if ( NO_ERROR == ret )
1319            {
1320            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1321
1322            if ( NO_ERROR != ret )
1323                {
1324                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1325                }
1326            }
1327        //restart preview callbacks
1328        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1329        {
1330            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1331        }
1332        if ( mDynamicPreviewSwitch )
1333            {
1334            forceStopPreview();
1335            mDynamicPreviewSwitch = false;
1336            }
1337        else
1338            {
1339            return ret;
1340            }
1341        }
1342
1343    /// Ensure that buffers for preview are allocated before we start the camera
1344    ///Get the updated size from Camera Adapter, to account for padding etc
1345    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,
1346                                      ( int ) &frame);
1347    if ( NO_ERROR != ret )
1348        {
1349        return ret;
1350        }
1351
1352    ///Update the current preview width and height
1353    mPreviewWidth = frame.mWidth;
1354    mPreviewHeight = frame.mHeight;
1355
1356    //Update the padded width and height - required for VNF and VSTAB
1357    mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
1358    mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1359
1360    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1361
1362    ///Allocate the preview buffers
1363    ret = allocPreviewBufs(frame.mWidth, frame.mHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1364
1365    if ( NO_ERROR != ret )
1366        {
1367        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1368        goto error;
1369        }
1370
1371    if ( mMeasurementEnabled )
1372        {
1373
1374        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1375                                          ( int ) &frame,
1376                                          required_buffer_count);
1377        if ( NO_ERROR != ret )
1378            {
1379            return ret;
1380            }
1381
1382         ///Allocate the preview data buffers
1383        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1384        if ( NO_ERROR != ret ) {
1385            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1386            goto error;
1387           }
1388
1389        if ( NO_ERROR == ret )
1390            {
1391            desc.mBuffers = mPreviewDataBufs;
1392            desc.mOffsets = mPreviewDataOffsets;
1393            desc.mFd = mPreviewDataFd;
1394            desc.mLength = mPreviewDataLength;
1395            desc.mCount = ( size_t ) required_buffer_count;
1396            desc.mMaxQueueable = (size_t) required_buffer_count;
1397
1398            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1399                                        ( int ) &desc);
1400            }
1401
1402        }
1403
1404    ///Pass the buffers to Camera Adapter
1405    desc.mBuffers = mPreviewBufs;
1406    desc.mOffsets = mPreviewOffsets;
1407    desc.mFd = mPreviewFd;
1408    desc.mLength = mPreviewLength;
1409    desc.mCount = ( size_t ) required_buffer_count;
1410    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1411
1412    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
1413                                      ( int ) &desc);
1414
1415    if ( NO_ERROR != ret )
1416        {
1417        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
1418        freePreviewBufs();
1419        return ret;
1420        }
1421
1422    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1423
1424    ///Start the callback notifier
1425    ret = mAppCallbackNotifier->start();
1426
1427    if( ALREADY_EXISTS == ret )
1428        {
1429        //Already running, do nothing
1430        CAMHAL_LOGDA("AppCallbackNotifier already running");
1431        ret = NO_ERROR;
1432        }
1433    else if ( NO_ERROR == ret ) {
1434        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1435        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1436        }
1437    else
1438        {
1439        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1440        goto error;
1441        }
1442
1443    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1444    if(mDisplayAdapter.get() != NULL)
1445        {
1446        CAMHAL_LOGDA("Enabling display");
1447        bool isS3d = false;
1448        DisplayAdapter::S3DParameters s3dParams;
1449        int width, height;
1450        mParameters.getPreviewSize(&width, &height);
1451#if 0 //TODO: s3d is not part of bringup...will reenable
1452        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1453            isS3d = (strcmp(valstr, "true") == 0);
1454        }
1455        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1456            if (strcmp(valstr, "off") == 0)
1457                {
1458                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1459                //TODO: obtain the frame packing configuration from camera or user settings
1460                //once side by side configuration is supported
1461                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1462                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1463                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1464                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1465                }
1466            else
1467                {
1468                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1469                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1470                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1471                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1472                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1473                }
1474        }
1475#endif //if 0
1476
1477#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1478
1479        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1480
1481#else
1482
1483        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1484
1485#endif
1486
1487        if ( ret != NO_ERROR )
1488            {
1489            CAMHAL_LOGEA("Couldn't enable display");
1490            goto error;
1491            }
1492
1493        }
1494
1495    ///Send START_PREVIEW command to adapter
1496    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1497
1498    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1499
1500    if(ret!=NO_ERROR)
1501        {
1502        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1503        goto error;
1504        }
1505    CAMHAL_LOGDA("Started preview");
1506
1507    mPreviewEnabled = true;
1508    mPreviewStartInProgress = false;
1509    return ret;
1510
1511    error:
1512
1513        CAMHAL_LOGEA("Performing cleanup after error");
1514
1515        //Do all the cleanup
1516        freePreviewBufs();
1517        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1518        if(mDisplayAdapter.get() != NULL)
1519            {
1520            mDisplayAdapter->disableDisplay(false);
1521            }
1522        mAppCallbackNotifier->stop();
1523        mPreviewStartInProgress = false;
1524        mPreviewEnabled = false;
1525        LOG_FUNCTION_NAME_EXIT;
1526
1527        return ret;
1528}
1529
1530/**
1531   @brief Sets ANativeWindow object.
1532
1533   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1534   to render buffers to display.
1535
1536   @param[in] window The ANativeWindow object created by Surface flinger
1537   @return NO_ERROR If the ANativeWindow object passes validation criteria
1538   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1539
1540 */
1541status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1542{
1543    status_t ret = NO_ERROR;
1544    CameraAdapter::BuffersDescriptor desc;
1545
1546    LOG_FUNCTION_NAME;
1547    mSetPreviewWindowCalled = true;
1548
1549   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1550    if(!window)
1551    {
1552        if(mDisplayAdapter.get() != NULL)
1553        {
1554            ///NULL window passed, destroy the display adapter if present
1555            CAMHAL_LOGEA("NULL window passed, destroying display adapter");
1556            mDisplayAdapter.clear();
1557            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1558            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1559            mSetPreviewWindowCalled = false;
1560        }
1561        CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow");
1562        return NO_ERROR;
1563    }else if(mDisplayAdapter.get() == NULL)
1564    {
1565        // Need to create the display adapter since it has not been created
1566        // Create display adapter
1567        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1568        ret = NO_ERROR;
1569        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1570        {
1571            if(ret!=NO_ERROR)
1572            {
1573                mDisplayAdapter.clear();
1574                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1575                LOG_FUNCTION_NAME_EXIT;
1576                return ret;
1577            }
1578            else
1579            {
1580                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1581                LOG_FUNCTION_NAME_EXIT;
1582                return NO_MEMORY;
1583            }
1584        }
1585
1586        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1587        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1588        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1589
1590        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1591        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1592        // Set it as the error handler for the DisplayAdapter
1593        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1594
1595        // Update the display adapter with the new window that is passed from CameraService
1596        ret  = mDisplayAdapter->setPreviewWindow(window);
1597        if(ret!=NO_ERROR)
1598            {
1599            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1600            }
1601
1602        if(mPreviewStartInProgress)
1603        {
1604            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1605            // Start the preview since the window is now available
1606            ret = startPreview();
1607        }
1608    }else
1609    {
1610        /* If mDisplayAdpater is already created. No need to do anything.
1611         * We get a surface handle directly now, so we can reconfigure surface
1612         * itself in DisplayAdapter if dimensions have changed
1613         */
1614    }
1615    LOG_FUNCTION_NAME_EXIT;
1616
1617    return ret;
1618
1619}
1620
1621
1622/**
1623   @brief Stop a previously started preview.
1624
1625   @param none
1626   @return none
1627
1628 */
1629void CameraHal::stopPreview()
1630{
1631    LOG_FUNCTION_NAME;
1632
1633    if(!previewEnabled() && !mDisplayPaused)
1634        {
1635        LOG_FUNCTION_NAME_EXIT;
1636        return;
1637        }
1638
1639    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
1640                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
1641    if(mDisplayPaused && !imageCaptureRunning)
1642        {
1643        // Display is paused, which essentially means there is no preview active.
1644        // Note: this is done so that when stopPreview is called by client after
1645        // an image capture, we do not de-initialize the camera adapter and
1646        // restart over again.
1647
1648        // Since we are not calling CameraAdapter->stopPreview, we need to
1649        // explicitly release the 3A locks in this first level stopPreview call
1650        // before returning
1651        if ( NULL != mCameraAdapter ) {
1652            CameraParameters adapterParams = mParameters;
1653
1654            adapterParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, CameraParameters::FALSE);
1655            adapterParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, CameraParameters::FALSE);
1656            mCameraAdapter->setParameters(adapterParams);
1657        }
1658
1659        return;
1660        }
1661
1662    forceStopPreview();
1663
1664    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1665    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1666    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1667    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1668
1669    LOG_FUNCTION_NAME_EXIT;
1670}
1671
1672/**
1673   @brief Returns true if preview is enabled
1674
1675   @param none
1676   @return true If preview is running currently
1677         false If preview has been stopped
1678
1679 */
1680bool CameraHal::previewEnabled()
1681{
1682    LOG_FUNCTION_NAME;
1683
1684    return (mPreviewEnabled || mPreviewStartInProgress);
1685}
1686
1687/**
1688   @brief Start record mode.
1689
1690  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1691  the corresponding frame. Every record frame must be released by calling
1692  releaseRecordingFrame().
1693
1694   @param none
1695   @return NO_ERROR If recording could be started without any issues
1696   @todo Update the header with possible error values in failure scenarios
1697
1698 */
1699status_t CameraHal::startRecording( )
1700{
1701    int w, h;
1702    const char *valstr = NULL;
1703    bool restartPreviewRequired = false;
1704    status_t ret = NO_ERROR;
1705
1706    LOG_FUNCTION_NAME;
1707
1708
1709#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1710
1711            gettimeofday(&mStartPreview, NULL);
1712
1713#endif
1714
1715    if(!previewEnabled())
1716        {
1717        return NO_INIT;
1718        }
1719
1720    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
1721    if ( (valstr == NULL) ||
1722         ( (valstr != NULL) && (strcmp(valstr, CameraParameters::TRUE) != 0) ) )
1723        {
1724        restartPreviewRequired = setVideoModeParameters();
1725
1726        if(restartPreviewRequired)
1727            {
1728            ret = restartPreview();
1729            }
1730        }
1731
1732    if ( NO_ERROR == ret )
1733        {
1734         ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)));
1735        }
1736
1737    if ( NO_ERROR == ret )
1738        {
1739         ret = mAppCallbackNotifier->startRecording();
1740        }
1741
1742    if ( NO_ERROR == ret )
1743        {
1744        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1745         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1746        }
1747
1748    if ( NO_ERROR == ret )
1749        {
1750        mRecordingEnabled = true;
1751        }
1752
1753    LOG_FUNCTION_NAME_EXIT;
1754
1755    return ret;
1756}
1757
1758/**
1759   @brief Set the camera parameters specific to Video Recording.
1760
1761   This function checks for the camera parameters which have to be set for recording.
1762   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1763   This function also enables Video Recording specific functions like VSTAB & VNF.
1764
1765   @param none
1766   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1767   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1768
1769 */
1770bool CameraHal::setVideoModeParameters()
1771{
1772    const char *valstr = NULL;
1773    bool restartPreviewRequired = false;
1774    status_t ret = NO_ERROR;
1775
1776    LOG_FUNCTION_NAME;
1777
1778    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1779    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1780    if ( (valstr == NULL) ||
1781        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1782        {
1783        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1784        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1785        restartPreviewRequired = true;
1786        }
1787
1788    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1789    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1790    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0)
1791        {
1792        // Enable VSTAB, if not enabled already
1793        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1794        if ( (valstr == NULL) ||
1795            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1796            {
1797            CAMHAL_LOGDA("Enable VSTAB");
1798            mParameters.set(TICameraParameters::KEY_VSTAB, "1");
1799            restartPreviewRequired = true;
1800            }
1801
1802        // Enable VNF, if not enabled already
1803        valstr = mParameters.get(TICameraParameters::KEY_VNF);
1804        if ( (valstr == NULL) ||
1805            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1806            {
1807            CAMHAL_LOGDA("Enable VNF");
1808            mParameters.set(TICameraParameters::KEY_VNF, "1");
1809            restartPreviewRequired = true;
1810            }
1811
1812        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1813        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1814        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
1815        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1816        if ((valstr != NULL) && (strcmp(valstr, "1") == 0) && (mPreviewWidth == 1920))
1817            {
1818            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1819            mParameters.set(TICameraParameters::KEY_VNF, "1");
1820            restartPreviewRequired = true;
1821            }
1822        }
1823
1824    LOG_FUNCTION_NAME_EXIT;
1825
1826    return restartPreviewRequired;
1827}
1828
1829/**
1830   @brief Reset the camera parameters specific to Video Recording.
1831
1832   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1833
1834   @param none
1835   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1836
1837 */
1838bool CameraHal::resetVideoModeParameters()
1839{
1840    const char *valstr = NULL;
1841    bool restartPreviewRequired = false;
1842    status_t ret = NO_ERROR;
1843
1844    LOG_FUNCTION_NAME;
1845
1846    // ignore this if we are already recording
1847    if (mRecordingEnabled) {
1848        return false;
1849    }
1850
1851    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1852    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1853    if ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) )
1854        {
1855        CAMHAL_LOGDA("Reset Capture-Mode to default");
1856        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1857        restartPreviewRequired = true;
1858        }
1859
1860    // Enable VSTAB, if not enabled already
1861    valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1862    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1863        {
1864        CAMHAL_LOGDA("Disable VSTAB");
1865        mParameters.set(TICameraParameters::KEY_VSTAB, "0");
1866        restartPreviewRequired = true;
1867        }
1868
1869    // Enable VNF, if not enabled already
1870    valstr = mParameters.get(TICameraParameters::KEY_VNF);
1871    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1872        {
1873        CAMHAL_LOGDA("Disable VNF");
1874        mParameters.set(TICameraParameters::KEY_VNF, "0");
1875        restartPreviewRequired = true;
1876        }
1877
1878    LOG_FUNCTION_NAME_EXIT;
1879
1880    return restartPreviewRequired;
1881}
1882
1883/**
1884   @brief Restart the preview with setParameter.
1885
1886   This function restarts preview, for some VIDEO_MODE parameters to take effect.
1887
1888   @param none
1889   @return NO_ERROR If recording parameters could be set without any issues
1890
1891 */
1892status_t CameraHal::restartPreview()
1893{
1894    const char *valstr = NULL;
1895    char tmpvalstr[30];
1896    status_t ret = NO_ERROR;
1897
1898    LOG_FUNCTION_NAME;
1899
1900    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
1901    tmpvalstr[0] = 0;
1902    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1903    if(valstr != NULL)
1904        {
1905        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
1906            {
1907            return -EINVAL;
1908            }
1909
1910        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
1911        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
1912        }
1913
1914    stopPreview();
1915
1916    {
1917        Mutex::Autolock lock(mLock);
1918        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
1919        mCameraAdapter->setParameters(mParameters);
1920    }
1921
1922    ret = startPreview();
1923
1924    LOG_FUNCTION_NAME_EXIT;
1925
1926    return ret;
1927}
1928
1929/**
1930   @brief Stop a previously started recording.
1931
1932   @param none
1933   @return none
1934
1935 */
1936void CameraHal::stopRecording()
1937{
1938    CameraAdapter::AdapterState currentState;
1939
1940    LOG_FUNCTION_NAME;
1941
1942    Mutex::Autolock lock(mLock);
1943
1944    if (!mRecordingEnabled )
1945        {
1946        return;
1947        }
1948
1949    currentState = mCameraAdapter->getState();
1950    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
1951        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
1952    }
1953
1954    mAppCallbackNotifier->stopRecording();
1955
1956    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
1957
1958    mRecordingEnabled = false;
1959
1960    LOG_FUNCTION_NAME_EXIT;
1961}
1962
1963/**
1964   @brief Returns true if recording is enabled.
1965
1966   @param none
1967   @return true If recording is currently running
1968         false If recording has been stopped
1969
1970 */
1971int CameraHal::recordingEnabled()
1972{
1973    LOG_FUNCTION_NAME;
1974
1975    LOG_FUNCTION_NAME_EXIT;
1976
1977    return mRecordingEnabled;
1978}
1979
1980/**
1981   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
1982
1983   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
1984               previously given by CameraHal
1985   @return none
1986
1987 */
1988void CameraHal::releaseRecordingFrame(const void* mem)
1989{
1990    LOG_FUNCTION_NAME;
1991
1992    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
1993
1994    if ( ( mRecordingEnabled ) && mem != NULL)
1995    {
1996        mAppCallbackNotifier->releaseRecordingFrame(mem);
1997    }
1998
1999    LOG_FUNCTION_NAME_EXIT;
2000
2001    return;
2002}
2003
2004/**
2005   @brief Start auto focus
2006
2007   This call asynchronous.
2008   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2009   focusing is complete. autoFocus() will be called again if another auto focus is
2010   needed.
2011
2012   @param none
2013   @return NO_ERROR
2014   @todo Define the error codes if the focus is not locked
2015
2016 */
2017status_t CameraHal::autoFocus()
2018{
2019    status_t ret = NO_ERROR;
2020
2021#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2022
2023    gettimeofday(&mStartFocus, NULL);
2024
2025#endif
2026
2027
2028    LOG_FUNCTION_NAME;
2029
2030    if ( NULL != mCameraAdapter )
2031        {
2032
2033#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2034
2035    //pass the autoFocus timestamp along with the command to camera adapter
2036    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2037
2038#else
2039
2040    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2041
2042#endif
2043
2044        }
2045    else
2046        {
2047            ret = -1;
2048        }
2049
2050    LOG_FUNCTION_NAME_EXIT;
2051
2052    return ret;
2053}
2054
2055/**
2056   @brief Cancels auto-focus function.
2057
2058   If the auto-focus is still in progress, this function will cancel it.
2059   Whether the auto-focus is in progress or not, this function will return the
2060   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2061
2062
2063   @param none
2064   @return NO_ERROR If the cancel succeeded
2065   @todo Define error codes if cancel didnt succeed
2066
2067 */
2068status_t CameraHal::cancelAutoFocus()
2069{
2070    LOG_FUNCTION_NAME;
2071    if( NULL != mCameraAdapter )
2072    {
2073        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
2074    }
2075    LOG_FUNCTION_NAME_EXIT;
2076    return NO_ERROR;
2077}
2078
2079void CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2080{
2081
2082    LOG_FUNCTION_NAME;
2083
2084    if ( NULL != mEventProvider )
2085        {
2086        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2087        delete mEventProvider;
2088        mEventProvider = NULL;
2089        }
2090
2091    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2092    if ( NULL == mEventProvider )
2093        {
2094        CAMHAL_LOGEA("Error in creating EventProvider");
2095        }
2096    else
2097        {
2098        mEventProvider->enableEventNotification(eventMask);
2099        }
2100
2101    LOG_FUNCTION_NAME_EXIT;
2102}
2103
2104void CameraHal::eventCallbackRelay(CameraHalEvent* event)
2105{
2106    LOG_FUNCTION_NAME;
2107
2108    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2109    appcbn->eventCallback(event );
2110
2111    LOG_FUNCTION_NAME_EXIT;
2112}
2113
2114void CameraHal::eventCallback(CameraHalEvent* event)
2115{
2116    LOG_FUNCTION_NAME;
2117
2118    if ( NULL != event )
2119        {
2120        switch( event->mEventType )
2121            {
2122            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2123            case CameraHalEvent::EVENT_FOCUS_ERROR:
2124                {
2125                if ( mBracketingEnabled )
2126                    {
2127                    startImageBracketing();
2128                    }
2129                break;
2130                }
2131            default:
2132                {
2133                break;
2134                }
2135            };
2136        }
2137
2138    LOG_FUNCTION_NAME_EXIT;
2139}
2140
2141status_t CameraHal::startImageBracketing()
2142{
2143        status_t ret = NO_ERROR;
2144        CameraFrame frame;
2145        CameraAdapter::BuffersDescriptor desc;
2146
2147#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2148
2149        gettimeofday(&mStartCapture, NULL);
2150
2151#endif
2152
2153        LOG_FUNCTION_NAME;
2154
2155        if(!previewEnabled() && !mDisplayPaused)
2156            {
2157            LOG_FUNCTION_NAME_EXIT;
2158            return NO_INIT;
2159            }
2160
2161        if ( !mBracketingEnabled )
2162            {
2163            return ret;
2164            }
2165
2166        if ( NO_ERROR == ret )
2167            {
2168            mBracketingRunning = true;
2169            }
2170
2171        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2172            {
2173            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2174                                              ( int ) &frame,
2175                                              ( mBracketRangeNegative + 1 ));
2176
2177            if ( NO_ERROR != ret )
2178                {
2179                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2180                }
2181            }
2182
2183        if ( NO_ERROR == ret )
2184            {
2185            if ( NULL != mAppCallbackNotifier.get() )
2186                 {
2187                 mAppCallbackNotifier->setBurst(true);
2188                 }
2189            }
2190
2191        if ( NO_ERROR == ret )
2192            {
2193            mParameters.getPictureSize(( int * ) &frame.mWidth,
2194                                       ( int * ) &frame.mHeight);
2195
2196            ret = allocImageBufs(frame.mWidth,
2197                                 frame.mHeight,
2198                                 frame.mLength,
2199                                 mParameters.getPictureFormat(),
2200                                 ( mBracketRangeNegative + 1 ));
2201            if ( NO_ERROR != ret )
2202                {
2203                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2204                }
2205            }
2206
2207        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2208            {
2209
2210            desc.mBuffers = mImageBufs;
2211            desc.mOffsets = mImageOffsets;
2212            desc.mFd = mImageFd;
2213            desc.mLength = mImageLength;
2214            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2215            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2216
2217            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2218                                              ( int ) &desc);
2219
2220            if ( NO_ERROR == ret )
2221                {
2222
2223#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2224
2225                 //pass capture timestamp along with the camera adapter command
2226                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2227
2228#else
2229
2230                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2231
2232#endif
2233
2234                }
2235            }
2236
2237        return ret;
2238}
2239
2240status_t CameraHal::stopImageBracketing()
2241{
2242        status_t ret = NO_ERROR;
2243
2244        LOG_FUNCTION_NAME;
2245
2246        if ( !mBracketingRunning )
2247            {
2248            return ret;
2249            }
2250
2251        if ( NO_ERROR == ret )
2252            {
2253            mBracketingRunning = false;
2254            }
2255
2256        if(!previewEnabled() && !mDisplayPaused)
2257            {
2258            return NO_INIT;
2259            }
2260
2261        if ( NO_ERROR == ret )
2262            {
2263            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2264            }
2265
2266        LOG_FUNCTION_NAME_EXIT;
2267
2268        return ret;
2269}
2270
2271/**
2272   @brief Take a picture.
2273
2274   @param none
2275   @return NO_ERROR If able to switch to image capture
2276   @todo Define error codes if unable to switch to image capture
2277
2278 */
2279status_t CameraHal::takePicture( )
2280{
2281    status_t ret = NO_ERROR;
2282    CameraFrame frame;
2283    CameraAdapter::BuffersDescriptor desc;
2284    int burst;
2285    const char *valstr = NULL;
2286    unsigned int bufferCount = 1;
2287
2288    Mutex::Autolock lock(mLock);
2289
2290#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2291
2292    gettimeofday(&mStartCapture, NULL);
2293
2294#endif
2295
2296    LOG_FUNCTION_NAME;
2297
2298    if(!previewEnabled() && !mDisplayPaused)
2299        {
2300        LOG_FUNCTION_NAME_EXIT;
2301        CAMHAL_LOGEA("Preview not started...");
2302        return NO_INIT;
2303        }
2304
2305    // return error if we are already capturing
2306    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2307          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2308         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2309          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2310        CAMHAL_LOGEA("Already capturing an image...");
2311        return NO_INIT;
2312    }
2313
2314    // we only support video snapshot if we are in video mode (recording hint is set)
2315    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2316    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2317         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2318        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2319        return INVALID_OPERATION;
2320    }
2321
2322    if ( !mBracketingRunning )
2323        {
2324
2325         if ( NO_ERROR == ret )
2326            {
2327            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2328            }
2329
2330         //Allocate all buffers only in burst capture case
2331         if ( burst > 1 )
2332             {
2333             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2334             if ( NULL != mAppCallbackNotifier.get() )
2335                 {
2336                 mAppCallbackNotifier->setBurst(true);
2337                 }
2338             }
2339         else
2340             {
2341             if ( NULL != mAppCallbackNotifier.get() )
2342                 {
2343                 mAppCallbackNotifier->setBurst(false);
2344                 }
2345             }
2346
2347        // pause preview during normal image capture
2348        // do not pause preview if recording (video state)
2349        if (NO_ERROR == ret &&
2350                NULL != mDisplayAdapter.get() &&
2351                burst < 1) {
2352            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2353                mDisplayPaused = true;
2354                mPreviewEnabled = false;
2355                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2356                // since preview is paused we should stop sending preview frames too
2357                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2358                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2359                }
2360            }
2361
2362#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2363            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2364#endif
2365        }
2366
2367        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2368            {
2369            if ( NO_ERROR == ret )
2370                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2371                                                  ( int ) &frame,
2372                                                  bufferCount);
2373
2374            if ( NO_ERROR != ret )
2375                {
2376                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2377                }
2378            }
2379
2380        if ( NO_ERROR == ret )
2381            {
2382            mParameters.getPictureSize(( int * ) &frame.mWidth,
2383                                       ( int * ) &frame.mHeight);
2384
2385            ret = allocImageBufs(frame.mWidth,
2386                                 frame.mHeight,
2387                                 frame.mLength,
2388                                 mParameters.getPictureFormat(),
2389                                 bufferCount);
2390            if ( NO_ERROR != ret )
2391                {
2392                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2393                }
2394            }
2395
2396        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2397            {
2398            desc.mBuffers = mImageBufs;
2399            desc.mOffsets = mImageOffsets;
2400            desc.mFd = mImageFd;
2401            desc.mLength = mImageLength;
2402            desc.mCount = ( size_t ) bufferCount;
2403            desc.mMaxQueueable = ( size_t ) bufferCount;
2404
2405            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2406                                              ( int ) &desc);
2407            }
2408        }
2409    else
2410        {
2411        mBracketingRunning = false;
2412        }
2413
2414    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2415        {
2416
2417#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2418
2419         //pass capture timestamp along with the camera adapter command
2420        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2421
2422#else
2423
2424        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2425
2426#endif
2427
2428        }
2429
2430    return ret;
2431}
2432
2433/**
2434   @brief Cancel a picture that was started with takePicture.
2435
2436   Calling this method when no picture is being taken is a no-op.
2437
2438   @param none
2439   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2440   @todo Define error codes
2441
2442 */
2443status_t CameraHal::cancelPicture( )
2444{
2445    LOG_FUNCTION_NAME;
2446
2447    Mutex::Autolock lock(mLock);
2448
2449    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2450
2451    return NO_ERROR;
2452}
2453
2454/**
2455   @brief Return the camera parameters.
2456
2457   @param none
2458   @return Currently configured camera parameters
2459
2460 */
2461char* CameraHal::getParameters()
2462{
2463    String8 params_str8;
2464    char* params_string;
2465
2466    LOG_FUNCTION_NAME;
2467
2468    if( NULL != mCameraAdapter )
2469    {
2470        mCameraAdapter->getParameters(mParameters);
2471    }
2472
2473
2474    params_str8 = mParameters.flatten();
2475
2476    // camera service frees this string...
2477    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2478    strcpy(params_string, params_str8.string());
2479
2480    LOG_FUNCTION_NAME_EXIT;
2481
2482    ///Return the current set of parameters
2483
2484    return params_string;
2485}
2486
2487void CameraHal::putParameters(char *parms)
2488{
2489    free(parms);
2490}
2491
2492/**
2493   @brief Send command to camera driver.
2494
2495   @param none
2496   @return NO_ERROR If the command succeeds
2497   @todo Define the error codes that this function can return
2498
2499 */
2500status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2501{
2502    status_t ret = NO_ERROR;
2503
2504    LOG_FUNCTION_NAME;
2505
2506
2507    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2508        {
2509        CAMHAL_LOGEA("No CameraAdapter instance");
2510        ret = -EINVAL;
2511        }
2512
2513    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2514        {
2515        CAMHAL_LOGEA("Preview is not running");
2516        ret = -EINVAL;
2517        }
2518
2519    if ( NO_ERROR == ret )
2520        {
2521        switch(cmd)
2522            {
2523            case CAMERA_CMD_START_SMOOTH_ZOOM:
2524
2525                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2526
2527                break;
2528            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2529
2530                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2531
2532            case CAMERA_CMD_START_FACE_DETECTION:
2533
2534                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2535
2536                break;
2537
2538            case CAMERA_CMD_STOP_FACE_DETECTION:
2539
2540                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2541
2542                break;
2543
2544            default:
2545                break;
2546            };
2547        }
2548
2549    LOG_FUNCTION_NAME_EXIT;
2550
2551    return ret;
2552}
2553
2554/**
2555   @brief Release the hardware resources owned by this object.
2556
2557   Note that this is *not* done in the destructor.
2558
2559   @param none
2560   @return none
2561
2562 */
2563void CameraHal::release()
2564{
2565    LOG_FUNCTION_NAME;
2566    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2567    ///just before CameraHal object destruction
2568    deinitialize();
2569    LOG_FUNCTION_NAME_EXIT;
2570}
2571
2572
2573/**
2574   @brief Dump state of the camera hardware
2575
2576   @param[in] fd    File descriptor
2577   @param[in] args  Arguments
2578   @return NO_ERROR Dump succeeded
2579   @todo  Error codes for dump fail
2580
2581 */
2582status_t  CameraHal::dump(int fd) const
2583{
2584    LOG_FUNCTION_NAME;
2585    ///Implement this method when the h/w dump function is supported on Ducati side
2586    return NO_ERROR;
2587}
2588
2589/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2590
2591
2592
2593
2594/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2595
2596/**
2597   @brief Constructor of CameraHal
2598
2599   Member variables are initialized here.  No allocations should be done here as we
2600   don't use c++ exceptions in the code.
2601
2602 */
2603CameraHal::CameraHal(int cameraId)
2604{
2605    LOG_FUNCTION_NAME;
2606
2607    ///Initialize all the member variables to their defaults
2608    mPreviewEnabled = false;
2609    mPreviewBufs = NULL;
2610    mImageBufs = NULL;
2611    mBufProvider = NULL;
2612    mPreviewStartInProgress = false;
2613    mVideoBufs = NULL;
2614    mVideoBufProvider = NULL;
2615    mRecordingEnabled = false;
2616    mDisplayPaused = false;
2617    mSetPreviewWindowCalled = false;
2618    mMsgEnabled = 0;
2619    mAppCallbackNotifier = NULL;
2620    mMemoryManager = NULL;
2621    mCameraAdapter = NULL;
2622    mBracketingEnabled = false;
2623    mBracketingRunning = false;
2624    mEventProvider = NULL;
2625    mBracketRangePositive = 1;
2626    mBracketRangeNegative = 1;
2627    mMaxZoomSupported = 0;
2628    mShutterEnabled = true;
2629    mMeasurementEnabled = false;
2630    mPreviewDataBufs = NULL;
2631    mCameraProperties = NULL;
2632    mCurrentTime = 0;
2633    mFalsePreview = 0;
2634    mImageOffsets = NULL;
2635    mImageLength = 0;
2636    mImageFd = 0;
2637    mVideoOffsets = NULL;
2638    mVideoFd = 0;
2639    mVideoLength = 0;
2640    mPreviewDataOffsets = NULL;
2641    mPreviewDataFd = 0;
2642    mPreviewDataLength = 0;
2643    mPreviewFd = 0;
2644    mPreviewWidth = 0;
2645    mPreviewHeight = 0;
2646    mPreviewLength = 0;
2647    mPreviewOffsets = NULL;
2648    mPreviewRunning = 0;
2649    mPreviewStateOld = 0;
2650    mRecordingEnabled = 0;
2651    mRecordEnabled = 0;
2652    mSensorListener = NULL;
2653    mDynamicPreviewSwitch = false;
2654
2655#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2656
2657    //Initialize the CameraHAL constructor timestamp, which is used in the
2658    // PPM() method as time reference if the user does not supply one.
2659    gettimeofday(&ppm_start, NULL);
2660
2661#endif
2662
2663    mCameraIndex = cameraId;
2664
2665    LOG_FUNCTION_NAME_EXIT;
2666}
2667
2668/**
2669   @brief Destructor of CameraHal
2670
2671   This function simply calls deinitialize() to free up memory allocate during construct
2672   phase
2673 */
2674CameraHal::~CameraHal()
2675{
2676    LOG_FUNCTION_NAME;
2677
2678    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2679    deinitialize();
2680
2681    if ( NULL != mEventProvider )
2682        {
2683        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2684        delete mEventProvider;
2685        mEventProvider = NULL;
2686        }
2687
2688    /// Free the callback notifier
2689    mAppCallbackNotifier.clear();
2690
2691    /// Free the display adapter
2692    mDisplayAdapter.clear();
2693
2694    if ( NULL != mCameraAdapter ) {
2695        int strongCount = mCameraAdapter->getStrongCount();
2696
2697        mCameraAdapter->decStrong(mCameraAdapter);
2698
2699        mCameraAdapter = NULL;
2700    }
2701
2702    freeImageBufs();
2703
2704    /// Free the memory manager
2705    mMemoryManager.clear();
2706
2707    LOG_FUNCTION_NAME_EXIT;
2708}
2709
2710/**
2711   @brief Initialize the Camera HAL
2712
2713   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2714
2715   @param None
2716   @return NO_ERROR - On success
2717         NO_MEMORY - On failure to allocate memory for any of the objects
2718   @remarks Camera Hal internal function
2719
2720 */
2721
2722status_t CameraHal::initialize(CameraProperties::Properties* properties)
2723{
2724    LOG_FUNCTION_NAME;
2725
2726    int sensor_index = 0;
2727
2728    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2729    ///Currently, registering all events as to be coming from CameraAdapter
2730    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2731
2732    // Get my camera properties
2733    mCameraProperties = properties;
2734
2735    if(!mCameraProperties)
2736    {
2737        goto fail_loop;
2738    }
2739
2740    // Dump the properties of this Camera
2741    // will only print if DEBUG macro is defined
2742    mCameraProperties->dump();
2743
2744    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2745        {
2746        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2747        }
2748
2749    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2750
2751    mCameraAdapter = CameraAdapter_Factory();
2752    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties, sensor_index)!=NO_ERROR))
2753        {
2754        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2755        mCameraAdapter = NULL;
2756        goto fail_loop;
2757        }
2758
2759    mCameraAdapter->incStrong(mCameraAdapter);
2760    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2761    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2762
2763    if(!mAppCallbackNotifier.get())
2764        {
2765        /// Create the callback notifier
2766        mAppCallbackNotifier = new AppCallbackNotifier();
2767        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
2768            {
2769            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
2770            goto fail_loop;
2771            }
2772        }
2773
2774    if(!mMemoryManager.get())
2775        {
2776        /// Create Memory Manager
2777        mMemoryManager = new MemoryManager();
2778        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
2779            {
2780            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
2781            goto fail_loop;
2782            }
2783        }
2784
2785    ///Setup the class dependencies...
2786
2787    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
2788    ///CameraAdapter is the one which provides those events
2789    ///Set it as the frame and event providers for AppCallbackNotifier
2790    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
2791    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
2792    ///         for any event
2793    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
2794    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
2795
2796    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
2797    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2798    ///Set it as the error handler for CameraAdapter
2799    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
2800
2801    ///Start the callback notifier
2802    if(mAppCallbackNotifier->start() != NO_ERROR)
2803      {
2804        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
2805        goto fail_loop;
2806      }
2807
2808    CAMHAL_LOGDA("Started AppCallbackNotifier..");
2809    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
2810
2811    ///Initialize default parameters
2812    initDefaultParameters();
2813
2814
2815    if ( setParameters(mParameters) != NO_ERROR )
2816        {
2817        CAMHAL_LOGEA("Failed to set default parameters?!");
2818        }
2819
2820    // register for sensor events
2821    mSensorListener = new SensorListener();
2822    if (mSensorListener.get()) {
2823        if (mSensorListener->initialize() == NO_ERROR) {
2824            mSensorListener->setCallbacks(orientation_cb, this);
2825            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
2826        } else {
2827            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
2828            mSensorListener.clear();
2829            mSensorListener = NULL;
2830        }
2831    }
2832
2833    LOG_FUNCTION_NAME_EXIT;
2834
2835    return NO_ERROR;
2836
2837    fail_loop:
2838
2839        ///Free up the resources because we failed somewhere up
2840        deinitialize();
2841        LOG_FUNCTION_NAME_EXIT;
2842
2843        return NO_MEMORY;
2844
2845}
2846
2847bool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
2848{
2849    bool ret = true;
2850    status_t status = NO_ERROR;
2851    char tmpBuffer[PARAM_BUFFER + 1];
2852    char *pos = NULL;
2853
2854    LOG_FUNCTION_NAME;
2855
2856    if ( NULL == supportedResolutions )
2857        {
2858        CAMHAL_LOGEA("Invalid supported resolutions string");
2859        ret = false;
2860        goto exit;
2861        }
2862
2863    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
2864    if ( 0 > status )
2865        {
2866        CAMHAL_LOGEA("Error encountered while generating validation string");
2867        ret = false;
2868        goto exit;
2869        }
2870
2871    pos = strstr(supportedResolutions, tmpBuffer);
2872    if ( NULL == pos )
2873        {
2874        ret = false;
2875        }
2876    else
2877        {
2878        ret = true;
2879        }
2880
2881exit:
2882
2883    LOG_FUNCTION_NAME_EXIT;
2884
2885    return ret;
2886}
2887
2888bool CameraHal::isParameterValid(const char *param, const char *supportedParams)
2889{
2890    bool ret = true;
2891    char *pos = NULL;
2892
2893    LOG_FUNCTION_NAME;
2894
2895    if ( NULL == supportedParams )
2896        {
2897        CAMHAL_LOGEA("Invalid supported parameters string");
2898        ret = false;
2899        goto exit;
2900        }
2901
2902    if ( NULL == param )
2903        {
2904        CAMHAL_LOGEA("Invalid parameter string");
2905        ret = false;
2906        goto exit;
2907        }
2908
2909    pos = strstr(supportedParams, param);
2910    if ( NULL == pos )
2911        {
2912        ret = false;
2913        }
2914    else
2915        {
2916        ret = true;
2917        }
2918
2919exit:
2920
2921    LOG_FUNCTION_NAME_EXIT;
2922
2923    return ret;
2924}
2925
2926bool CameraHal::isParameterValid(int param, const char *supportedParams)
2927{
2928    bool ret = true;
2929    char *pos = NULL;
2930    status_t status;
2931    char tmpBuffer[PARAM_BUFFER + 1];
2932
2933    LOG_FUNCTION_NAME;
2934
2935    if ( NULL == supportedParams )
2936        {
2937        CAMHAL_LOGEA("Invalid supported parameters string");
2938        ret = false;
2939        goto exit;
2940        }
2941
2942    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
2943    if ( 0 > status )
2944        {
2945        CAMHAL_LOGEA("Error encountered while generating validation string");
2946        ret = false;
2947        goto exit;
2948        }
2949
2950    pos = strstr(supportedParams, tmpBuffer);
2951    if ( NULL == pos )
2952        {
2953        ret = false;
2954        }
2955    else
2956        {
2957        ret = true;
2958        }
2959
2960exit:
2961
2962    LOG_FUNCTION_NAME_EXIT;
2963
2964    return ret;
2965}
2966
2967status_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
2968    if (!new_param || !old_param) {
2969        return -EINVAL;
2970    }
2971
2972    // if params mismatch we should update parameters for camera adapter
2973    if ((strcmp(new_param, old_param) != 0)) {
2974       update = true;
2975    }
2976
2977   return NO_ERROR;
2978}
2979
2980status_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
2981{
2982    status_t ret = NO_ERROR;
2983    char *ctx, *pWidth, *pHeight;
2984    const char *sep = "x";
2985    char *tmp = NULL;
2986
2987    LOG_FUNCTION_NAME;
2988
2989    if ( NULL == resStr )
2990        {
2991        return -EINVAL;
2992        }
2993
2994    //This fixes "Invalid input resolution"
2995    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
2996    if ( NULL!=resStr_copy ) {
2997    if ( NO_ERROR == ret )
2998        {
2999        strcpy(resStr_copy, resStr);
3000        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3001
3002        if ( NULL != pWidth )
3003            {
3004            width = atoi(pWidth);
3005            }
3006        else
3007            {
3008            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3009            ret = -EINVAL;
3010            }
3011        }
3012
3013    if ( NO_ERROR == ret )
3014        {
3015        pHeight = strtok_r(NULL, sep, &ctx);
3016
3017        if ( NULL != pHeight )
3018            {
3019            height = atoi(pHeight);
3020            }
3021        else
3022            {
3023            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3024            ret = -EINVAL;
3025            }
3026        }
3027
3028        free(resStr_copy);
3029        resStr_copy = NULL;
3030     }
3031    LOG_FUNCTION_NAME_EXIT;
3032
3033    return ret;
3034}
3035
3036void CameraHal::insertSupportedParams()
3037{
3038    char tmpBuffer[PARAM_BUFFER + 1];
3039
3040    LOG_FUNCTION_NAME;
3041
3042    CameraParameters &p = mParameters;
3043
3044    ///Set the name of the camera
3045    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3046
3047    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3048
3049    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3050    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3051    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3052    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3053    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3054    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3055    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3056    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3057    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3058    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3059    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3060    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3061    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3062    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3063    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3064    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3065    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3066    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3067    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3068    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3069    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3070    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3071    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3072    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3073    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3074    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3075    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3076    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3077    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3078    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3079    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3080    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3081    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3082    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
3083    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3084
3085    LOG_FUNCTION_NAME_EXIT;
3086
3087}
3088
3089void CameraHal::initDefaultParameters()
3090{
3091    //Purpose of this function is to initialize the default current and supported parameters for the currently
3092    //selected camera.
3093
3094    CameraParameters &p = mParameters;
3095    int currentRevision, adapterRevision;
3096    status_t ret = NO_ERROR;
3097    int width, height;
3098
3099    LOG_FUNCTION_NAME;
3100
3101    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3102
3103    if ( NO_ERROR == ret )
3104        {
3105        p.setPreviewSize(width, height);
3106        }
3107    else
3108        {
3109        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3110        }
3111
3112    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3113
3114    if ( NO_ERROR == ret )
3115        {
3116        p.setPictureSize(width, height);
3117        }
3118    else
3119        {
3120        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3121        }
3122
3123    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3124
3125    if ( NO_ERROR == ret )
3126        {
3127        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3128        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3129        }
3130    else
3131        {
3132        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3133        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3134        }
3135
3136    insertSupportedParams();
3137
3138    //Insert default values
3139    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3140    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3141    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3142    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3143    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3144    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3145    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3146    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3147    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3148    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3149    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3150    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3151    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3152    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3153    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3154    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3155    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3156    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3157    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3158    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3159    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3160    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3161    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3162    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3163    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3164    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3165    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3166    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3167    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3168    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3169    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3170    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3171    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3172    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3173    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3174    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3175    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3176    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3177
3178    // Only one area a.k.a Touch AF for now.
3179    // TODO: Add support for multiple focus areas.
3180    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3181    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3182    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3183    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3184
3185    LOG_FUNCTION_NAME_EXIT;
3186}
3187
3188/**
3189   @brief Stop a previously started preview.
3190   @param none
3191   @return none
3192
3193 */
3194void CameraHal::forceStopPreview()
3195{
3196    LOG_FUNCTION_NAME;
3197
3198    // stop bracketing if it is running
3199    stopImageBracketing();
3200
3201    if(mDisplayAdapter.get() != NULL) {
3202        ///Stop the buffer display first
3203        mDisplayAdapter->disableDisplay();
3204    }
3205
3206    if(mAppCallbackNotifier.get() != NULL) {
3207        //Stop the callback sending
3208        mAppCallbackNotifier->stop();
3209        mAppCallbackNotifier->flushAndReturnFrames();
3210        mAppCallbackNotifier->stopPreviewCallbacks();
3211    }
3212
3213    if ( NULL != mCameraAdapter ) {
3214        CameraAdapter::AdapterState currentState;
3215        CameraAdapter::AdapterState nextState;
3216
3217        currentState = mCameraAdapter->getState();
3218        nextState = mCameraAdapter->getNextState();
3219
3220        // since prerequisite for capturing is for camera system
3221        // to be previewing...cancel all captures before stopping
3222        // preview
3223        if ( (currentState == CameraAdapter::CAPTURE_STATE) &&
3224             (nextState != CameraAdapter::PREVIEW_STATE)) {
3225            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
3226        }
3227
3228        // only need to send these control commands to state machine if we are
3229        // passed the LOADED_PREVIEW_STATE
3230        if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) {
3231           // according to javadoc...FD should be stopped in stopPreview
3232           // and application needs to call startFaceDection again
3233           // to restart FD
3234           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3235
3236           cancelAutoFocus();
3237        }
3238
3239        // only need to send these control commands to state machine if we are
3240        // passed the INITIALIZED_STATE
3241        if (currentState > CameraAdapter::INTIALIZED_STATE) {
3242           //Stop the source of frames
3243           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
3244        }
3245    }
3246
3247    freePreviewBufs();
3248    freePreviewDataBufs();
3249
3250    mPreviewEnabled = false;
3251    mDisplayPaused = false;
3252    mPreviewStartInProgress = false;
3253
3254    LOG_FUNCTION_NAME_EXIT;
3255}
3256
3257/**
3258   @brief Deallocates memory for all the resources held by Camera HAL.
3259
3260   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3261   and Memory Manager
3262
3263   @param none
3264   @return none
3265
3266 */
3267void CameraHal::deinitialize()
3268{
3269    LOG_FUNCTION_NAME;
3270
3271    if ( mPreviewEnabled || mDisplayPaused ) {
3272        forceStopPreview();
3273    }
3274
3275    mSetPreviewWindowCalled = false;
3276
3277    if (mSensorListener.get()) {
3278        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3279        mSensorListener.clear();
3280        mSensorListener = NULL;
3281    }
3282
3283    LOG_FUNCTION_NAME_EXIT;
3284
3285}
3286
3287status_t CameraHal::storeMetaDataInBuffers(bool enable)
3288{
3289    LOG_FUNCTION_NAME;
3290
3291    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3292
3293    LOG_FUNCTION_NAME_EXIT;
3294}
3295
3296void CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3297{
3298  char * ptr;
3299  char supported[MAX_PROP_VALUE_LENGTH];
3300  int fpsrangeArray[2];
3301  int i = 0;
3302
3303  LOG_FUNCTION_NAME;
3304  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3305  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3306
3307  ptr = strtok (supported," (,)");
3308
3309  while (ptr != NULL)
3310    {
3311      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3312      if (i == 1)
3313        {
3314          if (framerate == fpsrangeArray[i])
3315            {
3316              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3317              *min_fps = fpsrangeArray[0];
3318              *max_fps = fpsrangeArray[1];
3319              break;
3320            }
3321        }
3322      ptr = strtok (NULL, " (,)");
3323      i++;
3324      i%=2;
3325    }
3326
3327  LOG_FUNCTION_NAME_EXIT;
3328
3329}
3330
3331};
3332
3333
3334