Add EXIF support to JPEG/R Java encoding API
Bug: b/299202809
Test: YuvImageTest.java
Change-Id: If1aa9598f75062e7d0684d5d0f4b60f1e4a19f4d
diff --git a/libs/hwui/jni/YuvToJpegEncoder.cpp b/libs/hwui/jni/YuvToJpegEncoder.cpp
index 4dbfa88..8c5cc30 100644
--- a/libs/hwui/jni/YuvToJpegEncoder.cpp
+++ b/libs/hwui/jni/YuvToJpegEncoder.cpp
@@ -332,7 +332,7 @@
bool P010Yuv420ToJpegREncoder::encode(JNIEnv* env,
SkWStream* stream, void* hdr, int hdrColorSpace, void* sdr, int sdrColorSpace,
- int width, int height, int jpegQuality) {
+ int width, int height, int jpegQuality, ScopedByteArrayRO* jExif) {
// Check SDR color space. Now we only support SRGB transfer function
if ((sdrColorSpace & ADataSpace::TRANSFER_MASK) != ADataSpace::TRANSFER_SRGB) {
jclass IllegalArgumentException = env->FindClass("java/lang/IllegalArgumentException");
@@ -365,6 +365,10 @@
yuv420.height = height;
yuv420.colorGamut = sdrColorGamut;
+ jpegr_exif_struct exif;
+ exif.data = const_cast<void*>(reinterpret_cast<const void*>(jExif->get()));
+ exif.length = jExif->size();
+
jpegr_compressed_struct jpegR;
jpegR.maxLength = width * height * sizeof(uint8_t);
@@ -373,7 +377,8 @@
if (int success = jpegREncoder.encodeJPEGR(&p010, &yuv420,
hdrTransferFunction,
- &jpegR, jpegQuality, nullptr); success != android::OK) {
+ &jpegR, jpegQuality,
+ exif.length > 0 ? &exif : NULL); success != android::OK) {
ALOGW("Encode JPEG/R failed, error code: %d.", success);
return false;
}
@@ -415,15 +420,17 @@
static jboolean YuvImage_compressToJpegR(JNIEnv* env, jobject, jbyteArray inHdr,
jint hdrColorSpace, jbyteArray inSdr, jint sdrColorSpace,
jint width, jint height, jint quality, jobject jstream,
- jbyteArray jstorage) {
+ jbyteArray jstorage, jbyteArray jExif) {
jbyte* hdr = env->GetByteArrayElements(inHdr, NULL);
jbyte* sdr = env->GetByteArrayElements(inSdr, NULL);
+ ScopedByteArrayRO exif(env, jExif);
+
SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage);
P010Yuv420ToJpegREncoder encoder;
jboolean result = JNI_FALSE;
if (encoder.encode(env, strm, hdr, hdrColorSpace, sdr, sdrColorSpace,
- width, height, quality)) {
+ width, height, quality, &exif)) {
result = JNI_TRUE;
}
@@ -437,7 +444,7 @@
static const JNINativeMethod gYuvImageMethods[] = {
{ "nativeCompressToJpeg", "([BIII[I[IILjava/io/OutputStream;[B)Z",
(void*)YuvImage_compressToJpeg },
- { "nativeCompressToJpegR", "([BI[BIIIILjava/io/OutputStream;[B)Z",
+ { "nativeCompressToJpegR", "([BI[BIIIILjava/io/OutputStream;[B[B)Z",
(void*)YuvImage_compressToJpegR }
};