Skip to content

Commit cef16c6

Browse files
committed
add speed/effort parameter
1 parent 7089cdc commit cef16c6

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

avif-coder/src/main/cpp/JniEncoder.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct heif_error writeHeifData(struct heif_context *ctx,
7979

8080
jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
8181
jobject bitmap, heif_compression_format heifCompressionFormat,
82-
const int quality, const int dataSpace, const AvifQualityMode qualityMode) {
82+
const int quality, const int speed, const int dataSpace, const AvifQualityMode qualityMode) {
8383
std::shared_ptr<heif_context> ctx(heif_context_alloc(),
8484
[](heif_context *c) { heif_context_free(c); });
8585
if (!ctx) {
@@ -114,6 +114,15 @@ jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
114114
throwException(env, str);
115115
return static_cast<jbyteArray>(nullptr);
116116
}
117+
if(speed > 0 && speed < 20){
118+
result = heif_encoder_set_parameter_string(encoder.get(), "speed", speed)
119+
if (result.code != heif_error_Ok) {
120+
std::string choke(result.message);
121+
std::string str = "Can't set speed/effort: " + choke;
122+
throwException(env, str);
123+
return static_cast<jbyteArray>(nullptr);
124+
}
125+
}
117126
}
118127
} else if (qualityMode == AVIF_LOSELESS_MODE) {
119128
result = heif_encoder_set_lossless(encoder.get(), true);
@@ -331,14 +340,15 @@ jbyteArray encodeBitmap(JNIEnv *env, jobject thiz,
331340
extern "C"
332341
JNIEXPORT jbyteArray JNICALL
333342
Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_encodeAvifImpl(JNIEnv *env, jobject thiz,
334-
jobject bitmap, jint quality,
343+
jobject bitmap, jint quality, jint speed,
335344
jint dataSpace, jint qualityMode) {
336345
try {
337346
return encodeBitmap(env,
338347
thiz,
339348
bitmap,
340349
heif_compression_AV1,
341350
quality,
351+
speed,
342352
dataSpace,
343353
static_cast<AvifQualityMode>(qualityMode));
344354
} catch (std::bad_alloc &err) {
@@ -351,14 +361,15 @@ Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_encodeAvifImpl(JNIEnv *env, job
351361
extern "C"
352362
JNIEXPORT jbyteArray JNICALL
353363
Java_com_radzivon_bartoshyk_avif_coder_HeifCoder_encodeHeicImpl(JNIEnv *env, jobject thiz,
354-
jobject bitmap, jint quality,
364+
jobject bitmap, jint quality, jint speed,
355365
jint dataSpace, jint qualityMode) {
356366
try {
357367
return encodeBitmap(env,
358368
thiz,
359369
bitmap,
360370
heif_compression_HEVC,
361371
quality,
372+
speed,
362373
dataSpace,
363374
static_cast<AvifQualityMode>(qualityMode));
364375
} catch (std::bad_alloc &err) {

avif-coder/src/main/java/com/radzivon/bartoshyk/avif/coder/HeifCoder.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,25 +116,25 @@ class HeifCoder(
116116
)
117117
}
118118

119-
fun encodeAvif(bitmap: Bitmap, quality: Int = 80, preciseMode: PreciseMode = PreciseMode.LOSSY): ByteArray {
119+
fun encodeAvif(bitmap: Bitmap, quality: Int = 80, speed: Int = 0, preciseMode: PreciseMode = PreciseMode.LOSSY): ByteArray {
120120
require(quality in 0..100) {
121121
throw IllegalStateException("Quality should be in 0..100 range")
122122
}
123123
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
124-
encodeAvifImpl(bitmap, quality, bitmap.colorSpace?.dataSpace ?: -1, preciseMode.value)
124+
encodeAvifImpl(bitmap, quality, speed, bitmap.colorSpace?.dataSpace ?: -1, preciseMode.value)
125125
} else {
126-
encodeAvifImpl(bitmap, quality, -1, preciseMode.value)
126+
encodeAvifImpl(bitmap, quality, speed, -1, preciseMode.value)
127127
}
128128
}
129129

130-
fun encodeHeic(bitmap: Bitmap, quality: Int = 80, preciseMode: PreciseMode = PreciseMode.LOSSY): ByteArray {
130+
fun encodeHeic(bitmap: Bitmap, quality: Int = 80, speed: Int = 0, preciseMode: PreciseMode = PreciseMode.LOSSY): ByteArray {
131131
require(quality in 0..100) {
132132
throw IllegalStateException("Quality should be in 0..100 range")
133133
}
134134
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
135-
encodeHeicImpl(bitmap, quality, bitmap.colorSpace?.dataSpace ?: -1, preciseMode.value)
135+
encodeHeicImpl(bitmap, quality, speed, bitmap.colorSpace?.dataSpace ?: -1, preciseMode.value)
136136
} else {
137-
encodeHeicImpl(bitmap, quality, -1, preciseMode.value)
137+
encodeHeicImpl(bitmap, quality, speed, -1, preciseMode.value)
138138
}
139139
}
140140

@@ -163,8 +163,8 @@ class HeifCoder(
163163
toneMapper: Int,
164164
): Bitmap
165165

166-
private external fun encodeAvifImpl(bitmap: Bitmap, quality: Int, dataSpace: Int, qualityMode: Int): ByteArray
167-
private external fun encodeHeicImpl(bitmap: Bitmap, quality: Int, dataSpace: Int, qualityMode: Int): ByteArray
166+
private external fun encodeAvifImpl(bitmap: Bitmap, quality: Int, speed: Int, dataSpace: Int, qualityMode: Int): ByteArray
167+
private external fun encodeHeicImpl(bitmap: Bitmap, quality: Int, speed: Int, dataSpace: Int, qualityMode: Int): ByteArray
168168

169169
@SuppressLint("ObsoleteSdkInt")
170170
companion object {

0 commit comments

Comments
 (0)