Skip to content

Commit

Permalink
实现进度回调显示
Browse files Browse the repository at this point in the history
  • Loading branch information
lingyunxiao2 committed Mar 9, 2022
1 parent b83c9ee commit b830828
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 40 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.lingyunxiao.gifski;
package com.hzy.face.morphme.activity;

import android.util.Log;

Expand Down
70 changes: 51 additions & 19 deletions app/src/main/java/com/hzy/face/morphme/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,78 +14,110 @@ import androidx.core.content.ContextCompat
import com.hzy.face.morphme.R
import com.lingyunxiao.gifski.GifskiJniApi
import com.lingyunxiao.gifski.GifskiUtil.parseGifskiResult
import com.lingyunxiao.gifski.MLog
import com.lingyunxiao.gifski.ILogger
import com.lingyunxiao.gifski.InstanceKeeper
import com.lingyunxiao.gifski.ProgressCallback
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {
private val taskKey = 4234
private val frameCount = 317

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

if (allPermissionsGranted()) {
Thread(Runnable {
process()
setupGifski()
val result = process()
val resultStr = parseGifskiResult(result)
MLog.info(TAG, "finish result means:$resultStr")
Handler(Looper.getMainLooper()).post {
finish()
txv_result.text = "已完成:$resultStr"
btn_abort.visibility = View.GONE
// finish()
}
}).start()

findViewById<View>(R.id.btn_discard).setOnClickListener {
btn_abort.setOnClickListener {
GifskiJniApi.abort(taskKey)
}
} else {
getRuntimePermissions()
}
}

private fun process() {
Log.i("gifski", "start")
private fun setupGifski() {
InstanceKeeper.logger = object : ILogger {
override fun logit(msg: String) {
MLog.info(TAG, msg)
}

override fun logit(msg: String, arg: Boolean) {
MLog.info(TAG, msg, arg)
}

override fun logit(msg: String, arg: Int) {
MLog.info(TAG, msg, arg)
}
}
InstanceKeeper.progressCallback = ProgressCallback { frameNumber, taskKey ->
MLog.info(TAG, "received progress:$frameNumber $taskKey")
if (taskKey == this.taskKey) {
Handler(Looper.getMainLooper()).post {
txv_progress.text = String.format("处理进度:%.2f%%", (frameNumber / frameCount.toFloat()) * 100)
}
}
}
}

private fun process(): Int {
MLog.info(TAG, "start")
val targetWidth = 675
val targetHeight = 1200
val gifskiNativeObj = GifskiJniApi.gifskiNew(targetWidth, targetHeight, 90, false, true)
Log.i("gifski", "new instancePtr:$gifskiNativeObj")
if (gifskiNativeObj == 0L) return
MLog.info(TAG, "new instancePtr:$gifskiNativeObj")
if (gifskiNativeObj == 0L) return -1
try {
val filesDir = getExternalFilesDir(null)!!
val result = GifskiJniApi.startProcess(gifskiNativeObj, "$filesDir/4234_png/output.gif", taskKey)
Log.i("gifski", "result means:${parseGifskiResult(result)}")
MLog.info(TAG, "result means:${parseGifskiResult(result)}")
if (result == 0) pushFrameList(gifskiNativeObj, targetWidth, targetHeight)
} catch (e: Throwable) {
Log.e("gifski", "process error", e)
Log.e(TAG, "process error", e)
} finally {
val result = GifskiJniApi.finish(gifskiNativeObj)
Log.i("gifski", "finish result means:${parseGifskiResult(result)}")
MLog.info(TAG, "end")
return GifskiJniApi.finish(gifskiNativeObj)
}
Log.i("gifski", "end")
}

private fun pushFrameList(gifskiNativeObj: Long, targetWidth: Int, targetHeight: Int) {
val frameList = mutableListOf<String>()
val filesDir = getExternalFilesDir(null)!!
for (index in 0..316) {
for (index in 0 until frameCount) {
val frameName = "${index.toString().padStart(6, '0')}.png"
frameList.add("$filesDir/4234_png/$frameName")
}
Log.i("gifski", "frame size:${frameList.size}")
MLog.info(TAG, "frame size:${frameList.size}")
for ((index, frame) in frameList.withIndex()) {
// TODO : 测试半途放弃,看 gifski 内部的线程处理机制
// TODO : 实现半途放弃退出页面,确认 gifski 内部会 abort
val bitmap = BitmapFactory.decodeFile(frame)
val result = GifskiJniApi.addFrameRgba(gifskiNativeObj, bitmap, index, targetWidth, targetHeight, 5)
// val op = BitmapFactory.Options()
// op.inScaled = false
// op.inPreferredConfig = Bitmap.Config.ARGB_8888
// val bitmap = BitmapFactory.decodeFile(frame, op)
// Log.i("gifski", "rowBytes:${bitmap.rowBytes}")
// MLog.info(TAG, "rowBytes:${bitmap.rowBytes}")
// val result = GifskiJniApi.addFrameRgb(gifskiNativeObj, bitmap, index, targetWidth, targetHeight, bitmap.rowBytes, 5)
// val result = GifskiJniApi.addFrameARgb(gifskiNativeObj, bitmap, index, targetWidth, targetHeight, bitmap.rowBytes, 5)
if (result != 0) {
Log.i("gifski", "push frame result means:${parseGifskiResult(result)}")
MLog.info(TAG, "push frame result means:${parseGifskiResult(result)}")
return
}
}
Log.i("gifski", "done to push ${frameList.size} frames")
MLog.info(TAG, "done to push ${frameList.size} frames")
}

private fun getRequiredPermissions(): Array<String?> {
Expand Down
16 changes: 13 additions & 3 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,27 @@
android:gravity="center">

<TextView
android:id="@+id/txv_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"
android:textSize="20sp"/>
android:textColor="@color/cardview_dark_background"
android:textSize="18sp"/>

<Button
android:id="@+id/btn_discard"
android:id="@+id/btn_abort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="discard"
android:text="abort"
android:textSize="20sp"
android:layout_marginTop="10dp"/>

<TextView
android:id="@+id/txv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimaryDark"
android:textSize="16sp"
android:layout_marginTop="10dp"/>

</LinearLayout>
2 changes: 1 addition & 1 deletion gifski/src/main/cpp/gifski/GifskiJniApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ JNI_FUNC(startProcess)(JNIEnv *env, jclass type,
logStrI(env, "start process task key:%s", taskKey);
struct ProgressCallback {
static int onFrameWrited(int user_data, int ordinal_frame_number) {
// TODO : 如何实现进度回调呢??
auto env = GetJniEnv();
logStr(env, "frame writed:%d taskKey:%d userKey:%d", ordinal_frame_number, taskKey, user_data);
progressCallback(env, ordinal_frame_number, user_data);
return user_data == taskKey ? 1 : 0;
}
};
Expand Down
28 changes: 17 additions & 11 deletions gifski/src/main/cpp/gifski/GifskiUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,34 @@
#define JNI_CLASS "com/lingyunxiao/gifski/GifskiJniApi"
#define METHOD_NAME "logit"

jclass loggerClass;
jclass jniApiClass;

void *serveLoggerClass(JNIEnv *env) {
jclass jniClass = env->FindClass(JNI_CLASS);
loggerClass = (jclass) (env->NewGlobalRef(jniClass));
jniApiClass = (jclass) (env->NewGlobalRef(jniClass));
env->DeleteLocalRef(jniClass);
return nullptr;
}

void *releaseLoggerClass(JNIEnv *env) {
if (loggerClass != nullptr) {
env->DeleteGlobalRef(loggerClass);
loggerClass = nullptr;
if (jniApiClass != nullptr) {
env->DeleteGlobalRef(jniApiClass);
jniApiClass = nullptr;
}
return nullptr;
}

void *logStrB(JNIEnv *env, const char *log, bool barg) {
jmethodID mLogit = env->GetStaticMethodID(loggerClass, METHOD_NAME, "(Ljava/lang/String;Z)V");
jmethodID mLogit = env->GetStaticMethodID(jniApiClass, METHOD_NAME, "(Ljava/lang/String;Z)V");
jstring jlog = env->NewStringUTF(log);
env->CallStaticVoidMethod(loggerClass, mLogit, jlog, barg);
env->CallStaticVoidMethod(jniApiClass, mLogit, jlog, barg);
return nullptr;
}

void *logStrI(JNIEnv *env, const char *log, int iarg) {
jmethodID mLogit = env->GetStaticMethodID(loggerClass, METHOD_NAME, "(Ljava/lang/String;I)V");
jmethodID mLogit = env->GetStaticMethodID(jniApiClass, METHOD_NAME, "(Ljava/lang/String;I)V");
jstring jlog = env->NewStringUTF(log);
env->CallStaticVoidMethod(loggerClass, mLogit, jlog, iarg);
env->CallStaticVoidMethod(jniApiClass, mLogit, jlog, iarg);
return nullptr;
}

Expand All @@ -41,9 +41,15 @@ void *logStr(JNIEnv *env, const char *format, ...) {
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
jmethodID mLogit = env->GetStaticMethodID(loggerClass, METHOD_NAME, "(Ljava/lang/String;)V");
jmethodID mLogit = env->GetStaticMethodID(jniApiClass, METHOD_NAME, "(Ljava/lang/String;)V");
jstring jlog = env->NewStringUTF(buffer);
env->CallStaticVoidMethod(loggerClass, mLogit, jlog);
env->CallStaticVoidMethod(jniApiClass, mLogit, jlog);
return nullptr;
}

void *progressCallback(JNIEnv *env, int frameNumber, int taskKey) {
jmethodID cb = env->GetStaticMethodID(jniApiClass, "onFrameWrited", "(II)V");
env->CallStaticVoidMethod(jniApiClass, cb, frameNumber, taskKey);
return nullptr;
}

Expand Down
2 changes: 2 additions & 0 deletions gifski/src/main/cpp/gifski/GifskiUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ void *logStrB(JNIEnv *env, const char *log, bool barg);
void *logStrI(JNIEnv *env, const char *log, int iarg);
void *logStr(JNIEnv *env, const char *format, ...);

void *progressCallback(JNIEnv *env, int frameNumber, int taskKey);

/**
* lock android bitmap and return data and write info
* @param env
Expand Down
14 changes: 9 additions & 5 deletions gifski/src/main/java/com/lingyunxiao/gifski/GifskiJniApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,19 @@ public static native int addFrameRgba(
System.loadLibrary("gifskiad");
}

public static void onFrameWrited(int frameNumber, int taskKey) {
InstanceKeeper.progressCallback.onFrameWrited(frameNumber, taskKey);
}

public static void logit(String msg) {
MLog.info("gifski", msg);
InstanceKeeper.logger.logit(msg);
}

public static void logit(String msg, boolean barg) {
MLog.info("gifski", msg, barg);
public static void logit(String msg, boolean arg) {
InstanceKeeper.logger.logit(msg, arg);
}

public static void logit(String msg, int argi) {
MLog.info("gifski", msg, argi);
public static void logit(String msg, int arg) {
InstanceKeeper.logger.logit(msg, arg);
}
}
9 changes: 9 additions & 0 deletions gifski/src/main/java/com/lingyunxiao/gifski/ILogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.lingyunxiao.gifski;

public interface ILogger {
void logit(String msg);

void logit(String msg, boolean arg);

void logit(String msg, int arg);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.lingyunxiao.gifski;

public class InstanceKeeper {
public static ILogger logger;
public static ProgressCallback progressCallback;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.lingyunxiao.gifski;

public interface ProgressCallback {
/**
* @param frameNumber start from 1
*/
void onFrameWrited(int frameNumber, int taskKey);
}

0 comments on commit b830828

Please sign in to comment.