 Chromium Code Reviews
 Chromium Code Reviews Issue 2990583002:
  Move matrix from VideoFrame to TextureBuffer.  (Closed)
    
  
    Issue 2990583002:
  Move matrix from VideoFrame to TextureBuffer.  (Closed) 
  | 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); | 
| } |