diff --git a/sdk/android/api/org/webrtc/YuvHelper.java b/sdk/android/api/org/webrtc/YuvHelper.java index f82fde880a..83bd7dcbb4 100644 --- a/sdk/android/api/org/webrtc/YuvHelper.java +++ b/sdk/android/api/org/webrtc/YuvHelper.java @@ -102,6 +102,13 @@ public class YuvHelper { nativeCopyPlane(src, srcStride, dst, dstStride, width, height); } + /** Converts ABGR little endian (rgba in memory) to I420. */ + public static void ABGRToI420(ByteBuffer src, int srcStride, ByteBuffer dstY, int dstStrideY, + ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV, int width, int height) { + nativeABGRToI420( + src, srcStride, dstY, dstStrideY, dstU, dstStrideU, dstV, dstStrideV, width, height); + } + public static void I420Copy(ByteBuffer srcY, int srcStrideY, ByteBuffer srcU, int srcStrideU, ByteBuffer srcV, int srcStrideV, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV, int width, int height) { @@ -136,4 +143,7 @@ public class YuvHelper { int srcStrideU, ByteBuffer srcV, int srcStrideV, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV, int srcWidth, int srcHeight, int rotationMode); + private static native void nativeABGRToI420(ByteBuffer src, int srcStride, ByteBuffer dstY, + int dstStrideY, ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV, int width, + int height); } diff --git a/sdk/android/src/jni/yuv_helper.cc b/sdk/android/src/jni/yuv_helper.cc index 04ae49b2c9..e812bc9527 100644 --- a/sdk/android/src/jni/yuv_helper.cc +++ b/sdk/android/src/jni/yuv_helper.cc @@ -130,5 +130,29 @@ void JNI_YuvHelper_I420Rotate(JNIEnv* jni, static_cast(rotation_mode)); } +void JNI_YuvHelper_ABGRToI420(JNIEnv* jni, + const JavaParamRef& j_src, + jint src_stride, + const JavaParamRef& j_dst_y, + jint dst_stride_y, + const JavaParamRef& j_dst_u, + jint dst_stride_u, + const JavaParamRef& j_dst_v, + jint dst_stride_v, + jint src_width, + jint src_height) { + const uint8_t* src = + static_cast(jni->GetDirectBufferAddress(j_src.obj())); + uint8_t* dst_y = + static_cast(jni->GetDirectBufferAddress(j_dst_y.obj())); + uint8_t* dst_u = + static_cast(jni->GetDirectBufferAddress(j_dst_u.obj())); + uint8_t* dst_v = + static_cast(jni->GetDirectBufferAddress(j_dst_v.obj())); + + libyuv::ABGRToI420(src, src_stride, dst_y, dst_stride_y, dst_u, dst_stride_u, + dst_v, dst_stride_v, src_width, src_height); +} + } // namespace jni } // namespace webrtc