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