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();