CameraHAL: Fixes for ANR and a setParameter issue

Fix 1/3 for b/5593964.

1. Ensure we don't race with stopImageCapture when stopPreview is called
2. Signal the shutter callback correctly
3. Do not crash the media server if focus APIs and image capture returns error
   Still go ahead and perform de-init
4. Replace setParameter from CameraHAl to AppCallbackNotifier with getParameter
   when needed.

Change-Id: I2b2745827d227a8d7927ce1611a84c29129e8891
Signed-off-by: Sundar Raman <sunds@ti.com>
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp
index c716291..4513c48 100644
--- a/camera/AppCallbackNotifier.cpp
+++ b/camera/AppCallbackNotifier.cpp
@@ -310,7 +310,10 @@
     ///Receive and send the event notifications to app
     TIUTILS::Message msg;
     LOG_FUNCTION_NAME;
+    {
+    Mutex::Autolock lock(mLock);
     mEventQ.get(&msg);
+    }
     bool ret = true;
     CameraHalEvent *evt = NULL;
     CameraHalEvent::FocusEventData *focusEvtData;
@@ -820,12 +823,16 @@
                         buf = raw_picture->data;
                     }
 
-                    encode_quality = mParameters.getInt(CameraParameters::KEY_JPEG_QUALITY);
+                    CameraParameters parameters;
+                    const String8 strParams(mCameraHal->getParameters());
+                    parameters.unflatten(strParams);
+
+                    encode_quality = parameters.getInt(CameraParameters::KEY_JPEG_QUALITY);
                     if (encode_quality < 0 || encode_quality > 100) {
                         encode_quality = 100;
                     }
 
-                    tn_quality = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
+                    tn_quality = parameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
                     if (tn_quality < 0 || tn_quality > 100) {
                         tn_quality = 100;
                     }
@@ -849,8 +856,8 @@
                         main_jpeg->format = CameraParameters::PIXEL_FORMAT_YUV422I;
                     }
 
-                    tn_width = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
-                    tn_height = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
+                    tn_width = parameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
+                    tn_height = parameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
 
                     if ((tn_width > 0) && (tn_height > 0)) {
                         tn_jpeg = (Encoder_libjpeg::params*)
@@ -863,7 +870,7 @@
 
                     if (tn_jpeg) {
                         int width, height;
-                        mParameters.getPreviewSize(&width,&height);
+                        parameters.getPreviewSize(&width,&height);
                         current_snapshot = (mPreviewBufCount + MAX_BUFFERS - 1) % MAX_BUFFERS;
                         tn_jpeg->src = (uint8_t*) mPreviewBufs[current_snapshot];
                         tn_jpeg->src_size = mPreviewMemory->size / MAX_BUFFERS;
@@ -1140,8 +1147,11 @@
             {
             msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT;
             msg.arg1 = event;
+            {
+            Mutex::Autolock lock(mLock);
             mEventQ.put(&msg);
             }
+            }
         else
             {
             CAMHAL_LOGEA("Not enough resources to allocate CameraHalEvent");
@@ -1153,6 +1163,18 @@
 }
 
 
+void AppCallbackNotifier::flushEventQueue()
+{
+
+    {
+    Mutex::Autolock lock(mLock);
+    TIUTILS::Message msg;
+    while(!mEventQ.isEmpty())
+        mEventQ.get(&msg);
+    }
+}
+
+
 bool AppCallbackNotifier::processMessage()
 {
     ///Retrieve the command from the command queue and process it
@@ -1418,16 +1440,6 @@
   LOG_FUNCTION_NAME_EXIT;
 }
 
-int AppCallbackNotifier::setParameters(const CameraParameters& params)
-{
-    LOG_FUNCTION_NAME;
-
-    mParameters = params;
-
-    LOG_FUNCTION_NAME_EXIT;
-    return NO_ERROR;
-}
-
 status_t AppCallbackNotifier::stopPreviewCallbacks()
 {
     sp<MemoryHeapBase> heap;
diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp
index 1f14a2e..7e18330 100644
--- a/camera/CameraHal.cpp
+++ b/camera/CameraHal.cpp
@@ -1008,10 +1008,6 @@
         mParameters.unflatten(oldParams.flatten());
     }
 
-    if ( NULL != mAppCallbackNotifier.get() ) {
-        mAppCallbackNotifier->setParameters(mParameters);
-    }
-
     // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
     // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
     if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
@@ -2222,6 +2218,7 @@
         adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, CameraParameters::FALSE);
         mCameraAdapter->setParameters(adapterParams);
         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
+        mAppCallbackNotifier->flushEventQueue();
     }
 
     LOG_FUNCTION_NAME_EXIT;
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index e97244c..2268e44 100755
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -3331,14 +3331,6 @@
             }
         }
 
-        if ( NO_ERROR != stat )
-            {
-            errorNotify = ( ErrorNotifier * ) msg.arg1;
-            if ( NULL != errorNotify )
-                {
-                errorNotify->errorNotify(CAMERA_ERROR_HARD);
-                }
-            }
         }
 
     LOG_FUNCTION_NAME_EXIT;
diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp
index 68111b8..9ba438c 100644
--- a/camera/OMXCameraAdapter/OMXCapture.cpp
+++ b/camera/OMXCameraAdapter/OMXCapture.cpp
@@ -741,6 +741,11 @@
         return NO_INIT;
         }
 
+    if ((getNextState() & (CAPTURE_ACTIVE|BRACKETING_ACTIVE)) == 0) {
+        CAMHAL_LOGDA("trying starting capture when already canceled");
+        return NO_ERROR;
+    }
+
     // Camera framework doesn't expect face callbacks once capture is triggered
     pauseFaceDetection(true);
 
@@ -899,12 +904,13 @@
         // if anybody is waiting on the shutter callback
         // signal them and then recreate the semaphore
         if ( 0 != mStartCaptureSem.Count() ) {
-            for (int i = mStopCaptureSem.Count(); i > 0; i--) {
-                ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
-                                   (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
-                                   OMX_ALL,
-                                   OMX_TI_IndexConfigShutterCallback,
-                                   NULL );
+
+            for (int i = mStartCaptureSem.Count(); i < 0; i++) {
+            ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
+                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
+                               OMX_ALL,
+                               OMX_TI_IndexConfigShutterCallback,
+                               NULL );
             }
             mStartCaptureSem.Create(0);
         }
diff --git a/camera/inc/CameraHal.h b/camera/inc/CameraHal.h
index c6af5ab..f33515a 100644
--- a/camera/inc/CameraHal.h
+++ b/camera/inc/CameraHal.h
@@ -566,8 +566,6 @@
     //Set Burst mode
     void setBurst(bool burst);
 
-    int setParameters(const CameraParameters& params);
-
     //Notifications from CameraHal for video recording case
     status_t startRecording();
     status_t stopRecording();
@@ -583,6 +581,8 @@
     bool getUesVideoBuffers();
     void setVideoRes(int width, int height);
 
+    void flushEventQueue();
+
     //Internal class definitions
     class NotificationThread : public Thread {
         AppCallbackNotifier* mAppCallbackNotifier;
@@ -662,8 +662,6 @@
     bool mUseMetaDataBufferMode;
     bool mRawAvailable;
 
-    CameraParameters mParameters;
-
     bool mUseVideoBuffers;
 
     int mVideoWidth;