From 0a6c06e1a5b1a7e20bddf89a42c0a112fd3875ca Mon Sep 17 00:00:00 2001 From: lambiengcode Date: Tue, 28 May 2024 22:34:28 +0700 Subject: [PATCH] update . --- .../com/pixpark/GPUPixelApp/MainActivity.java | 3 +- .../java/com/pixpark/gpupixel/GPUPixel.java | 9 ++- .../com/pixpark/gpupixel/GPUPixelSource.java | 4 +- .../gpupixel/GPUPixelSourceCamera.java | 12 ++++ src/android/jni/jni_gpupixel.cc | 64 +++++++++++++++---- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/src/android/java/app/src/main/java/com/pixpark/GPUPixelApp/MainActivity.java b/src/android/java/app/src/main/java/com/pixpark/GPUPixelApp/MainActivity.java index 2924747..8e0e869 100644 --- a/src/android/java/app/src/main/java/com/pixpark/GPUPixelApp/MainActivity.java +++ b/src/android/java/app/src/main/java/com/pixpark/GPUPixelApp/MainActivity.java @@ -13,7 +13,6 @@ import android.util.Log; import android.view.SurfaceHolder; import android.view.WindowManager; -import android.widget.SeekBar; import android.widget.Toast; import com.pixpark.GPUPixelApp.databinding.ActivityMainBinding; @@ -168,7 +167,7 @@ public void startCameraFilter() { sourceCamera.addTarget(lipstickFilter); lipstickFilter.addTarget(faceReshapFilter); faceReshapFilter.addTarget(beautyFaceFilter); - beautyFaceFilter.addTargetCallback(); +// beautyFaceFilter.addTargetCallback(); sourceCamera.setLandmarkCallbck(new GPUPixel.GPUPixelLandmarkCallback() { @Override diff --git a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixel.java b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixel.java index 507699e..2ab188d 100755 --- a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixel.java +++ b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixel.java @@ -24,6 +24,11 @@ public class GPUPixel { public interface GPUPixelLandmarkCallback { public void onFaceLandmark(float[] landmarks); } + + public interface RawOutputCallback { + public void onRawOutput(byte[] data, int width, int height, int ts); + } + public static final int NoRotation = 0; public static final int RotateLeft = 1; public static final int RotateRight = 2; @@ -227,7 +232,7 @@ public static void copyAssetsToFiles(Context context, String oldPath, String ne public static native void nativeSourceCameraDestroy(final long classID); public static native void nativeSourceCameraFinalize(final long classID); public static native void nativeSourceCameraSetFrame(final long classID, final int width, final int height, final int[] data, final int rotation); - + public static native void nativeSourceCameraSetFrameByBuffer(final long classId, final int width, final int height, final ByteBuffer buffer, final int rotation); // SourceRawDataInput public static native long nativeSourceRawInputNew(); public static native void nativeSourceRawInputUploadBytes(final long classID, final int[] pixel, final int width, final int height, final int stride); @@ -238,7 +243,7 @@ public static void copyAssetsToFiles(Context context, String oldPath, String ne // Source public static native long nativeSourceAddFilter(final long targetClassId); public static native long nativeSourceAddTarget(final long classID, final long targetClassID, final int texID, final boolean isFilter); - public static native long nativeSourceAddTargetOutputCallback(final long classId); + public static native long nativeSourceAddTargetOutputCallback(final long classId, final RawOutputCallback callback); public static native void nativeSourceRemoveTarget(final long classID, final long targetClassID, final boolean isFilter); public static native void nativeSourceRemoveAllTargets(final long classID); public static native boolean nativeSourceProceed(final long classID, final boolean bUpdateTargets); diff --git a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSource.java b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSource.java index 2c02a1f..9dcdd36 100755 --- a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSource.java +++ b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSource.java @@ -24,11 +24,11 @@ public GPUPixelSource addTarget(GPUPixelTarget target) { return addTarget(target, -1); } - public void addTargetCallback() { + public void addTargetCallback(final GPUPixel.RawOutputCallback callback) { GPUPixel.getInstance().runOnDraw(new Runnable() { @Override public void run() { - GPUPixel.nativeSourceAddTargetOutputCallback(mNativeClassID); + GPUPixel.nativeSourceAddTargetOutputCallback(mNativeClassID, callback); } }); } diff --git a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSourceCamera.java b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSourceCamera.java index 87cacb1..02df636 100755 --- a/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSourceCamera.java +++ b/src/android/java/gpupixel/src/main/java/com/pixpark/gpupixel/GPUPixelSourceCamera.java @@ -18,6 +18,7 @@ import android.view.SurfaceHolder; import android.view.WindowManager; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.IntBuffer; public class GPUPixelSourceCamera extends GPUPixelSource implements Camera.PreviewCallback { @@ -73,6 +74,17 @@ public void run() { proceed(true, true); } + public void setFrameByBuffer(final ByteBuffer buffer, final int width, final int height) { + GPUPixel.getInstance().runOnDraw(new Runnable() { + @Override + public void run() { + GPUPixel.nativeSourceCameraSetFrameByBuffer(mNativeClassID, width, height, buffer, GPUPixel.NoRotation); + } + }); + + proceed(true, true); + } + @Override public void onPreviewFrame(final byte[] data, Camera camera) { final Camera.Size previewSize = camera.getParameters().getPreviewSize(); diff --git a/src/android/jni/jni_gpupixel.cc b/src/android/jni/jni_gpupixel.cc index 3b9123e..59bbb23 100755 --- a/src/android/jni/jni_gpupixel.cc +++ b/src/android/jni/jni_gpupixel.cc @@ -91,6 +91,24 @@ extern "C" void Java_com_pixpark_gpupixel_GPUPixel_nativeSourceCameraSetFrame( env->ReleaseIntArrayElements(jdata, data, 0); }; +extern "C" void Java_com_pixpark_gpupixel_GPUPixel_nativeSourceCameraSetFrameByBuffer( + JNIEnv* env, + jclass, + jlong classId, + jint width, + jint height, + jobject buffer, + jint rotation) { + // Get the pointer to the ByteBuffer data + void* pixels = env->GetDirectBufferAddress(buffer); + if (pixels == nullptr) { + // Handle error: Direct buffer address could not be obtained + return; + } + ((SourceCamera*)classId) + ->setFrameData(width, height, pixels, (RotationMode)rotation); +}; + extern "C" jlong Java_com_pixpark_gpupixel_GPUPixel_nativeSourceRawInputNew( JNIEnv* env, jclass) { @@ -189,22 +207,44 @@ extern "C" jlong Java_com_pixpark_gpupixel_GPUPixel_nativeSourceAddTarget( extern "C" jlong Java_com_pixpark_gpupixel_GPUPixel_nativeSourceAddTargetOutputCallback( JNIEnv* env, jclass, - jlong classId) { + jlong classId, + jobject src) { + + jobject globalSourceRef = env->NewGlobalRef(src); + + jclass cls = env->GetObjectClass(globalSourceRef); + jmethodID mid = env->GetMethodID(cls, "onRawOutput", "([BIII)V"); + + if (!mid) return 0; + Source* source = (Source*)classId; -// std::shared_ptr target = -// isFilter ? std::shared_ptr((Filter*)targetClassId) -// : std::shared_ptr((Target*)targetClassId); + std::shared_ptr target; std::shared_ptr output = TargetRawDataOutput::create(); - output->setPixelsCallbck([&](const uint8_t* data, int width, int height, int64_t ts) { - for (int i = 0; i < width * height; ++i) { - int a = data[i * 4 + 3]; // Alpha - int r = data[i * 4 + 0]; // Red - int g = data[i * 4 + 1]; // Green - int b = data[i * 4 + 2]; // Blue - __android_log_print(ANDROID_LOG_INFO, "OpenGL", "value: %d %d %d %d", a, r, g, b); - } + + JavaVM* jvm; + env->GetJavaVM(&jvm); + + output->setPixelsCallbck([=](const uint8_t* data, int width, int height, int64_t ts) { + size_t frame_size = width * height * 4; + + JNIEnv* myNewEnv; + JavaVMAttachArgs args; + args.version = JNI_VERSION_1_6; // choose your JNI version + args.name = NULL; // you might want to give the java thread a name + args.group = NULL; // you might want to assign the java thread to a ThreadGroup + jvm->AttachCurrentThread(reinterpret_cast((void **) &myNewEnv), &args); + + jbyte* by = (jbyte*)data; + + jbyteArray yArray = myNewEnv->NewByteArray(frame_size); + + myNewEnv->SetByteArrayRegion(yArray, 0, frame_size, by); + + myNewEnv->CallVoidMethod(globalSourceRef, mid, yArray, width, height, ts); + + myNewEnv->DeleteLocalRef(yArray); }); target = output;