Merge "media: Populate Image scaling mode in reader and writer" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
893c5e0c70
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 },
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user