summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphaƫl Moll <raphael@google.com>2023-09-26 00:31:26 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-09-26 00:31:26 +0000
commit89cb18f549cff18c5aca68afdc382d122adf309f (patch)
tree558a892e3a07b735cdb4387c74c88074e4232087
parent58648a2773457c7b33593b0f3917d51be90fc265 (diff)
parent2e864a926a870268de84a86b79d48f388444f8e0 (diff)
downloadbase-89cb18f549cff18c5aca68afdc382d122adf309f.tar.gz
Merge "Add support for ImageReader in RNG." into android12-hostruntime-dev
-rw-r--r--core/jni/Android.bp14
-rw-r--r--core/jni/RobolectricNativeRuntime.cpp2
-rw-r--r--media/jni/Android.bp8
-rw-r--r--media/jni/android_media_ImageReader.cpp59
-rw-r--r--media/jni/android_media_Utils.cpp8
5 files changed, 91 insertions, 0 deletions
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 6c15945f08f1..b63235d30901 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -317,6 +317,12 @@ cc_library_shared {
cflags: [
"-Wno-unused-const-variable",
"-Wno-unused-function",
+ "-DLOG_ALWAYS_FATAL_IF(cond, ...)=if(cond) LOG_ALWAYS_FATAL(...)",
+ "-DLOG_ALWAYS_FATAL(...)=__android_log_call_aborter(\"Fatal Error\")",
+ // Use all declarations in native_window.h in Layoutlib
+ "-D__INTRODUCED_IN(n)=",
+ "-D__ANDROID_API__=10000",
+ "-D__HOST_JVM__",
],
srcs: [
"LayoutlibLoader.cpp",
@@ -410,6 +416,12 @@ cc_library_shared {
},
},
host: {
+ cflags: [
+ "-Wno-unused-const-variable",
+ "-Wno-unused-function",
+ // Declarations used in native_window.h
+ "-D__INTRODUCED_IN(n)=",
+ ],
srcs: [
"android_animation_PropertyValuesHolder.cpp",
"libcore_util_NativeAllocationRegistry.cpp",
@@ -422,6 +434,8 @@ cc_library_shared {
"com_android_internal_util_VirtualRefBasePtr.cpp",
"android_view_Surface.cpp",
"RobolectricNativeRuntime.cpp",
+ // Utilized to get rendered result pixels
+ ":libmedia_host_common",
],
static_libs: [
"libnativehelper",
diff --git a/core/jni/RobolectricNativeRuntime.cpp b/core/jni/RobolectricNativeRuntime.cpp
index b91d83881038..42cf75d68813 100644
--- a/core/jni/RobolectricNativeRuntime.cpp
+++ b/core/jni/RobolectricNativeRuntime.cpp
@@ -10,6 +10,7 @@
static JavaVM* javaVM;
extern int register_libcore_util_NativeAllocationRegistry(JNIEnv* env);
+extern int register_android_media_ImageReader(JNIEnv* env);
namespace android {
@@ -32,6 +33,7 @@ static const RegJNIRec sqliteJNI[] = {
static const RegJNIRec graphicsJNI[] = {
REG_JNI(register_android_animation_PropertyValuesHolder),
+ REG_JNI(register_android_media_ImageReader),
REG_JNI(register_android_view_Surface),
REG_JNI(register_com_android_internal_util_VirtualRefBasePtr),
REG_JNI(register_libcore_util_NativeAllocationRegistry),
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index bc73f6ad1ad2..cf94dd8dedf1 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -214,3 +214,11 @@ cc_library_shared {
"-Wunreachable-code",
],
}
+
+filegroup {
+ name: "libmedia_host_common",
+ srcs: [
+ "android_media_ImageReader.cpp",
+ "android_media_Utils.cpp",
+ ],
+}
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index 5174c0c04dbf..b9deafab588b 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -32,9 +32,17 @@
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_graphics_GraphicBuffer.h>
#include <android_runtime/android_hardware_HardwareBuffer.h>
+#ifdef __ANDROID__ // Layoutlib does not support Gr
#include <grallocusage/GrallocUsageConversion.h>
+#else
+#define GRALLOC_USAGE_PROTECTED 0
+#define GRALLOC_USAGE_SW_READ_OFTEN 0
+#define GRALLOC_USAGE_SW_WRITE_OFTEN 0
+#endif
+#ifdef __ANDROID__ // Layoutlib does not support hardware
#include <private/android/AHardwareBufferHelpers.h>
+#endif
#include <jni.h>
#include <nativehelper/JNIHelp.h>
@@ -395,7 +403,11 @@ static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, jint w
width, height, format, maxImages, getpid(),
createProcessUniqueId());
uint64_t consumerUsage =
+#ifdef __ANDROID__ // Layoutlib does not support hardware
android_hardware_HardwareBuffer_convertToGrallocUsageBits(ndkUsage);
+#else
+ 0;
+#endif
bufferConsumer = new BufferItemConsumer(gbConsumer, consumerUsage, maxImages,
/*controlledByApp*/true);
@@ -746,6 +758,7 @@ static bool Image_getLockedImageInfo(JNIEnv* env, LockedImage* buffer, int idx,
return true;
}
+#ifdef __ANDROID__
static void ImageReader_unlockGraphicBuffer(JNIEnv* env, jobject /*thiz*/,
jobject buffer) {
sp<GraphicBuffer> graphicBuffer =
@@ -828,6 +841,7 @@ static jobjectArray ImageReader_createImagePlanes(JNIEnv* env, jobject /*thiz*/,
return imagePlanes;
}
+#endif
static jobjectArray Image_createSurfacePlanes(JNIEnv* env, jobject thiz,
int numPlanes, int readerFormat, uint64_t ndkReaderUsage)
@@ -901,6 +915,7 @@ static jint Image_getHeight(JNIEnv* env, jobject thiz)
return getBufferHeight(buffer);
}
+#ifdef __ANDROID__
static jint Image_getFenceFd(JNIEnv* env, jobject thiz)
{
BufferItem* buffer = Image_getBufferItem(env, thiz);
@@ -910,6 +925,7 @@ static jint Image_getFenceFd(JNIEnv* env, jobject thiz)
return -1;
}
+#endif
static jint Image_getFormat(JNIEnv* env, jobject thiz, jint readerFormat)
{
@@ -934,6 +950,7 @@ static jint Image_getFormat(JNIEnv* env, jobject thiz, jint readerFormat)
}
}
+#ifdef __ANDROID__ // Layoutlib does not support hardware
static jobject Image_getHardwareBuffer(JNIEnv* env, jobject thiz) {
BufferItem* buffer = Image_getBufferItem(env, thiz);
AHardwareBuffer* b = AHardwareBuffer_from_GraphicBuffer(buffer->mGraphicBuffer.get());
@@ -941,6 +958,29 @@ static jobject Image_getHardwareBuffer(JNIEnv* env, jobject thiz) {
// to link against libandroid.so
return android_hardware_HardwareBuffer_createFromAHardwareBuffer(env, b);
}
+#endif
+
+#ifndef __ANDROID__
+
+static jobjectArray Image_createSurfacePlanes_SurfaceImage(JNIEnv* env, jclass clazz, jobject image,
+ int numPlanes, int readerFormat,
+ uint64_t ndkReaderUsage) {
+ return Image_createSurfacePlanes(env, image, numPlanes, readerFormat, ndkReaderUsage);
+}
+
+static jint Image_getWidth_SurfaceImage(JNIEnv* env, jclass clazz, jobject image) {
+ return Image_getWidth(env, image);
+}
+
+static jint Image_getHeight_SurfaceImage(JNIEnv* env, jclass clazz, jobject image) {
+ return Image_getHeight(env, image);
+}
+
+static jint Image_getFormat_SurfaceImage(JNIEnv* env, jclass clazz, jobject image,
+ jint readerFormat) {
+ return Image_getFormat(env, image, readerFormat);
+}
+#endif
} // extern "C"
@@ -954,23 +994,42 @@ static const JNINativeMethod gImageReaderMethods[] = {
{"nativeImageSetup", "(Landroid/media/Image;)I", (void*)ImageReader_imageSetup },
{"nativeGetSurface", "()Landroid/view/Surface;", (void*)ImageReader_getSurface },
{"nativeDetachImage", "(Landroid/media/Image;)I", (void*)ImageReader_detachImage },
+#ifdef __ANDROID__
{"nativeCreateImagePlanes",
"(ILandroid/graphics/GraphicBuffer;IIIIII)[Landroid/media/ImageReader$ImagePlane;",
(void*)ImageReader_createImagePlanes },
{"nativeUnlockGraphicBuffer",
"(Landroid/graphics/GraphicBuffer;)V", (void*)ImageReader_unlockGraphicBuffer },
+#endif
{"nativeDiscardFreeBuffers", "()V", (void*)ImageReader_discardFreeBuffers }
};
static const JNINativeMethod gImageMethods[] = {
+#ifdef __ANDROID__
{"nativeCreatePlanes", "(IIJ)[Landroid/media/ImageReader$SurfaceImage$SurfacePlane;",
(void*)Image_createSurfacePlanes },
+#else // No access to ImageReader$SurfaceImage$SurfacePlane in RNG
+ {"nativeCreatePlanes", "(IIJ)[Ljava/lang/Object;", (void*)Image_createSurfacePlanes },
+#endif
{"nativeGetWidth", "()I", (void*)Image_getWidth },
{"nativeGetHeight", "()I", (void*)Image_getHeight },
{"nativeGetFormat", "(I)I", (void*)Image_getFormat },
+#ifdef __ANDROID__ // Layoutlib does not support hardware
{"nativeGetFenceFd", "()I", (void*)Image_getFenceFd },
{"nativeGetHardwareBuffer", "()Landroid/hardware/HardwareBuffer;",
(void*)Image_getHardwareBuffer },
+#endif
+
+#ifndef __ANDROID__
+ {"nativeSurfaceImageCreatePlanes", "(Ljava/lang/Object;IIJ)[Ljava/lang/Object;",
+ (void*)Image_createSurfacePlanes_SurfaceImage },
+ {"nativeSurfaceImageGetWidth", "(Ljava/lang/Object;)I",
+ (void*)Image_getWidth_SurfaceImage },
+ {"nativeSurfaceImageGetHeight", "(Ljava/lang/Object;)I",
+ (void*)Image_getHeight_SurfaceImage },
+ {"nativeSurfaceImageGetFormat", "(Ljava/lang/Object;I)I",
+ (void*)Image_getFormat_SurfaceImage },
+#endif
};
int register_android_media_ImageReader(JNIEnv *env) {
diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp
index ecd9cc1cd098..0a9eaaebf5e3 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/media/jni/android_media_Utils.cpp
@@ -17,7 +17,9 @@
// #define LOG_NDEBUG 0
#define LOG_TAG "AndroidMediaUtils"
+#ifdef __ANDROID__ // Layoutlib does not support hardware
#include <hardware/camera3.h>
+#endif
#include <utils/Log.h>
#include "android_media_Utils.h"
@@ -80,6 +82,7 @@ bool isPossiblyYUV(PixelFormat format) {
}
}
+#ifdef __ANDROID__ // Layoutlib does not support hardware
uint32_t Image_getBlobSize(LockedImage* buffer, bool usingRGBAOverride) {
ALOGV("%s", __FUNCTION__);
LOG_ALWAYS_FATAL_IF(buffer == NULL, "Input buffer is NULL!!!");
@@ -115,6 +118,11 @@ uint32_t Image_getBlobSize(LockedImage* buffer, bool usingRGBAOverride) {
return size;
}
+#else
+uint32_t Image_getBlobSize(LockedImage* buffer, bool usingRGBAOverride) {
+ return buffer->stride * buffer->height * 4;
+}
+#endif
status_t getLockedImageInfo(LockedImage* buffer, int idx,
int32_t containerFormat, uint8_t **base, uint32_t *size, int *pixelStride, int *rowStride) {