Fix issue 3412777 ANR on adding effects.

Change-Id: Id3c480a8261423412a99375f71cf6ee585b6c22b
diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
index b9105cb..297c4df 100644
--- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
+++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
@@ -23,6 +23,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -3058,6 +3059,8 @@
                 Log.e(TAG, "Runtime exception in nativeStartPreview");
                 throw ex;
             }
+        } else {
+            throw new IllegalStateException("generatePreview is in progress");
         }
     }
 
@@ -3085,7 +3088,10 @@
     long renderPreviewFrame(Surface surface, long time, int surfaceWidth,
             int surfaceHeight, VideoEditor.OverlayData overlayData) {
         if (mInvalidatePreviewArray) {
-            throw new RuntimeException("Call generate preview first");
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Call generate preview first");
+            }
+            throw new IllegalStateException("Call generate preview first");
         }
 
         long timeMs = 0;
@@ -3913,6 +3919,27 @@
     }
 
     /**
+     * Tries to grab the semaphore with a specified time out which arbitrates access to the editor
+     *
+     * @param timeoutMs time out in ms.
+     *
+     * @return true if the semaphore is acquired, false otherwise
+     * @throws InterruptedException
+     */
+    boolean lock(long timeoutMs) throws InterruptedException {
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "lock: grabbing semaphore with timeout " + timeoutMs, new Throwable());
+        }
+
+        boolean acquireSem = mLock.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "lock: grabbed semaphore status " + acquireSem);
+        }
+
+        return acquireSem;
+    }
+
+    /**
      * Release the semaphore which arbitrates access to the editor
      */
     void unlock() {
diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java
index 7608c05..27ab799 100755
--- a/media/java/android/media/videoeditor/VideoEditorImpl.java
+++ b/media/java/android/media/videoeditor/VideoEditorImpl.java
@@ -112,6 +112,7 @@
     private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_WIDTH = "resized_RGBframe_width";
     private static final String ATTR_OVERLAY_RESIZED_RGB_FRAME_HEIGHT = "resized_RGBframe_height";
 
+    private static final int ENGINE_ACCESS_MAX_TIMEOUT_MS = 500;
     /*
      *  Instance variables
      */
@@ -852,8 +853,10 @@
 
         boolean semAcquireDone = false;
         try {
-            mMANativeHelper.lock();
-            semAcquireDone = true;
+            semAcquireDone = mMANativeHelper.lock(ENGINE_ACCESS_MAX_TIMEOUT_MS);
+            if (semAcquireDone == false) {
+                throw new IllegalStateException("Timeout waiting for semaphore");
+            }
 
             if (mMediaItems.size() > 0) {
                 final Rect frame = surfaceHolder.getSurfaceFrame();
@@ -862,8 +865,9 @@
             } else {
                 result = 0;
             }
-        } catch (InterruptedException  ex) {
-            Log.e(TAG, "Sem acquire NOT successful in renderPreviewFrame");
+        } catch (InterruptedException ex) {
+            Log.w(TAG, "The thread was interrupted", new Throwable());
+            throw new IllegalStateException("The thread was interrupted");
         } finally {
             if (semAcquireDone) {
                 mMANativeHelper.unlock();
@@ -1582,8 +1586,10 @@
 
         boolean semAcquireDone = false;
         try{
-            mMANativeHelper.lock();
-            semAcquireDone = true;
+            semAcquireDone = mMANativeHelper.lock(ENGINE_ACCESS_MAX_TIMEOUT_MS);
+            if (semAcquireDone == false) {
+                throw new IllegalStateException("Timeout waiting for semaphore");
+            }
 
             if (mMediaItems.size() > 0) {
                 mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions,
@@ -1595,17 +1601,9 @@
             /**
              *  release on complete by calling stopPreview
              */
-        } catch (InterruptedException  ex) {
-            Log.e(TAG, "Sem acquire NOT successful in startPreview");
-        } catch (IllegalArgumentException ex) {
-            Log.e(TAG, "Illegal Argument exception in do preview");
-            throw ex;
-        } catch (IllegalStateException ex) {
-            Log.e(TAG, "Illegal State exception in do preview");
-            throw ex;
-        } catch (RuntimeException ex) {
-            Log.e(TAG, "Runtime exception in do preview");
-            throw ex;
+        } catch (InterruptedException ex) {
+            Log.w(TAG, "The thread was interrupted", new Throwable());
+            throw new IllegalStateException("The thread was interrupted");
         } finally {
             if (semAcquireDone) {
                 mMANativeHelper.unlock();