~xnox/ubuntu/trusty/gcc-arm-linux-androideabi/dima

« back to all changes in this revision

Viewing changes to android/hardware/ti/omap4xxx/camera/CameraHal.cpp

  • Committer: Package Import Robot
  • Author(s): Dmitrijs Ledkovs
  • Date: 2013-07-05 10:12:24 UTC
  • Revision ID: package-import@ubuntu.com-20130705101224-6qo3e8jbz8p31aa1
Tags: upstream-0.20130705.1
ImportĀ upstreamĀ versionĀ 0.20130705.1

Show diffs side-by-side

added added

removed removed

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