Merge "media: Populate Image scaling mode in reader and writer" into pi-dev

This commit is contained in:
TreeHugger Robot
2018-04-06 17:06:44 +00:00
committed by Android (Google) Code Review
6 changed files with 64 additions and 15 deletions

View File

@@ -192,6 +192,13 @@ public abstract class Image implements AutoCloseable {
*/
public abstract int getTransform();
/**
* Get the scaling mode associated with this frame.
* @return The scaling mode that needs to be applied for this frame.
* @hide
*/
public abstract int getScalingMode();
/**
* Get the {@link android.hardware.HardwareBuffer HardwareBuffer} handle of the input image
* intended for GPU and/or hardware access.

View File

@@ -870,6 +870,12 @@ public class ImageReader implements AutoCloseable {
return mTransform;
}
@Override
public int getScalingMode() {
throwISEIfImageIsInvalid();
return mScalingMode;
}
@Override
public HardwareBuffer getHardwareBuffer() {
throwISEIfImageIsInvalid();
@@ -1004,14 +1010,11 @@ public class ImageReader implements AutoCloseable {
private long mNativeBuffer;
/**
* This field is set by native code during nativeImageSetup().
* These fields are set by native code during nativeImageSetup().
*/
private long mTimestamp;
/**
* This field is set by native code during nativeImageSetup().
*/
private int mTransform;
private int mScalingMode;
private SurfacePlane[] mPlanes;
private int mFormat = ImageFormat.UNKNOWN;

View File

@@ -371,7 +371,7 @@ public class ImageWriter implements AutoCloseable {
Rect crop = image.getCropRect();
nativeQueueInputImage(mNativeContext, image, image.getTimestamp(), crop.left, crop.top,
crop.right, crop.bottom, image.getTransform());
crop.right, crop.bottom, image.getTransform(), image.getScalingMode());
/**
* Only remove and cleanup the Images that are owned by this
@@ -558,7 +558,7 @@ public class ImageWriter implements AutoCloseable {
Rect crop = image.getCropRect();
nativeAttachAndQueueImage(mNativeContext, image.getNativeContext(), image.getFormat(),
image.getTimestamp(), crop.left, crop.top, crop.right, crop.bottom,
image.getTransform());
image.getTransform(), image.getScalingMode());
}
/**
@@ -676,6 +676,7 @@ public class ImageWriter implements AutoCloseable {
private long mTimestamp = DEFAULT_TIMESTAMP;
private int mTransform = 0; //Default no transform
private int mScalingMode = 0; //Default frozen scaling mode
public WriterSurfaceImage(ImageWriter writer) {
mOwner = writer;
@@ -720,6 +721,13 @@ public class ImageWriter implements AutoCloseable {
return mTransform;
}
@Override
public int getScalingMode() {
throwISEIfImageIsInvalid();
return mScalingMode;
}
@Override
public long getTimestamp() {
throwISEIfImageIsInvalid();
@@ -866,11 +874,12 @@ public class ImageWriter implements AutoCloseable {
private synchronized native void nativeDequeueInputImage(long nativeCtx, Image wi);
private synchronized native void nativeQueueInputImage(long nativeCtx, Image image,
long timestampNs, int left, int top, int right, int bottom, int transform);
long timestampNs, int left, int top, int right, int bottom, int transform,
int scalingMode);
private synchronized native int nativeAttachAndQueueImage(long nativeCtx,
long imageNativeBuffer, int imageFormat, long timestampNs, int left,
int top, int right, int bottom, int transform);
int top, int right, int bottom, int transform, int scalingMode);
private synchronized native void cancelImage(long nativeCtx, Image image);

View File

@@ -3574,6 +3574,7 @@ final public class MediaCodec {
private final static int TYPE_YUV = 1;
private final int mTransform = 0; //Default no transform
private final int mScalingMode = 0; //Default frozen scaling mode
@Override
public int getFormat() {
@@ -3599,6 +3600,12 @@ final public class MediaCodec {
return mTransform;
}
@Override
public int getScalingMode() {
throwISEIfImageIsInvalid();
return mScalingMode;
}
@Override
public long getTimestamp() {
throwISEIfImageIsInvalid();

View File

@@ -46,6 +46,7 @@
#define ANDROID_MEDIA_SURFACEIMAGE_BUFFER_JNI_ID "mNativeBuffer"
#define ANDROID_MEDIA_SURFACEIMAGE_TS_JNI_ID "mTimestamp"
#define ANDROID_MEDIA_SURFACEIMAGE_TF_JNI_ID "mTransform"
#define ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID "mScalingMode"
#define CONSUMER_BUFFER_USAGE_UNKNOWN 0;
// ----------------------------------------------------------------------------
@@ -68,6 +69,7 @@ static struct {
jfieldID mNativeBuffer;
jfieldID mTimestamp;
jfieldID mTransform;
jfieldID mScalingMode;
jfieldID mPlanes;
} gSurfaceImageClassInfo;
@@ -315,6 +317,12 @@ static void ImageReader_classInit(JNIEnv* env, jclass clazz)
"can't find android/graphics/ImageReader.%s",
ANDROID_MEDIA_SURFACEIMAGE_TF_JNI_ID);
gSurfaceImageClassInfo.mScalingMode = env->GetFieldID(
imageClazz, ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID, "I");
LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mScalingMode == NULL,
"can't find android/graphics/ImageReader.%s",
ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID);
gSurfaceImageClassInfo.mPlanes = env->GetFieldID(
imageClazz, "mPlanes", "[Landroid/media/ImageReader$SurfaceImage$SurfacePlane;");
LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mPlanes == NULL,
@@ -606,6 +614,8 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image) {
static_cast<jlong>(buffer->mTimestamp));
env->SetIntField(image, gSurfaceImageClassInfo.mTransform,
static_cast<jint>(buffer->mTransform));
env->SetIntField(image, gSurfaceImageClassInfo.mScalingMode,
static_cast<jint>(buffer->mScalingMode));
return ACQUIRE_SUCCESS;
}

View File

@@ -421,7 +421,8 @@ static void ImageWriter_cancelImage(JNIEnv* env, jobject thiz, jlong nativeCtx,
}
static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, jobject image,
jlong timestampNs, jint left, jint top, jint right, jint bottom, jint transform) {
jlong timestampNs, jint left, jint top, jint right, jint bottom, jint transform,
jint scalingMode) {
ALOGV("%s", __FUNCTION__);
JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
if (ctx == NULL || thiz == NULL) {
@@ -471,6 +472,12 @@ static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, j
return;
}
res = native_window_set_scaling_mode(anw.get(), scalingMode);
if (res != OK) {
jniThrowRuntimeException(env, "Set scaling mode failed");
return;
}
// Finally, queue input buffer
res = anw->queueBuffer(anw.get(), buffer, fenceFd);
if (res != OK) {
@@ -493,7 +500,7 @@ static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, j
static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nativeCtx,
jlong nativeBuffer, jint imageFormat, jlong timestampNs, jint left, jint top,
jint right, jint bottom, jint transform) {
jint right, jint bottom, jint transform, jint scalingMode) {
ALOGV("%s", __FUNCTION__);
JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
if (ctx == NULL || thiz == NULL) {
@@ -536,8 +543,8 @@ static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nat
}
sp < ANativeWindow > anw = surface;
// Step 2. Set timestamp, crop and transform. Note that we do not need unlock the image because
// it was not locked.
// Step 2. Set timestamp, crop, transform and scaling mode. Note that we do not need unlock the
// image because it was not locked.
ALOGV("timestamp to be queued: %" PRId64, timestampNs);
res = native_window_set_buffers_timestamp(anw.get(), timestampNs);
if (res != OK) {
@@ -562,6 +569,12 @@ static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nat
return res;
}
res = native_window_set_scaling_mode(anw.get(), scalingMode);
if (res != OK) {
jniThrowRuntimeException(env, "Set scaling mode failed");
return res;
}
// Step 3. Queue Image.
res = anw->queueBuffer(anw.get(), buffer->mGraphicBuffer.get(), /*fenceFd*/
-1);
@@ -797,9 +810,9 @@ static JNINativeMethod gImageWriterMethods[] = {
{"nativeInit", "(Ljava/lang/Object;Landroid/view/Surface;II)J",
(void*)ImageWriter_init },
{"nativeClose", "(J)V", (void*)ImageWriter_close },
{"nativeAttachAndQueueImage", "(JJIJIIIII)I", (void*)ImageWriter_attachAndQueueImage },
{"nativeAttachAndQueueImage", "(JJIJIIIIII)I", (void*)ImageWriter_attachAndQueueImage },
{"nativeDequeueInputImage", "(JLandroid/media/Image;)V", (void*)ImageWriter_dequeueImage },
{"nativeQueueInputImage", "(JLandroid/media/Image;JIIIII)V", (void*)ImageWriter_queueImage },
{"nativeQueueInputImage", "(JLandroid/media/Image;JIIIIII)V", (void*)ImageWriter_queueImage },
{"cancelImage", "(JLandroid/media/Image;)V", (void*)ImageWriter_cancelImage },
};