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

Commit 9c265fcc authored by Gil Dobjanschi's avatar Gil Dobjanschi Committed by Android (Google) Code Review
Browse files

Merge "VideoEditor:Clear Surface API addition" into honeycomb

parents 582a3944 05d9f81b
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -3940,6 +3940,9 @@ class MediaArtistNativeHelper {
        }
    }

    public void clearPreviewSurface(Surface surface, int width, int height) {
       nativeClearSurface(surface,width,height);
    }
    /**     Native Methods        */

    public native Properties getMediaProperties(String file) throws IllegalArgumentException,
@@ -3983,7 +3986,10 @@ class MediaArtistNativeHelper {
     */
    public native void release() throws IllegalStateException, RuntimeException;


    /*
     * Clear the preview surface
     */
    public native void nativeClearSurface(Surface surface, int width, int height);


    /**
+9 −0
Original line number Diff line number Diff line
@@ -572,4 +572,13 @@ public interface VideoEditor {
     *        milliseconds
     */
    public long stopPreview();

    /**
     * Clears the preview surface
     *
     * @param surfaceHolder SurfaceHolder where the preview is rendered
     * and needs to be cleared.
     */
    public void clearSurface(SurfaceHolder surfaceHolder);

}
+28 −0
Original line number Diff line number Diff line
@@ -1816,4 +1816,32 @@ public class VideoEditorImpl implements VideoEditor {
            }
        }
    }

    /**
     * Clears the preview surface
     *
     * @param surfaceHolder SurfaceHolder where the preview is rendered
     * and needs to be cleared.
     */
    public void clearSurface(SurfaceHolder surfaceHolder) {

      if (surfaceHolder == null) {
         throw new IllegalArgumentException();
       }
      Rect frame;
      int surfaceWidth;
      int surfaceHeight;
      Surface surface = surfaceHolder.getSurface();

      if (surface == null) {
        Log.e("VideoEditorImpl",
        "Surface could not be retrieved from surface holder");
        throw new RuntimeException();
      }
      frame = surfaceHolder.getSurfaceFrame();
      surfaceWidth = frame.width();
      surfaceHeight = frame.height();
      mMANativeHelper.clearPreviewSurface(surface,surfaceWidth,surfaceHeight);
    }

}
+136 −1
Original line number Diff line number Diff line
@@ -259,6 +259,11 @@ videoEditor_generateClip(
                jobject                             thiz,
                jobject                             settings);

static void videoEditor_clearSurface(JNIEnv* pEnv,
                                    jobject thiz,
                                    jobject surface,
                                    jint width,
                                    jint height);

static JNINativeMethod gManualEditMethods[] = {
    {"getVersion",               "()L"VERSION_CLASS_NAME";",
@@ -295,6 +300,8 @@ static JNINativeMethod gManualEditMethods[] = {
                                (int *)videoEditor_generateAudioRawFile      },
    {"nativeGenerateClip",      "(L"EDIT_SETTINGS_CLASS_NAME";)I",
                                (void *)videoEditor_generateClip  },
    {"nativeClearSurface",       "(Landroid/view/Surface;II)V",
                                (void *)videoEditor_clearSurface  },
};

// temp file name of VSS out file
@@ -419,6 +426,134 @@ static void videoEditor_stopPreview(JNIEnv* pEnv,
    pContext->mPreviewController->stopPreview();
}

static void videoEditor_clearSurface(JNIEnv* pEnv,
                                    jobject thiz,
                                    jobject surface,
                                    jint width,
                                    jint height)
{
    bool needToBeLoaded = true;
    M4OSA_UInt32 framesizeYuv =0;
    M4OSA_ERR result = M4NO_ERROR;
    VideoEditor_renderPreviewFrameStr frameStr;
    const char* pMessage = NULL;
    M4VIFI_ImagePlane *yuvPlane;
    ManualEditContext* pContext = M4OSA_NULL;

    // Get the context.
    pContext = (ManualEditContext*)videoEditClasses_getContext(&needToBeLoaded, pEnv, thiz);
    VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO,
                                "VIDEO_EDITOR","pContext = 0x%x",pContext);

    // Make sure that the context was set.
    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
                                             (M4OSA_NULL == pContext),
                                             "not initialized");

    // Make sure that the context was set.
    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
                                 (M4OSA_NULL == pContext->mPreviewController),
                                 "not initialized");

    // Validate the surface parameter.
    videoEditJava_checkAndThrowIllegalArgumentException(&needToBeLoaded, pEnv,
                                                (NULL == surface),
                                                "surface is null");

    jclass surfaceClass = pEnv->FindClass("android/view/Surface");
    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
                                             (M4OSA_NULL == surfaceClass),
                                             "not initialized");

    jfieldID surface_native =
            pEnv->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I");
    videoEditJava_checkAndThrowIllegalStateException(&needToBeLoaded, pEnv,
                                             (M4OSA_NULL == surface_native),
                                             "not initialized");

    Surface* const p = (Surface*)pEnv->GetIntField(surface, surface_native);
    sp<Surface> previewSurface = sp<Surface>(p);

    /**
    * Allocate output YUV planes
    */
    yuvPlane = (M4VIFI_ImagePlane*)M4OSA_malloc(3*sizeof(M4VIFI_ImagePlane), M4VS,
        (M4OSA_Char*)"videoEditor_clearSurface Output plane YUV");
    if (yuvPlane == M4OSA_NULL) {
        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
            "videoEditor_clearSurface() malloc error for yuv plane");
        pMessage = videoEditJava_getErrorName(M4ERR_ALLOC);
        jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
        return ;
    }

    framesizeYuv = width * height * 1.5;
    yuvPlane[0].u_width = width;
    yuvPlane[0].u_height = height;
    yuvPlane[0].u_topleft = 0;
    yuvPlane[0].u_stride = width;
    yuvPlane[0].pac_data = (M4VIFI_UInt8 *)M4OSA_malloc(framesizeYuv, M4VS,
            (M4OSA_Char*)"videoEditor pixelArray");
    if (yuvPlane[0].pac_data == M4OSA_NULL) {
       VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR",
       "videoEditor_renderPreviewFrame() malloc error");
       pMessage = videoEditJava_getErrorName(M4ERR_ALLOC);
       jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
       return;
    }

    /* memset yuvPlane[0].pac_data with 0 for black frame */
    M4OSA_memset((M4OSA_MemAddr8)yuvPlane[0].pac_data,framesizeYuv,0x00);
    FILE *p1 = fopen("/mnt/sdcard/black.raw","wb");
    fwrite(yuvPlane[0].pac_data,1,framesizeYuv,p1);
    fclose(p1);

    yuvPlane[1].u_width = width>>1;
    yuvPlane[1].u_height = height>>1;
    yuvPlane[1].u_topleft = 0;
    yuvPlane[1].u_stride = width>>1;
    yuvPlane[1].pac_data = yuvPlane[0].pac_data
                + yuvPlane[0].u_width * yuvPlane[0].u_height;

    M4OSA_memset((M4OSA_MemAddr8)yuvPlane[1].pac_data,yuvPlane[1].u_width *
                                yuvPlane[1].u_height,128);
    yuvPlane[2].u_width = (width)>>1;
    yuvPlane[2].u_height = (height)>>1;
    yuvPlane[2].u_topleft = 0;
    yuvPlane[2].u_stride = (width)>>1;
    yuvPlane[2].pac_data = yuvPlane[1].pac_data
                + yuvPlane[1].u_width * yuvPlane[1].u_height;

    M4OSA_memset((M4OSA_MemAddr8)yuvPlane[2].pac_data,yuvPlane[2].u_width *
                                 yuvPlane[2].u_height,128);

    /* Fill up the render structure*/
    frameStr.pBuffer = (M4OSA_Void*)yuvPlane[0].pac_data;

    frameStr.timeMs = 0;
    frameStr.uiSurfaceWidth = width;
    frameStr.uiSurfaceHeight = height;
    frameStr.uiFrameWidth = width;
    frameStr.uiFrameHeight = height;
    frameStr.bApplyEffect = M4OSA_FALSE;
    frameStr.clipBeginCutTime = 0;
    frameStr.clipEndCutTime = 0;

    /*pContext->mPreviewController->setPreviewFrameRenderingMode(
        pContext->pEditSettings->\
        pClipList[iCurrentClipIndex]->xVSS.MediaRendering,
        pContext->pEditSettings->xVSS.outputVideoSize);
     */

    result = pContext->mPreviewController->renderPreviewFrame(previewSurface,
                                                              &frameStr);
    videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv,
            (M4NO_ERROR != result), result);

    M4OSA_free((M4OSA_MemAddr32)yuvPlane[0].pac_data);
    M4OSA_free((M4OSA_MemAddr32)yuvPlane);
  }

static int videoEditor_renderPreviewFrame(JNIEnv* pEnv,
                                    jobject thiz,
                                    jobject    mSurface,