xref: /aosp_15_r20/external/webrtc/sdk/android/src/jni/yuv_helper.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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