summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dharmaray Kundargi <dharmaray@google.com> 2011-02-02 16:20:56 -0800
committer Android Git Automerger <android-git-automerger@android.com> 2011-02-02 16:20:56 -0800
commit2d0010674aa5fc30ba48b83e8a9c035fdf38cfaf (patch)
tree056f016ff457a300a9fceece431d05f1e0afef48
parentf5ff8b49360a615eaadd09f0b495247228060538 (diff)
parent3d3621f08b02ae559036c7d085c02276ae0a24d9 (diff)
am 3d3621f0: am 54b0a7f3: Merge "Fix issue 3412777 ANR on adding effects." into honeycomb
* commit '3d3621f08b02ae559036c7d085c02276ae0a24d9': Fix issue 3412777 ANR on adding effects.
-rw-r--r--media/java/android/media/videoeditor/MediaArtistNativeHelper.java29
-rwxr-xr-xmedia/java/android/media/videoeditor/VideoEditorImpl.java32
2 files changed, 43 insertions, 18 deletions
diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
index b9105cbf9569..297c4dfdf8f7 100644
--- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
+++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java
@@ -23,6 +23,7 @@ import java.nio.IntBuffer;
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 @@ class MediaArtistNativeHelper {
Log.e(TAG, "Runtime exception in nativeStartPreview");
throw ex;
}
+ } else {
+ throw new IllegalStateException("generatePreview is in progress");
}
}
@@ -3085,7 +3088,10 @@ class MediaArtistNativeHelper {
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 @@ class MediaArtistNativeHelper {
}
/**
+ * 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 7608c059a4ab..27ab799416bd 100755
--- a/media/java/android/media/videoeditor/VideoEditorImpl.java
+++ b/media/java/android/media/videoeditor/VideoEditorImpl.java
@@ -112,6 +112,7 @@ public class VideoEditorImpl implements VideoEditor {
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 @@ public class VideoEditorImpl implements VideoEditor {
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 @@ public class VideoEditorImpl implements VideoEditor {
} 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 @@ public class VideoEditorImpl implements VideoEditor {
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 @@ public class VideoEditorImpl implements VideoEditor {
/**
* 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();