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

Commit a3f87f85 authored by Dharmaray Kundargi's avatar Dharmaray Kundargi
Browse files

Fix issue 3412777 ANR on adding effects.

Change-Id: Id3c480a8261423412a99375f71cf6ee585b6c22b
parent 261ddb81
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();