CameraHal.cpp revision 3dcde7b7332edf04cd597b01d69950544dcd6589
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    if ( NULL != mAppCallbackNotifier.get() ) {
1012        mAppCallbackNotifier->setParameters(mParameters);
1013    }
1014
1015    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
1016    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
1017    if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
1018        CAMHAL_LOGDA("Restarting Preview");
1019        ret = restartPreview();
1020    } else if (restartPreviewRequired && !previewEnabled() &&
1021                mDisplayPaused && !mRecordingEnabled) {
1022        CAMHAL_LOGDA("Stopping Preview");
1023        forceStopPreview();
1024    }
1025
1026    if (ret != NO_ERROR)
1027        {
1028        CAMHAL_LOGEA("Failed to restart Preview");
1029        return ret;
1030        }
1031
1032    LOG_FUNCTION_NAME_EXIT;
1033
1034    return ret;
1035}
1036
1037status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1038                                        unsigned int buffercount, unsigned int &max_queueable)
1039{
1040    status_t ret = NO_ERROR;
1041
1042    LOG_FUNCTION_NAME;
1043
1044    if(mDisplayAdapter.get() == NULL)
1045    {
1046        // Memory allocation of preview buffers is now placed in gralloc
1047        // CameraHal should not allocate preview buffers without DisplayAdapter
1048        return NO_MEMORY;
1049    }
1050
1051    if(!mPreviewBufs)
1052    {
1053        ///@todo Pluralise the name of this method to allocateBuffers
1054        mPreviewLength = 0;
1055        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1056                                                                    previewFormat,
1057                                                                    mPreviewLength,
1058                                                                    buffercount);
1059
1060	if (NULL == mPreviewBufs ) {
1061            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1062            return NO_MEMORY;
1063         }
1064
1065        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1066        if ( NULL == mPreviewOffsets ) {
1067            CAMHAL_LOGEA("Buffer mapping failed");
1068            return BAD_VALUE;
1069         }
1070
1071        mPreviewFd = mDisplayAdapter->getFd();
1072        if ( -1 == mPreviewFd ) {
1073            CAMHAL_LOGEA("Invalid handle");
1074            return BAD_VALUE;
1075          }
1076
1077        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1078
1079        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1080        if (ret != NO_ERROR) {
1081            return ret;
1082         }
1083
1084    }
1085
1086    LOG_FUNCTION_NAME_EXIT;
1087
1088    return ret;
1089
1090}
1091
1092status_t CameraHal::freePreviewBufs()
1093{
1094    status_t ret = NO_ERROR;
1095    LOG_FUNCTION_NAME;
1096
1097    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1098    if(mPreviewBufs)
1099        {
1100        ///@todo Pluralise the name of this method to freeBuffers
1101        ret = mBufProvider->freeBuffer(mPreviewBufs);
1102        mPreviewBufs = NULL;
1103        LOG_FUNCTION_NAME_EXIT;
1104        return ret;
1105        }
1106    LOG_FUNCTION_NAME_EXIT;
1107    return ret;
1108}
1109
1110
1111status_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1112{
1113    status_t ret = NO_ERROR;
1114    int bytes;
1115
1116    LOG_FUNCTION_NAME;
1117
1118    bytes = size;
1119
1120    if ( NO_ERROR == ret )
1121        {
1122        if( NULL != mPreviewDataBufs )
1123            {
1124            ret = freePreviewDataBufs();
1125            }
1126        }
1127
1128    if ( NO_ERROR == ret )
1129        {
1130        bytes = ((bytes+4095)/4096)*4096;
1131        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1132
1133        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1134        if( NULL == mPreviewDataBufs )
1135            {
1136            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1137            ret = -NO_MEMORY;
1138            }
1139        else
1140            {
1141            bytes = size;
1142            }
1143        }
1144
1145    if ( NO_ERROR == ret )
1146        {
1147        mPreviewDataFd = mMemoryManager->getFd();
1148        mPreviewDataLength = bytes;
1149        mPreviewDataOffsets = mMemoryManager->getOffsets();
1150        }
1151    else
1152        {
1153        mPreviewDataFd = -1;
1154        mPreviewDataLength = 0;
1155        mPreviewDataOffsets = NULL;
1156        }
1157
1158    LOG_FUNCTION_NAME;
1159
1160    return ret;
1161}
1162
1163status_t CameraHal::freePreviewDataBufs()
1164{
1165    status_t ret = NO_ERROR;
1166
1167    LOG_FUNCTION_NAME;
1168
1169    if ( NO_ERROR == ret )
1170        {
1171
1172        if( NULL != mPreviewDataBufs )
1173            {
1174
1175            ///@todo Pluralise the name of this method to freeBuffers
1176            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1177            mPreviewDataBufs = NULL;
1178
1179            }
1180        }
1181
1182    LOG_FUNCTION_NAME_EXIT;
1183
1184    return ret;
1185}
1186
1187status_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1188{
1189    status_t ret = NO_ERROR;
1190    int bytes;
1191
1192    LOG_FUNCTION_NAME;
1193
1194    bytes = size;
1195
1196    // allocate image buffers only if not already allocated
1197    if(NULL != mImageBufs) {
1198        return NO_ERROR;
1199    }
1200
1201    if ( NO_ERROR == ret )
1202        {
1203        bytes = ((bytes+4095)/4096)*4096;
1204        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1205
1206        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1207        if( NULL == mImageBufs )
1208            {
1209            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1210            ret = -NO_MEMORY;
1211            }
1212        else
1213            {
1214            bytes = size;
1215            }
1216        }
1217
1218    if ( NO_ERROR == ret )
1219        {
1220        mImageFd = mMemoryManager->getFd();
1221        mImageLength = bytes;
1222        mImageOffsets = mMemoryManager->getOffsets();
1223        }
1224    else
1225        {
1226        mImageFd = -1;
1227        mImageLength = 0;
1228        mImageOffsets = NULL;
1229        }
1230
1231    LOG_FUNCTION_NAME;
1232
1233    return ret;
1234}
1235
1236status_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
1237{
1238  status_t ret = NO_ERROR;
1239  LOG_FUNCTION_NAME;
1240
1241  if( NULL != mVideoBufs ){
1242    ret = freeVideoBufs(mVideoBufs);
1243    mVideoBufs = NULL;
1244  }
1245
1246  if ( NO_ERROR == ret ){
1247    int32_t stride;
1248    buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount];
1249
1250    if (bufsArr != NULL){
1251      for (int i = 0; i< bufferCount; i++){
1252        GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
1253        buffer_handle_t buf;
1254        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &buf, &stride);
1255        if (ret != NO_ERROR){
1256          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
1257          ret = -NO_MEMORY;
1258          for (int j=0; j< i; j++){
1259            buf = (buffer_handle_t)bufsArr[j];
1260            CAMHAL_LOGEB("Freeing Gralloc Buffer 0x%x", buf);
1261            GrallocAlloc.free(buf);
1262          }
1263          delete [] bufsArr;
1264          goto exit;
1265        }
1266        bufsArr[i] = buf;
1267        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", buf);
1268      }
1269
1270      mVideoBufs = (int32_t *)bufsArr;
1271    }
1272    else{
1273      CAMHAL_LOGEA("Couldn't allocate video buffers ");
1274      ret = -NO_MEMORY;
1275    }
1276  }
1277
1278 exit:
1279  LOG_FUNCTION_NAME;
1280
1281  return ret;
1282}
1283
1284void endImageCapture( void *userData)
1285{
1286    LOG_FUNCTION_NAME;
1287
1288    if ( NULL != userData )
1289        {
1290        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1291        c->signalEndImageCapture();
1292        }
1293
1294    LOG_FUNCTION_NAME_EXIT;
1295}
1296
1297void releaseImageBuffers(void *userData)
1298{
1299    LOG_FUNCTION_NAME;
1300
1301    if (NULL != userData) {
1302        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1303        c->freeImageBufs();
1304    }
1305
1306    LOG_FUNCTION_NAME_EXIT;
1307}
1308
1309status_t CameraHal::signalEndImageCapture()
1310{
1311    status_t ret = NO_ERROR;
1312    int w,h;
1313    CameraParameters adapterParams = mParameters;
1314    Mutex::Autolock lock(mLock);
1315
1316    LOG_FUNCTION_NAME;
1317
1318    if ( mBracketingRunning ) {
1319        stopImageBracketing();
1320    } else {
1321        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
1322    }
1323
1324    LOG_FUNCTION_NAME_EXIT;
1325
1326    return ret;
1327}
1328
1329status_t CameraHal::freeImageBufs()
1330{
1331    status_t ret = NO_ERROR;
1332
1333    LOG_FUNCTION_NAME;
1334
1335    if ( NO_ERROR == ret )
1336        {
1337
1338        if( NULL != mImageBufs )
1339            {
1340
1341            ///@todo Pluralise the name of this method to freeBuffers
1342            ret = mMemoryManager->freeBuffer(mImageBufs);
1343            mImageBufs = NULL;
1344
1345            }
1346        else
1347            {
1348            ret = -EINVAL;
1349            }
1350
1351        }
1352
1353    LOG_FUNCTION_NAME_EXIT;
1354
1355    return ret;
1356}
1357
1358status_t CameraHal::freeVideoBufs(void *bufs)
1359{
1360  status_t ret = NO_ERROR;
1361
1362  LOG_FUNCTION_NAME;
1363
1364  buffer_handle_t *pBuf = (buffer_handle_t*)bufs;
1365  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1366  if(pBuf == NULL)
1367    {
1368      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
1369      LOG_FUNCTION_NAME_EXIT;
1370      return BAD_VALUE;
1371    }
1372
1373  GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
1374
1375  for(int i = 0; i < count; i++){
1376    buffer_handle_t ptr = *pBuf++;
1377    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", ptr);
1378    GrallocAlloc.free(ptr);
1379  }
1380
1381  LOG_FUNCTION_NAME_EXIT;
1382
1383  return ret;
1384}
1385
1386/**
1387   @brief Start preview mode.
1388
1389   @param none
1390   @return NO_ERROR Camera switched to VF mode
1391   @todo Update function header with the different errors that are possible
1392
1393 */
1394status_t CameraHal::startPreview()
1395{
1396
1397    status_t ret = NO_ERROR;
1398    CameraAdapter::BuffersDescriptor desc;
1399    CameraFrame frame;
1400    const char *valstr = NULL;
1401    unsigned int required_buffer_count;
1402    unsigned int max_queueble_buffers;
1403
1404#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1405        gettimeofday(&mStartPreview, NULL);
1406#endif
1407
1408    LOG_FUNCTION_NAME;
1409
1410    if ( mPreviewEnabled ){
1411      CAMHAL_LOGDA("Preview already running");
1412      LOG_FUNCTION_NAME_EXIT;
1413      return ALREADY_EXISTS;
1414    }
1415
1416    if ( NULL != mCameraAdapter ) {
1417      ret = mCameraAdapter->setParameters(mParameters);
1418    }
1419
1420    if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
1421      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
1422      if ( NO_ERROR != ret ){
1423        CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
1424        return ret;
1425      }
1426
1427      ///Update the current preview width and height
1428      mPreviewWidth = frame.mWidth;
1429      mPreviewHeight = frame.mHeight;
1430      //Update the padded width and height - required for VNF and VSTAB
1431      mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
1432      mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1433
1434    }
1435
1436    ///If we don't have the preview callback enabled and display adapter,
1437    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
1438      CAMHAL_LOGEA("Preview not started. Preview in progress flag set");
1439      mPreviewStartInProgress = true;
1440      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
1441      if ( NO_ERROR != ret ){
1442        CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
1443        return ret;
1444      }
1445      return NO_ERROR;
1446    }
1447
1448    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1449        {
1450        CAMHAL_LOGDA("Preview is in paused state");
1451
1452        mDisplayPaused = false;
1453        mPreviewEnabled = true;
1454        if ( NO_ERROR == ret )
1455            {
1456            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1457
1458            if ( NO_ERROR != ret )
1459                {
1460                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1461                }
1462            }
1463        //restart preview callbacks
1464        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1465        {
1466            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1467        }
1468        return ret;
1469        }
1470
1471
1472    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1473
1474    ///Allocate the preview buffers
1475    ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1476
1477    if ( NO_ERROR != ret )
1478        {
1479        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1480        goto error;
1481        }
1482
1483    if ( mMeasurementEnabled )
1484        {
1485
1486        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1487                                          ( int ) &frame,
1488                                          required_buffer_count);
1489        if ( NO_ERROR != ret )
1490            {
1491            return ret;
1492            }
1493
1494         ///Allocate the preview data buffers
1495        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1496        if ( NO_ERROR != ret ) {
1497            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1498            goto error;
1499           }
1500
1501        if ( NO_ERROR == ret )
1502            {
1503            desc.mBuffers = mPreviewDataBufs;
1504            desc.mOffsets = mPreviewDataOffsets;
1505            desc.mFd = mPreviewDataFd;
1506            desc.mLength = mPreviewDataLength;
1507            desc.mCount = ( size_t ) required_buffer_count;
1508            desc.mMaxQueueable = (size_t) required_buffer_count;
1509
1510            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1511                                        ( int ) &desc);
1512            }
1513
1514        }
1515
1516    ///Pass the buffers to Camera Adapter
1517    desc.mBuffers = mPreviewBufs;
1518    desc.mOffsets = mPreviewOffsets;
1519    desc.mFd = mPreviewFd;
1520    desc.mLength = mPreviewLength;
1521    desc.mCount = ( size_t ) required_buffer_count;
1522    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1523
1524    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
1525                                      ( int ) &desc);
1526
1527    if ( NO_ERROR != ret )
1528        {
1529        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
1530        freePreviewBufs();
1531        return ret;
1532        }
1533
1534    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1535
1536    ///Start the callback notifier
1537    ret = mAppCallbackNotifier->start();
1538
1539    if( ALREADY_EXISTS == ret )
1540        {
1541        //Already running, do nothing
1542        CAMHAL_LOGDA("AppCallbackNotifier already running");
1543        ret = NO_ERROR;
1544        }
1545    else if ( NO_ERROR == ret ) {
1546        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1547        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1548        }
1549    else
1550        {
1551        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1552        goto error;
1553        }
1554
1555    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1556    if(mDisplayAdapter.get() != NULL)
1557        {
1558        CAMHAL_LOGDA("Enabling display");
1559        bool isS3d = false;
1560        DisplayAdapter::S3DParameters s3dParams;
1561        int width, height;
1562        mParameters.getPreviewSize(&width, &height);
1563#if 0 //TODO: s3d is not part of bringup...will reenable
1564        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1565            isS3d = (strcmp(valstr, "true") == 0);
1566        }
1567        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1568            if (strcmp(valstr, "off") == 0)
1569                {
1570                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1571                //TODO: obtain the frame packing configuration from camera or user settings
1572                //once side by side configuration is supported
1573                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1574                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1575                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1576                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1577                }
1578            else
1579                {
1580                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1581                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1582                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1583                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1584                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1585                }
1586        }
1587#endif //if 0
1588
1589#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1590
1591        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1592
1593#else
1594
1595        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1596
1597#endif
1598
1599        if ( ret != NO_ERROR )
1600            {
1601            CAMHAL_LOGEA("Couldn't enable display");
1602            goto error;
1603            }
1604
1605        }
1606
1607    ///Send START_PREVIEW command to adapter
1608    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1609
1610    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1611
1612    if(ret!=NO_ERROR)
1613        {
1614        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1615        goto error;
1616        }
1617    CAMHAL_LOGDA("Started preview");
1618
1619    mPreviewEnabled = true;
1620    mPreviewStartInProgress = false;
1621    return ret;
1622
1623    error:
1624
1625        CAMHAL_LOGEA("Performing cleanup after error");
1626
1627        //Do all the cleanup
1628        freePreviewBufs();
1629        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1630        if(mDisplayAdapter.get() != NULL)
1631            {
1632            mDisplayAdapter->disableDisplay(false);
1633            }
1634        mAppCallbackNotifier->stop();
1635        mPreviewStartInProgress = false;
1636        mPreviewEnabled = false;
1637        LOG_FUNCTION_NAME_EXIT;
1638
1639        return ret;
1640}
1641
1642/**
1643   @brief Sets ANativeWindow object.
1644
1645   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1646   to render buffers to display.
1647
1648   @param[in] window The ANativeWindow object created by Surface flinger
1649   @return NO_ERROR If the ANativeWindow object passes validation criteria
1650   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1651
1652 */
1653status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1654{
1655    status_t ret = NO_ERROR;
1656    CameraAdapter::BuffersDescriptor desc;
1657
1658    LOG_FUNCTION_NAME;
1659    mSetPreviewWindowCalled = true;
1660
1661   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1662    if(!window)
1663    {
1664        if(mDisplayAdapter.get() != NULL)
1665        {
1666            ///NULL window passed, destroy the display adapter if present
1667            CAMHAL_LOGEA("NULL window passed, destroying display adapter");
1668            mDisplayAdapter.clear();
1669            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1670            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1671            mSetPreviewWindowCalled = false;
1672        }
1673        CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow");
1674        return NO_ERROR;
1675    }else if(mDisplayAdapter.get() == NULL)
1676    {
1677        // Need to create the display adapter since it has not been created
1678        // Create display adapter
1679        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1680        ret = NO_ERROR;
1681        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1682        {
1683            if(ret!=NO_ERROR)
1684            {
1685                mDisplayAdapter.clear();
1686                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1687                LOG_FUNCTION_NAME_EXIT;
1688                return ret;
1689            }
1690            else
1691            {
1692                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1693                LOG_FUNCTION_NAME_EXIT;
1694                return NO_MEMORY;
1695            }
1696        }
1697
1698        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1699        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1700        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1701
1702        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1703        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1704        // Set it as the error handler for the DisplayAdapter
1705        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1706
1707        // Update the display adapter with the new window that is passed from CameraService
1708        ret  = mDisplayAdapter->setPreviewWindow(window);
1709        if(ret!=NO_ERROR)
1710            {
1711            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1712            }
1713
1714        if(mPreviewStartInProgress)
1715        {
1716            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1717            // Start the preview since the window is now available
1718            ret = startPreview();
1719        }
1720    }else
1721    {
1722        /* If mDisplayAdpater is already created. No need to do anything.
1723         * We get a surface handle directly now, so we can reconfigure surface
1724         * itself in DisplayAdapter if dimensions have changed
1725         */
1726    }
1727    LOG_FUNCTION_NAME_EXIT;
1728
1729    return ret;
1730
1731}
1732
1733
1734/**
1735   @brief Stop a previously started preview.
1736
1737   @param none
1738   @return none
1739
1740 */
1741void CameraHal::stopPreview()
1742{
1743    LOG_FUNCTION_NAME;
1744
1745    if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
1746        {
1747        LOG_FUNCTION_NAME_EXIT;
1748        return;
1749        }
1750
1751    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
1752                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
1753    if(mDisplayPaused && !imageCaptureRunning)
1754        {
1755        // Display is paused, which essentially means there is no preview active.
1756        // Note: this is done so that when stopPreview is called by client after
1757        // an image capture, we do not de-initialize the camera adapter and
1758        // restart over again.
1759
1760        return;
1761        }
1762
1763    forceStopPreview();
1764
1765    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1766    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1767    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1768    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1769
1770    LOG_FUNCTION_NAME_EXIT;
1771}
1772
1773/**
1774   @brief Returns true if preview is enabled
1775
1776   @param none
1777   @return true If preview is running currently
1778         false If preview has been stopped
1779
1780 */
1781bool CameraHal::previewEnabled()
1782{
1783    LOG_FUNCTION_NAME;
1784
1785    return (mPreviewEnabled || mPreviewStartInProgress);
1786}
1787
1788/**
1789   @brief Start record mode.
1790
1791  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1792  the corresponding frame. Every record frame must be released by calling
1793  releaseRecordingFrame().
1794
1795   @param none
1796   @return NO_ERROR If recording could be started without any issues
1797   @todo Update the header with possible error values in failure scenarios
1798
1799 */
1800status_t CameraHal::startRecording( )
1801{
1802    int w, h;
1803    const char *valstr = NULL;
1804    bool restartPreviewRequired = false;
1805    status_t ret = NO_ERROR;
1806
1807    LOG_FUNCTION_NAME;
1808
1809
1810#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1811
1812            gettimeofday(&mStartPreview, NULL);
1813
1814#endif
1815
1816    if(!previewEnabled())
1817        {
1818        return NO_INIT;
1819        }
1820
1821    // set internal recording hint in case camera adapter needs to make some
1822    // decisions....(will only be sent to camera adapter if camera restart is required)
1823    mParameters.set(TICameraParameters::KEY_RECORDING_HINT, CameraParameters::TRUE);
1824
1825    // if application starts recording in continuous focus picture mode...
1826    // then we need to force default capture mode (as opposed to video mode)
1827    if ( ((valstr = mParameters.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
1828         (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
1829        restartPreviewRequired = resetVideoModeParameters();
1830    }
1831
1832    // only need to check recording hint if preview restart is not already needed
1833    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
1834    if ( !restartPreviewRequired &&
1835         (!valstr || (valstr && (strcmp(valstr, CameraParameters::TRUE) != 0))) ) {
1836        restartPreviewRequired = setVideoModeParameters(mParameters);
1837    }
1838
1839    if (restartPreviewRequired) {
1840        ret = restartPreview();
1841    }
1842
1843    if ( NO_ERROR == ret )
1844      {
1845        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1846        mParameters.getPreviewSize(&w, &h);
1847        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
1848
1849        if ((w != mVideoWidth) && (h != mVideoHeight))
1850          {
1851            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
1852            if ( NO_ERROR != ret )
1853              {
1854                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
1855                mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
1856                return ret;
1857              }
1858
1859            mAppCallbackNotifier->useVideoBuffers(true);
1860            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
1861            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBufs);
1862          }
1863        else
1864          {
1865            mAppCallbackNotifier->useVideoBuffers(false);
1866            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
1867            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
1868          }
1869      }
1870
1871    if ( NO_ERROR == ret )
1872        {
1873         ret = mAppCallbackNotifier->startRecording();
1874        }
1875
1876    if ( NO_ERROR == ret )
1877        {
1878        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1879         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1880        }
1881
1882    if ( NO_ERROR == ret )
1883        {
1884        mRecordingEnabled = true;
1885        }
1886
1887    LOG_FUNCTION_NAME_EXIT;
1888
1889    return ret;
1890}
1891
1892/**
1893   @brief Set the camera parameters specific to Video Recording.
1894
1895   This function checks for the camera parameters which have to be set for recording.
1896   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1897   This function also enables Video Recording specific functions like VSTAB & VNF.
1898
1899   @param none
1900   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1901   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1902
1903 */
1904bool CameraHal::setVideoModeParameters(const CameraParameters& params)
1905{
1906    const char *valstr = NULL;
1907    bool restartPreviewRequired = false;
1908    status_t ret = NO_ERROR;
1909
1910    LOG_FUNCTION_NAME;
1911
1912    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1913    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1914    if ( (valstr == NULL) ||
1915        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1916        {
1917        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1918        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1919        restartPreviewRequired = true;
1920        }
1921
1922    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1923    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1924    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) {
1925       // set VSTAB. restart is required if vstab value has changed
1926       if (params.get(CameraParameters::KEY_VIDEO_STABILIZATION) != NULL) {
1927            // make sure we support vstab
1928            if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
1929                       CameraParameters::TRUE) == 0) {
1930                valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
1931                // vstab value has changed
1932                if ((valstr != NULL) &&
1933                     strcmp(valstr, params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != 0) {
1934                    restartPreviewRequired = true;
1935                }
1936                mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1937                                params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
1938            }
1939        } else if (mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION)) {
1940            // vstab was configured but now unset
1941            restartPreviewRequired = true;
1942            mParameters.remove(CameraParameters::KEY_VIDEO_STABILIZATION);
1943        }
1944
1945        // Set VNF
1946        if (params.get(TICameraParameters::KEY_VNF) == NULL) {
1947            CAMHAL_LOGDA("Enable VNF");
1948            mParameters.set(TICameraParameters::KEY_VNF, "1");
1949            restartPreviewRequired = true;
1950        } else {
1951            valstr = mParameters.get(TICameraParameters::KEY_VNF);
1952            if (valstr && strcmp(valstr, params.get(TICameraParameters::KEY_VNF)) != 0) {
1953                restartPreviewRequired = true;
1954            }
1955            mParameters.set(TICameraParameters::KEY_VNF, params.get(TICameraParameters::KEY_VNF));
1956        }
1957
1958        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1959        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1960        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
1961        valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
1962        if (valstr && (strcmp(valstr, CameraParameters::TRUE) == 0) && (mPreviewWidth == 1920)) {
1963            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1964            mParameters.set(TICameraParameters::KEY_VNF, "1");
1965            restartPreviewRequired = true;
1966        }
1967    }
1968    LOG_FUNCTION_NAME_EXIT;
1969
1970    return restartPreviewRequired;
1971}
1972
1973/**
1974   @brief Reset the camera parameters specific to Video Recording.
1975
1976   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1977
1978   @param none
1979   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1980
1981 */
1982bool CameraHal::resetVideoModeParameters()
1983{
1984    const char *valstr = NULL;
1985    bool restartPreviewRequired = false;
1986    status_t ret = NO_ERROR;
1987
1988    LOG_FUNCTION_NAME;
1989
1990    // ignore this if we are already recording
1991    if (mRecordingEnabled) {
1992        return false;
1993    }
1994
1995    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1996    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1997    if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
1998        CAMHAL_LOGDA("Reset Capture-Mode to default");
1999        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2000        restartPreviewRequired = true;
2001    }
2002
2003    LOG_FUNCTION_NAME_EXIT;
2004
2005    return restartPreviewRequired;
2006}
2007
2008/**
2009   @brief Restart the preview with setParameter.
2010
2011   This function restarts preview, for some VIDEO_MODE parameters to take effect.
2012
2013   @param none
2014   @return NO_ERROR If recording parameters could be set without any issues
2015
2016 */
2017status_t CameraHal::restartPreview()
2018{
2019    const char *valstr = NULL;
2020    char tmpvalstr[30];
2021    status_t ret = NO_ERROR;
2022
2023    LOG_FUNCTION_NAME;
2024
2025    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2026    tmpvalstr[0] = 0;
2027    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2028    if(valstr != NULL)
2029        {
2030        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
2031            {
2032            return -EINVAL;
2033            }
2034
2035        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
2036        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
2037        }
2038
2039    forceStopPreview();
2040
2041    {
2042        Mutex::Autolock lock(mLock);
2043        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
2044        mCameraAdapter->setParameters(mParameters);
2045    }
2046
2047    ret = startPreview();
2048
2049    LOG_FUNCTION_NAME_EXIT;
2050
2051    return ret;
2052}
2053
2054/**
2055   @brief Stop a previously started recording.
2056
2057   @param none
2058   @return none
2059
2060 */
2061void CameraHal::stopRecording()
2062{
2063    CameraAdapter::AdapterState currentState;
2064
2065    LOG_FUNCTION_NAME;
2066
2067    Mutex::Autolock lock(mLock);
2068
2069    if (!mRecordingEnabled )
2070        {
2071        return;
2072        }
2073
2074    currentState = mCameraAdapter->getState();
2075    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
2076        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2077    }
2078
2079    mAppCallbackNotifier->stopRecording();
2080
2081    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2082
2083    mRecordingEnabled = false;
2084
2085    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
2086      freeVideoBufs(mVideoBufs);
2087      if (mVideoBufs){
2088        CAMHAL_LOGVB(" FREEING mVideoBufs 0x%x", mVideoBufs);
2089        delete [] mVideoBufs;
2090      }
2091      mVideoBufs = NULL;
2092    }
2093
2094    // reset internal recording hint in case camera adapter needs to make some
2095    // decisions....(will only be sent to camera adapter if camera restart is required)
2096    mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
2097
2098    LOG_FUNCTION_NAME_EXIT;
2099}
2100
2101/**
2102   @brief Returns true if recording is enabled.
2103
2104   @param none
2105   @return true If recording is currently running
2106         false If recording has been stopped
2107
2108 */
2109int CameraHal::recordingEnabled()
2110{
2111    LOG_FUNCTION_NAME;
2112
2113    LOG_FUNCTION_NAME_EXIT;
2114
2115    return mRecordingEnabled;
2116}
2117
2118/**
2119   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2120
2121   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2122               previously given by CameraHal
2123   @return none
2124
2125 */
2126void CameraHal::releaseRecordingFrame(const void* mem)
2127{
2128    LOG_FUNCTION_NAME;
2129
2130    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2131
2132    if ( ( mRecordingEnabled ) && mem != NULL)
2133    {
2134        mAppCallbackNotifier->releaseRecordingFrame(mem);
2135    }
2136
2137    LOG_FUNCTION_NAME_EXIT;
2138
2139    return;
2140}
2141
2142/**
2143   @brief Start auto focus
2144
2145   This call asynchronous.
2146   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2147   focusing is complete. autoFocus() will be called again if another auto focus is
2148   needed.
2149
2150   @param none
2151   @return NO_ERROR
2152   @todo Define the error codes if the focus is not locked
2153
2154 */
2155status_t CameraHal::autoFocus()
2156{
2157    status_t ret = NO_ERROR;
2158
2159#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2160
2161    gettimeofday(&mStartFocus, NULL);
2162
2163#endif
2164
2165
2166    LOG_FUNCTION_NAME;
2167
2168    {
2169    Mutex::Autolock lock(mLock);
2170    mMsgEnabled |= CAMERA_MSG_FOCUS;
2171    }
2172
2173
2174    if ( NULL != mCameraAdapter )
2175        {
2176
2177#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2178
2179    //pass the autoFocus timestamp along with the command to camera adapter
2180    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2181
2182#else
2183
2184    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2185
2186#endif
2187
2188        }
2189    else
2190        {
2191            ret = -1;
2192        }
2193
2194    LOG_FUNCTION_NAME_EXIT;
2195
2196    return ret;
2197}
2198
2199/**
2200   @brief Cancels auto-focus function.
2201
2202   If the auto-focus is still in progress, this function will cancel it.
2203   Whether the auto-focus is in progress or not, this function will return the
2204   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2205
2206
2207   @param none
2208   @return NO_ERROR If the cancel succeeded
2209   @todo Define error codes if cancel didnt succeed
2210
2211 */
2212status_t CameraHal::cancelAutoFocus()
2213{
2214    LOG_FUNCTION_NAME;
2215
2216    {
2217    Mutex::Autolock lock(mLock);
2218    mMsgEnabled &= ~CAMERA_MSG_FOCUS;
2219    }
2220
2221    if( NULL != mCameraAdapter )
2222    {
2223        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
2224    }
2225    LOG_FUNCTION_NAME_EXIT;
2226    return NO_ERROR;
2227}
2228
2229void CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2230{
2231
2232    LOG_FUNCTION_NAME;
2233
2234    if ( NULL != mEventProvider )
2235        {
2236        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2237        delete mEventProvider;
2238        mEventProvider = NULL;
2239        }
2240
2241    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2242    if ( NULL == mEventProvider )
2243        {
2244        CAMHAL_LOGEA("Error in creating EventProvider");
2245        }
2246    else
2247        {
2248        mEventProvider->enableEventNotification(eventMask);
2249        }
2250
2251    LOG_FUNCTION_NAME_EXIT;
2252}
2253
2254void CameraHal::eventCallbackRelay(CameraHalEvent* event)
2255{
2256    LOG_FUNCTION_NAME;
2257
2258    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2259    appcbn->eventCallback(event );
2260
2261    LOG_FUNCTION_NAME_EXIT;
2262}
2263
2264void CameraHal::eventCallback(CameraHalEvent* event)
2265{
2266    LOG_FUNCTION_NAME;
2267
2268    if ( NULL != event )
2269        {
2270        switch( event->mEventType )
2271            {
2272            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2273            case CameraHalEvent::EVENT_FOCUS_ERROR:
2274                {
2275                if ( mBracketingEnabled )
2276                    {
2277                    startImageBracketing();
2278                    }
2279                break;
2280                }
2281            default:
2282                {
2283                break;
2284                }
2285            };
2286        }
2287
2288    LOG_FUNCTION_NAME_EXIT;
2289}
2290
2291status_t CameraHal::startImageBracketing()
2292{
2293        status_t ret = NO_ERROR;
2294        CameraFrame frame;
2295        CameraAdapter::BuffersDescriptor desc;
2296
2297#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2298
2299        gettimeofday(&mStartCapture, NULL);
2300
2301#endif
2302
2303        LOG_FUNCTION_NAME;
2304
2305        if(!previewEnabled() && !mDisplayPaused)
2306            {
2307            LOG_FUNCTION_NAME_EXIT;
2308            return NO_INIT;
2309            }
2310
2311        if ( !mBracketingEnabled )
2312            {
2313            return ret;
2314            }
2315
2316        if ( NO_ERROR == ret )
2317            {
2318            mBracketingRunning = true;
2319            }
2320
2321        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2322            {
2323            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2324                                              ( int ) &frame,
2325                                              ( mBracketRangeNegative + 1 ));
2326
2327            if ( NO_ERROR != ret )
2328                {
2329                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2330                }
2331            }
2332
2333        if ( NO_ERROR == ret )
2334            {
2335            if ( NULL != mAppCallbackNotifier.get() )
2336                 {
2337                 mAppCallbackNotifier->setBurst(true);
2338                 }
2339            }
2340
2341        if ( NO_ERROR == ret )
2342            {
2343            mParameters.getPictureSize(( int * ) &frame.mWidth,
2344                                       ( int * ) &frame.mHeight);
2345
2346            ret = allocImageBufs(frame.mWidth,
2347                                 frame.mHeight,
2348                                 frame.mLength,
2349                                 mParameters.getPictureFormat(),
2350                                 ( mBracketRangeNegative + 1 ));
2351            if ( NO_ERROR != ret )
2352              {
2353                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2354              }
2355            }
2356
2357        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2358            {
2359
2360            desc.mBuffers = mImageBufs;
2361            desc.mOffsets = mImageOffsets;
2362            desc.mFd = mImageFd;
2363            desc.mLength = mImageLength;
2364            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2365            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2366
2367            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2368                                              ( int ) &desc);
2369
2370            if ( NO_ERROR == ret )
2371                {
2372
2373#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2374
2375                 //pass capture timestamp along with the camera adapter command
2376                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2377
2378#else
2379
2380                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2381
2382#endif
2383
2384                }
2385            }
2386
2387        return ret;
2388}
2389
2390status_t CameraHal::stopImageBracketing()
2391{
2392        status_t ret = NO_ERROR;
2393
2394        LOG_FUNCTION_NAME;
2395
2396        if( !previewEnabled() )
2397            {
2398            return NO_INIT;
2399            }
2400
2401        mBracketingRunning = false;
2402
2403        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2404
2405        LOG_FUNCTION_NAME_EXIT;
2406
2407        return ret;
2408}
2409
2410/**
2411   @brief Take a picture.
2412
2413   @param none
2414   @return NO_ERROR If able to switch to image capture
2415   @todo Define error codes if unable to switch to image capture
2416
2417 */
2418status_t CameraHal::takePicture( )
2419{
2420    status_t ret = NO_ERROR;
2421    CameraFrame frame;
2422    CameraAdapter::BuffersDescriptor desc;
2423    int burst;
2424    const char *valstr = NULL;
2425    unsigned int bufferCount = 1;
2426
2427    Mutex::Autolock lock(mLock);
2428
2429#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2430
2431    gettimeofday(&mStartCapture, NULL);
2432
2433#endif
2434
2435    LOG_FUNCTION_NAME;
2436
2437    if(!previewEnabled() && !mDisplayPaused)
2438        {
2439        LOG_FUNCTION_NAME_EXIT;
2440        CAMHAL_LOGEA("Preview not started...");
2441        return NO_INIT;
2442        }
2443
2444    // return error if we are already capturing
2445    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2446          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2447         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2448          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2449        CAMHAL_LOGEA("Already capturing an image...");
2450        return NO_INIT;
2451    }
2452
2453    // we only support video snapshot if we are in video mode (recording hint is set)
2454    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2455    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2456         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2457        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2458        return INVALID_OPERATION;
2459    }
2460
2461    if ( !mBracketingRunning )
2462        {
2463
2464         if ( NO_ERROR == ret )
2465            {
2466            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2467            }
2468
2469         //Allocate all buffers only in burst capture case
2470         if ( burst > 1 )
2471             {
2472             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2473             if ( NULL != mAppCallbackNotifier.get() )
2474                 {
2475                 mAppCallbackNotifier->setBurst(true);
2476                 }
2477             }
2478         else
2479             {
2480             if ( NULL != mAppCallbackNotifier.get() )
2481                 {
2482                 mAppCallbackNotifier->setBurst(false);
2483                 }
2484             }
2485
2486        // pause preview during normal image capture
2487        // do not pause preview if recording (video state)
2488        if (NO_ERROR == ret &&
2489                NULL != mDisplayAdapter.get() &&
2490                burst < 1) {
2491            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2492                mDisplayPaused = true;
2493                mPreviewEnabled = false;
2494                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2495                // since preview is paused we should stop sending preview frames too
2496                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2497                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2498                }
2499            }
2500
2501#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2502            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2503#endif
2504        }
2505
2506        // if we taking video snapshot...
2507        if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
2508            // enable post view frames if not already enabled so we can internally
2509            // save snapshot frames for generating thumbnail
2510            if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
2511                mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
2512            }
2513        }
2514
2515        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2516            {
2517            if ( NO_ERROR == ret )
2518                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2519                                                  ( int ) &frame,
2520                                                  bufferCount);
2521
2522            if ( NO_ERROR != ret )
2523                {
2524                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2525                }
2526            }
2527
2528        if ( NO_ERROR == ret )
2529            {
2530            mParameters.getPictureSize(( int * ) &frame.mWidth,
2531                                       ( int * ) &frame.mHeight);
2532
2533            ret = allocImageBufs(frame.mWidth,
2534                                 frame.mHeight,
2535                                 frame.mLength,
2536                                 mParameters.getPictureFormat(),
2537                                 bufferCount);
2538            if ( NO_ERROR != ret )
2539                {
2540                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2541                }
2542            }
2543
2544        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2545            {
2546            desc.mBuffers = mImageBufs;
2547            desc.mOffsets = mImageOffsets;
2548            desc.mFd = mImageFd;
2549            desc.mLength = mImageLength;
2550            desc.mCount = ( size_t ) bufferCount;
2551            desc.mMaxQueueable = ( size_t ) bufferCount;
2552
2553            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2554                                              ( int ) &desc);
2555            }
2556        }
2557
2558    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2559        {
2560
2561#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2562
2563         //pass capture timestamp along with the camera adapter command
2564        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2565
2566#else
2567
2568        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2569
2570#endif
2571
2572        }
2573
2574    return ret;
2575}
2576
2577/**
2578   @brief Cancel a picture that was started with takePicture.
2579
2580   Calling this method when no picture is being taken is a no-op.
2581
2582   @param none
2583   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2584   @todo Define error codes
2585
2586 */
2587status_t CameraHal::cancelPicture( )
2588{
2589    LOG_FUNCTION_NAME;
2590
2591    Mutex::Autolock lock(mLock);
2592
2593    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2594
2595    return NO_ERROR;
2596}
2597
2598/**
2599   @brief Return the camera parameters.
2600
2601   @param none
2602   @return Currently configured camera parameters
2603
2604 */
2605char* CameraHal::getParameters()
2606{
2607    String8 params_str8;
2608    char* params_string;
2609    const char * valstr = NULL;
2610
2611    LOG_FUNCTION_NAME;
2612
2613    if( NULL != mCameraAdapter )
2614    {
2615        mCameraAdapter->getParameters(mParameters);
2616    }
2617
2618    CameraParameters mParams = mParameters;
2619
2620    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
2621    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
2622    if(valstr != NULL)
2623      {
2624        if(strcmp(valstr, CameraParameters::TRUE) == 0)
2625          {
2626            //HACK FOR MMS MODE
2627            resetPreviewRes(&mParams, mVideoWidth, mVideoHeight);
2628          }
2629      }
2630
2631    // do not send internal parameters to upper layers
2632    mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
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        CameraAdapter::AdapterState currentState;
3374        CameraAdapter::AdapterState nextState;
3375
3376        currentState = mCameraAdapter->getState();
3377        nextState = mCameraAdapter->getNextState();
3378
3379        // since prerequisite for capturing is for camera system
3380        // to be previewing...cancel all captures before stopping
3381        // preview
3382        if ( (currentState == CameraAdapter::CAPTURE_STATE) &&
3383             (nextState != CameraAdapter::PREVIEW_STATE)) {
3384            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
3385        }
3386
3387        // only need to send these control commands to state machine if we are
3388        // passed the LOADED_PREVIEW_STATE
3389        if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) {
3390           // according to javadoc...FD should be stopped in stopPreview
3391           // and application needs to call startFaceDection again
3392           // to restart FD
3393           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3394           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
3395        }
3396
3397        // only need to send these control commands to state machine if we are
3398        // passed the INITIALIZED_STATE
3399        if (currentState > CameraAdapter::INTIALIZED_STATE) {
3400           //Stop the source of frames
3401           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
3402        }
3403    }
3404
3405    freePreviewBufs();
3406    freePreviewDataBufs();
3407
3408    mPreviewEnabled = false;
3409    mDisplayPaused = false;
3410    mPreviewStartInProgress = false;
3411
3412    LOG_FUNCTION_NAME_EXIT;
3413}
3414
3415/**
3416   @brief Deallocates memory for all the resources held by Camera HAL.
3417
3418   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3419   and Memory Manager
3420
3421   @param none
3422   @return none
3423
3424 */
3425void CameraHal::deinitialize()
3426{
3427    LOG_FUNCTION_NAME;
3428
3429    if ( mPreviewEnabled || mDisplayPaused ) {
3430        forceStopPreview();
3431    }
3432
3433    mSetPreviewWindowCalled = false;
3434
3435    if (mSensorListener.get()) {
3436        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3437        mSensorListener.clear();
3438        mSensorListener = NULL;
3439    }
3440
3441    LOG_FUNCTION_NAME_EXIT;
3442
3443}
3444
3445status_t CameraHal::storeMetaDataInBuffers(bool enable)
3446{
3447    LOG_FUNCTION_NAME;
3448
3449    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3450
3451    LOG_FUNCTION_NAME_EXIT;
3452}
3453
3454void CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3455{
3456  char * ptr;
3457  char supported[MAX_PROP_VALUE_LENGTH];
3458  int fpsrangeArray[2];
3459  int i = 0;
3460
3461  LOG_FUNCTION_NAME;
3462  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3463  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3464
3465  ptr = strtok (supported," (,)");
3466
3467  while (ptr != NULL)
3468    {
3469      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3470      if (i == 1)
3471        {
3472          if (framerate == fpsrangeArray[i])
3473            {
3474              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3475              *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE;
3476              *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE;
3477              break;
3478            }
3479        }
3480      ptr = strtok (NULL, " (,)");
3481      i++;
3482      i%=2;
3483    }
3484
3485  LOG_FUNCTION_NAME_EXIT;
3486
3487}
3488
3489void CameraHal::setPreferredPreviewRes(int width, int height)
3490{
3491  LOG_FUNCTION_NAME;
3492
3493  if ( (width == 320) && (height == 240)){
3494    mParameters.setPreviewSize(640,480);
3495  }
3496  if ( (width == 176) && (height == 144)){
3497    mParameters.setPreviewSize(704,576);
3498  }
3499
3500  LOG_FUNCTION_NAME_EXIT;
3501}
3502
3503void CameraHal::resetPreviewRes(CameraParameters *mParams, int width, int height)
3504{
3505  LOG_FUNCTION_NAME;
3506
3507  if ( (width <= 320) && (height <= 240)){
3508    mParams->setPreviewSize(mVideoWidth, mVideoHeight);
3509  }
3510
3511  LOG_FUNCTION_NAME_EXIT;
3512}
3513
3514};
3515
3516
3517