1 /*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <jni.h>
12
13 #include "sdk/android/generated_video_jni/YuvHelper_jni.h"
14 #include "sdk/android/src/jni/jni_helpers.h"
15 #include "third_party/libyuv/include/libyuv/convert.h"
16 #include "third_party/libyuv/include/libyuv/planar_functions.h"
17
18 namespace webrtc {
19 namespace jni {
20
JNI_YuvHelper_CopyPlane(JNIEnv * jni,const JavaParamRef<jobject> & j_src,jint src_stride,const JavaParamRef<jobject> & j_dst,jint dst_stride,jint width,jint height)21 void JNI_YuvHelper_CopyPlane(JNIEnv* jni,
22 const JavaParamRef<jobject>& j_src,
23 jint src_stride,
24 const JavaParamRef<jobject>& j_dst,
25 jint dst_stride,
26 jint width,
27 jint height) {
28 const uint8_t* src =
29 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src.obj()));
30 uint8_t* dst =
31 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst.obj()));
32
33 libyuv::CopyPlane(src, src_stride, dst, dst_stride, width, height);
34 }
35
JNI_YuvHelper_I420Copy(JNIEnv * jni,const JavaParamRef<jobject> & j_src_y,jint src_stride_y,const JavaParamRef<jobject> & j_src_u,jint src_stride_u,const JavaParamRef<jobject> & j_src_v,jint src_stride_v,const JavaParamRef<jobject> & j_dst_y,jint dst_stride_y,const JavaParamRef<jobject> & j_dst_u,jint dst_stride_u,const JavaParamRef<jobject> & j_dst_v,jint dst_stride_v,jint width,jint height)36 void JNI_YuvHelper_I420Copy(JNIEnv* jni,
37 const JavaParamRef<jobject>& j_src_y,
38 jint src_stride_y,
39 const JavaParamRef<jobject>& j_src_u,
40 jint src_stride_u,
41 const JavaParamRef<jobject>& j_src_v,
42 jint src_stride_v,
43 const JavaParamRef<jobject>& j_dst_y,
44 jint dst_stride_y,
45 const JavaParamRef<jobject>& j_dst_u,
46 jint dst_stride_u,
47 const JavaParamRef<jobject>& j_dst_v,
48 jint dst_stride_v,
49 jint width,
50 jint height) {
51 const uint8_t* src_y =
52 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_y.obj()));
53 const uint8_t* src_u =
54 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_u.obj()));
55 const uint8_t* src_v =
56 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_v.obj()));
57 uint8_t* dst_y =
58 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y.obj()));
59 uint8_t* dst_u =
60 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u.obj()));
61 uint8_t* dst_v =
62 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v.obj()));
63
64 libyuv::I420Copy(src_y, src_stride_y, src_u, src_stride_u, src_v,
65 src_stride_v, dst_y, dst_stride_y, dst_u, dst_stride_u,
66 dst_v, dst_stride_v, width, height);
67 }
68
JNI_YuvHelper_I420ToNV12(JNIEnv * jni,const JavaParamRef<jobject> & j_src_y,jint src_stride_y,const JavaParamRef<jobject> & j_src_u,jint src_stride_u,const JavaParamRef<jobject> & j_src_v,jint src_stride_v,const JavaParamRef<jobject> & j_dst_y,jint dst_stride_y,const JavaParamRef<jobject> & j_dst_uv,jint dst_stride_uv,jint width,jint height)69 static void JNI_YuvHelper_I420ToNV12(JNIEnv* jni,
70 const JavaParamRef<jobject>& j_src_y,
71 jint src_stride_y,
72 const JavaParamRef<jobject>& j_src_u,
73 jint src_stride_u,
74 const JavaParamRef<jobject>& j_src_v,
75 jint src_stride_v,
76 const JavaParamRef<jobject>& j_dst_y,
77 jint dst_stride_y,
78 const JavaParamRef<jobject>& j_dst_uv,
79 jint dst_stride_uv,
80 jint width,
81 jint height) {
82 const uint8_t* src_y =
83 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_y.obj()));
84 const uint8_t* src_u =
85 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_u.obj()));
86 const uint8_t* src_v =
87 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_v.obj()));
88 uint8_t* dst_y =
89 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y.obj()));
90 uint8_t* dst_uv =
91 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_uv.obj()));
92
93 libyuv::I420ToNV12(src_y, src_stride_y, src_u, src_stride_u, src_v,
94 src_stride_v, dst_y, dst_stride_y, dst_uv, dst_stride_uv,
95 width, height);
96 }
97
JNI_YuvHelper_I420Rotate(JNIEnv * jni,const JavaParamRef<jobject> & j_src_y,jint src_stride_y,const JavaParamRef<jobject> & j_src_u,jint src_stride_u,const JavaParamRef<jobject> & j_src_v,jint src_stride_v,const JavaParamRef<jobject> & j_dst_y,jint dst_stride_y,const JavaParamRef<jobject> & j_dst_u,jint dst_stride_u,const JavaParamRef<jobject> & j_dst_v,jint dst_stride_v,jint src_width,jint src_height,jint rotation_mode)98 void JNI_YuvHelper_I420Rotate(JNIEnv* jni,
99 const JavaParamRef<jobject>& j_src_y,
100 jint src_stride_y,
101 const JavaParamRef<jobject>& j_src_u,
102 jint src_stride_u,
103 const JavaParamRef<jobject>& j_src_v,
104 jint src_stride_v,
105 const JavaParamRef<jobject>& j_dst_y,
106 jint dst_stride_y,
107 const JavaParamRef<jobject>& j_dst_u,
108 jint dst_stride_u,
109 const JavaParamRef<jobject>& j_dst_v,
110 jint dst_stride_v,
111 jint src_width,
112 jint src_height,
113 jint rotation_mode) {
114 const uint8_t* src_y =
115 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_y.obj()));
116 const uint8_t* src_u =
117 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_u.obj()));
118 const uint8_t* src_v =
119 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src_v.obj()));
120 uint8_t* dst_y =
121 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y.obj()));
122 uint8_t* dst_u =
123 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u.obj()));
124 uint8_t* dst_v =
125 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v.obj()));
126
127 libyuv::I420Rotate(src_y, src_stride_y, src_u, src_stride_u, src_v,
128 src_stride_v, dst_y, dst_stride_y, dst_u, dst_stride_u,
129 dst_v, dst_stride_v, src_width, src_height,
130 static_cast<libyuv::RotationMode>(rotation_mode));
131 }
132
JNI_YuvHelper_ABGRToI420(JNIEnv * jni,const JavaParamRef<jobject> & j_src,jint src_stride,const JavaParamRef<jobject> & j_dst_y,jint dst_stride_y,const JavaParamRef<jobject> & j_dst_u,jint dst_stride_u,const JavaParamRef<jobject> & j_dst_v,jint dst_stride_v,jint src_width,jint src_height)133 void JNI_YuvHelper_ABGRToI420(JNIEnv* jni,
134 const JavaParamRef<jobject>& j_src,
135 jint src_stride,
136 const JavaParamRef<jobject>& j_dst_y,
137 jint dst_stride_y,
138 const JavaParamRef<jobject>& j_dst_u,
139 jint dst_stride_u,
140 const JavaParamRef<jobject>& j_dst_v,
141 jint dst_stride_v,
142 jint src_width,
143 jint src_height) {
144 const uint8_t* src =
145 static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_src.obj()));
146 uint8_t* dst_y =
147 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y.obj()));
148 uint8_t* dst_u =
149 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u.obj()));
150 uint8_t* dst_v =
151 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v.obj()));
152
153 libyuv::ABGRToI420(src, src_stride, dst_y, dst_stride_y, dst_u, dst_stride_u,
154 dst_v, dst_stride_v, src_width, src_height);
155 }
156
157 } // namespace jni
158 } // namespace webrtc
159