Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54b0a7f3 authored by Dharmaray Kundargi's avatar Dharmaray Kundargi Committed by Android (Google) Code Review
Browse files

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

parents 8257e4d7 a3f87f85
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -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
     */
+15 −17
Original line number Diff line number Diff line
@@ -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();
@@ -863,7 +866,8 @@ public class VideoEditorImpl implements VideoEditor {
                result = 0;
            }
        } catch (InterruptedException ex) {
            Log.e(TAG, "Sem acquire NOT successful in renderPreviewFrame");
            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,
@@ -1596,16 +1602,8 @@ 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;
            Log.w(TAG, "The thread was interrupted", new Throwable());
            throw new IllegalStateException("The thread was interrupted");
        } finally {
            if (semAcquireDone) {
                mMANativeHelper.unlock();