Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Unified Diff: webrtc/sdk/android/src/jni/native_handle_impl.cc

Issue 2990583002: Move matrix from VideoFrame to TextureBuffer. (Closed)
Patch Set: Fixes. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/sdk/android/src/jni/native_handle_impl.cc
diff --git a/webrtc/sdk/android/src/jni/native_handle_impl.cc b/webrtc/sdk/android/src/jni/native_handle_impl.cc
index 562e7ec6f80a71306844cf570406ae6f634c51a3..6ac65a1066ab3eb2f15ca79f8e2d2f4111fbeea8 100644
--- a/webrtc/sdk/android/src/jni/native_handle_impl.cc
+++ b/webrtc/sdk/android/src/jni/native_handle_impl.cc
@@ -34,42 +34,6 @@ Matrix::Matrix(JNIEnv* jni, jfloatArray a) {
jni->ReleaseFloatArrayElements(a, ptr, 0);
}
-Matrix Matrix::fromAndroidGraphicsMatrix(JNIEnv* jni, jobject j_matrix) {
- jfloatArray array_3x3 = jni->NewFloatArray(9);
- jclass j_matrix_class = jni->FindClass("android/graphics/Matrix");
- jni->CallVoidMethod(j_matrix,
- GetMethodID(jni, j_matrix_class, "getValues", "([F)V"),
- array_3x3);
- jfloat* array_3x3_ptr = jni->GetFloatArrayElements(array_3x3, nullptr);
- Matrix matrix;
- memset(matrix.elem_, 0, sizeof(matrix.elem_));
- // The android.graphics.Matrix looks like this:
- // [x1 y1 w1]
- // [x2 y2 w2]
- // [x3 y3 w3]
- // We want to contruct a matrix that looks like this:
- // [x1 y1 0 w1]
- // [x2 y2 0 w2]
- // [ 0 0 1 0]
- // [x3 y3 0 w3]
- // Since it is stored in column-major order, it looks like this:
- // [x1 x2 0 x3
- // y1 y2 0 y3
- // 0 0 1 0
- // w1 w2 0 w3]
- matrix.elem_[0 * 4 + 0] = array_3x3_ptr[0 * 3 + 0];
- matrix.elem_[0 * 4 + 1] = array_3x3_ptr[1 * 3 + 0];
- matrix.elem_[0 * 4 + 3] = array_3x3_ptr[2 * 3 + 0];
- matrix.elem_[1 * 4 + 0] = array_3x3_ptr[0 * 3 + 1];
- matrix.elem_[1 * 4 + 1] = array_3x3_ptr[1 * 3 + 1];
- matrix.elem_[1 * 4 + 3] = array_3x3_ptr[2 * 3 + 1];
- matrix.elem_[2 * 4 + 2] = 1; // Z-scale should be 1.
- matrix.elem_[3 * 4 + 0] = array_3x3_ptr[0 * 3 + 2];
- matrix.elem_[3 * 4 + 1] = array_3x3_ptr[1 * 3 + 2];
- matrix.elem_[3 * 4 + 3] = array_3x3_ptr[2 * 3 + 2];
- return matrix;
-}
-
jfloatArray Matrix::ToJava(JNIEnv* jni) const {
jfloatArray matrix = jni->NewFloatArray(16);
jni->SetFloatArrayRegion(matrix, 0, 16, elem_);
@@ -235,14 +199,12 @@ rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidTextureBuffer::ToI420() {
AndroidVideoBuffer::AndroidVideoBuffer(JNIEnv* jni,
jmethodID j_retain_id,
jmethodID j_release_id,
- int width,
- int height,
- const Matrix& matrix,
+ jmethodID j_get_width_id,
+ jmethodID j_get_height_id,
jobject j_video_frame_buffer)
: j_release_id_(j_release_id),
- width_(width),
- height_(height),
- matrix_(matrix),
+ j_get_width_id_(j_get_width_id),
+ j_get_height_id_(j_get_height_id),
j_video_frame_buffer_(jni, j_video_frame_buffer) {
jni->CallVoidMethod(j_video_frame_buffer, j_retain_id);
}
@@ -261,11 +223,13 @@ webrtc::VideoFrameBuffer::Type AndroidVideoBuffer::type() const {
}
int AndroidVideoBuffer::width() const {
- return width_;
+ JNIEnv* jni = AttachCurrentThreadIfNeeded();
+ return jni->CallIntMethod(*j_video_frame_buffer_, j_get_width_id_);
}
int AndroidVideoBuffer::height() const {
- return height_;
+ JNIEnv* jni = AttachCurrentThreadIfNeeded();
+ return jni->CallIntMethod(*j_video_frame_buffer_, j_get_height_id_);
}
rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidVideoBuffer::ToI420() {
@@ -274,23 +238,19 @@ rtc::scoped_refptr<webrtc::I420BufferInterface> AndroidVideoBuffer::ToI420() {
}
jobject AndroidVideoBuffer::ToJavaI420Frame(JNIEnv* jni,
- int width,
- int height,
int rotation) {
jclass j_byte_buffer_class = jni->FindClass("java/nio/ByteBuffer");
jclass j_i420_frame_class =
FindClass(jni, "org/webrtc/VideoRenderer$I420Frame");
- jmethodID j_i420_frame_ctor_id =
- GetMethodID(jni, j_i420_frame_class, "<init>",
- "(III[FLorg/webrtc/VideoFrame$Buffer;J)V");
+ jmethodID j_i420_frame_ctor_id = GetMethodID(
+ jni, j_i420_frame_class, "<init>", "(ILorg/webrtc/VideoFrame$Buffer;J)V");
// Java code just uses the native frame to hold a reference to the buffer so
// this is okay.
webrtc::VideoFrame* native_frame = new webrtc::VideoFrame(
this, 0 /* timestamp */, 0 /* render_time_ms */,
webrtc::VideoRotation::kVideoRotation_0 /* rotation */);
- return jni->NewObject(j_i420_frame_class, j_i420_frame_ctor_id, width, height,
- rotation, matrix_.ToJava(jni), *j_video_frame_buffer_,
- jlongFromPointer(native_frame));
+ return jni->NewObject(j_i420_frame_class, j_i420_frame_ctor_id, rotation,
+ *j_video_frame_buffer_, jlongFromPointer(native_frame));
}
AndroidVideoBufferFactory::AndroidVideoBufferFactory(JNIEnv* jni)
@@ -299,16 +259,8 @@ AndroidVideoBufferFactory::AndroidVideoBufferFactory(JNIEnv* jni)
*j_video_frame_class_,
"getBuffer",
"()Lorg/webrtc/VideoFrame$Buffer;")),
- j_get_width_id_(
- GetMethodID(jni, *j_video_frame_class_, "getWidth", "()I")),
- j_get_height_id_(
- GetMethodID(jni, *j_video_frame_class_, "getHeight", "()I")),
j_get_rotation_id_(
GetMethodID(jni, *j_video_frame_class_, "getRotation", "()I")),
- j_get_transform_matrix_id_(GetMethodID(jni,
- *j_video_frame_class_,
- "getTransformMatrix",
- "()Landroid/graphics/Matrix;")),
j_get_timestamp_ns_id_(
GetMethodID(jni, *j_video_frame_class_, "getTimestampNs", "()J")),
j_video_frame_buffer_class_(
@@ -317,7 +269,11 @@ AndroidVideoBufferFactory::AndroidVideoBufferFactory(JNIEnv* jni)
j_retain_id_(
GetMethodID(jni, *j_video_frame_buffer_class_, "retain", "()V")),
j_release_id_(
- GetMethodID(jni, *j_video_frame_buffer_class_, "release", "()V")) {}
+ GetMethodID(jni, *j_video_frame_buffer_class_, "release", "()V")),
+ j_get_width_id_(
+ GetMethodID(jni, *j_video_frame_buffer_class_, "getWidth", "()I")),
+ j_get_height_id_(
+ GetMethodID(jni, *j_video_frame_buffer_class_, "getHeight", "()I")) {}
webrtc::VideoFrame AndroidVideoBufferFactory::CreateFrame(
JNIEnv* jni,
@@ -325,29 +281,21 @@ webrtc::VideoFrame AndroidVideoBufferFactory::CreateFrame(
uint32_t timestamp_rtp) const {
jobject j_video_frame_buffer =
jni->CallObjectMethod(j_video_frame, j_get_buffer_id_);
- int width = jni->CallIntMethod(j_video_frame, j_get_width_id_);
- int height = jni->CallIntMethod(j_video_frame, j_get_height_id_);
int rotation = jni->CallIntMethod(j_video_frame, j_get_rotation_id_);
- jobject j_matrix =
- jni->CallObjectMethod(j_video_frame, j_get_transform_matrix_id_);
- Matrix matrix = Matrix::fromAndroidGraphicsMatrix(jni, j_matrix);
uint32_t timestamp_ns =
jni->CallLongMethod(j_video_frame, j_get_timestamp_ns_id_);
rtc::scoped_refptr<AndroidVideoBuffer> buffer =
- CreateBuffer(width, height, matrix, j_video_frame_buffer);
+ CreateBuffer(j_video_frame_buffer);
return webrtc::VideoFrame(buffer, timestamp_rtp,
timestamp_ns / rtc::kNumNanosecsPerMillisec,
static_cast<webrtc::VideoRotation>(rotation));
}
rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::CreateBuffer(
- int width,
- int height,
- const Matrix& matrix,
jobject j_video_frame_buffer) const {
JNIEnv* jni = AttachCurrentThreadIfNeeded();
magjed_webrtc 2017/07/27 14:02:29 Isn't it easier to extract the width and height he
sakal 2017/07/28 08:01:36 Done.
return new rtc::RefCountedObject<AndroidVideoBuffer>(
- jni, j_retain_id_, j_release_id_, width, height, matrix,
+ jni, j_retain_id_, j_release_id_, j_get_width_id_, j_get_height_id_,
j_video_frame_buffer);
}

Powered by Google App Engine
This is Rietveld 408576698