Merge "Fix issue 3412777 ANR on adding effects." into honeycomb

This commit is contained in:
Dharmaray Kundargi
2011-02-02 13:56:49 -08:00
committed by Android (Google) Code Review
2 changed files with 43 additions and 18 deletions

View File

@@ -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;
@@ -3912,6 +3918,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
*/

View File

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