blob: 1f10eb4009180089fb87c198a5ee8f842037e372 [file] [log] [blame]
glaznev@webrtc.org18c92472015-02-18 18:42:55 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
glaznev@webrtc.org18c92472015-02-18 18:42:55 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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.
glaznev@webrtc.org18c92472015-02-18 18:42:55 +00009 */
10
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +010011#ifndef SDK_ANDROID_SRC_JNI_VIDEOFRAME_H_
12#define SDK_ANDROID_SRC_JNI_VIDEOFRAME_H_
glaznev@webrtc.org18c92472015-02-18 18:42:55 +000013
Magnus Jedvert6781ea42015-10-02 13:56:04 +020014#include <jni.h>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "api/video/video_frame.h"
17#include "api/video/video_frame_buffer.h"
18#include "api/video/video_rotation.h"
19#include "rtc_base/callback.h"
20#include "sdk/android/src/jni/jni_helpers.h"
magjed52a30e32015-10-12 06:53:20 -070021
magjeda3d4f682017-08-28 16:24:06 -070022namespace webrtc {
23namespace jni {
glaznev@webrtc.org18c92472015-02-18 18:42:55 +000024
nisse47ac4622016-05-25 08:47:01 -070025// Open gl texture matrix, in column-major order. Operations are
26// in-place.
27class Matrix {
28 public:
29 Matrix(JNIEnv* jni, jfloatArray a);
30
Sami Kalliomäkibc061b42017-06-16 10:08:23 +020031 static Matrix fromAndroidGraphicsMatrix(JNIEnv* jni, jobject j_matrix);
32
33 jfloatArray ToJava(JNIEnv* jni) const;
nisse47ac4622016-05-25 08:47:01 -070034
35 // Crop arguments are relative to original size.
36 void Crop(float cropped_width,
37 float cropped_height,
38 float crop_x,
39 float crop_y);
40
magjeda3d4f682017-08-28 16:24:06 -070041 void Rotate(VideoRotation rotation);
nisse47ac4622016-05-25 08:47:01 -070042
43 private:
Sami Kalliomäkibc061b42017-06-16 10:08:23 +020044 Matrix() {}
45
nisse47ac4622016-05-25 08:47:01 -070046 static void Multiply(const float a[16], const float b[16], float result[16]);
47 float elem_[16];
48};
49
Per9b3f56e2015-04-09 13:44:16 +020050// Wrapper for texture object.
Per488e75f2015-11-19 10:43:36 +010051struct NativeHandleImpl {
52 NativeHandleImpl(JNIEnv* jni,
53 jint j_oes_texture_id,
54 jfloatArray j_transform_matrix);
Per9b3f56e2015-04-09 13:44:16 +020055
nisse47ac4622016-05-25 08:47:01 -070056 NativeHandleImpl(int id, const Matrix& matrix);
57
Magnus Jedvert91b348c2015-10-07 22:57:06 +020058 const int oes_texture_id;
nisse47ac4622016-05-25 08:47:01 -070059 Matrix sampling_matrix;
Peter Boströmeb66e802015-06-05 11:08:03 +020060};
61
Sami Kalliomäkibc061b42017-06-16 10:08:23 +020062// Base class to differentiate between the old texture frames and the new
63// Java-based frames.
64// TODO(sakal): Remove this and AndroidTextureBuffer once they are no longer
65// needed.
magjeda3d4f682017-08-28 16:24:06 -070066class AndroidVideoFrameBuffer : public VideoFrameBuffer {
Sami Kalliomäkibc061b42017-06-16 10:08:23 +020067 public:
68 enum class AndroidType { kTextureBuffer, kJavaBuffer };
69
70 virtual AndroidType android_type() = 0;
71};
72
73class AndroidTextureBuffer : public AndroidVideoFrameBuffer {
magjed52a30e32015-10-12 06:53:20 -070074 public:
75 AndroidTextureBuffer(int width,
76 int height,
Per488e75f2015-11-19 10:43:36 +010077 const NativeHandleImpl& native_handle,
nissec490e012015-12-10 06:23:33 -080078 jobject surface_texture_helper,
magjed52a30e32015-10-12 06:53:20 -070079 const rtc::Callback0<void>& no_longer_used);
80 ~AndroidTextureBuffer();
magjed52a30e32015-10-12 06:53:20 -070081
Magnus Jedvertc276ecf2017-06-07 13:06:06 +020082 NativeHandleImpl native_handle_impl() const;
Pera3c20bb2015-11-26 13:41:44 +010083
magjed52a30e32015-10-12 06:53:20 -070084 private:
Magnus Jedvertc276ecf2017-06-07 13:06:06 +020085 Type type() const override;
86 int width() const override;
87 int height() const override;
88
magjeda3d4f682017-08-28 16:24:06 -070089 rtc::scoped_refptr<I420BufferInterface> ToI420() override;
Magnus Jedvertc276ecf2017-06-07 13:06:06 +020090
Sami Kalliomäkibc061b42017-06-16 10:08:23 +020091 AndroidType android_type() override { return AndroidType::kTextureBuffer; }
92
Magnus Jedvertc276ecf2017-06-07 13:06:06 +020093 const int width_;
94 const int height_;
Per488e75f2015-11-19 10:43:36 +010095 NativeHandleImpl native_handle_;
nissec490e012015-12-10 06:23:33 -080096 // Raw object pointer, relying on the caller, i.e.,
97 // AndroidVideoCapturerJni or the C++ SurfaceTextureHelper, to keep
98 // a global reference. TODO(nisse): Make this a reference to the C++
99 // SurfaceTextureHelper instead, but that requires some refactoring
100 // of AndroidVideoCapturerJni.
101 jobject surface_texture_helper_;
magjed52a30e32015-10-12 06:53:20 -0700102 rtc::Callback0<void> no_longer_used_cb_;
103};
104
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200105class AndroidVideoBuffer : public AndroidVideoFrameBuffer {
106 public:
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100107 // Creates a native VideoFrameBuffer from a Java VideoFrame.Buffer.
108 static rtc::scoped_refptr<AndroidVideoBuffer> Create(
sakalbe910462017-08-11 00:26:05 -0700109 JNIEnv* jni,
sakalbe910462017-08-11 00:26:05 -0700110 jobject j_video_frame_buffer);
111
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100112 // Similar to the Create() above, but adopts and takes ownership of the Java
113 // VideoFrame.Buffer. I.e. retain() will not be called, but release() will be
114 // called when the returned AndroidVideoBuffer is destroyed.
115 static rtc::scoped_refptr<AndroidVideoBuffer> Adopt(
116 JNIEnv* jni,
117 jobject j_video_frame_buffer);
118
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200119 ~AndroidVideoBuffer() override;
120
121 jobject video_frame_buffer() const;
122
Magnus Jedvert202be392017-11-18 16:09:17 +0100123 // Crops a region defined by |crop_x|, |crop_y|, |crop_width| and
124 // |crop_height|. Scales it to size |scale_width| x |scale_height|.
125 rtc::scoped_refptr<AndroidVideoBuffer> CropAndScale(JNIEnv* jni,
126 int crop_x,
127 int crop_y,
128 int crop_width,
129 int crop_height,
130 int scale_width,
131 int scale_height);
132
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200133 // Returns an instance of VideoRenderer.I420Frame (deprecated)
sakal836f60c2017-07-28 07:12:23 -0700134 jobject ToJavaI420Frame(JNIEnv* jni, int rotation);
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200135
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100136 protected:
137 // Should not be called directly. Adopts the Java VideoFrame.Buffer. Use
138 // Create() or Adopt() instead for clarity.
139 AndroidVideoBuffer(JNIEnv* jni, jobject j_video_frame_buffer);
140
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200141 private:
142 Type type() const override;
143 int width() const override;
144 int height() const override;
145
magjeda3d4f682017-08-28 16:24:06 -0700146 rtc::scoped_refptr<I420BufferInterface> ToI420() override;
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200147
148 AndroidType android_type() override { return AndroidType::kJavaBuffer; }
149
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200150 const int width_;
151 const int height_;
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200152 // Holds a VideoFrame.Buffer.
sakal5ca60cc2017-08-09 05:25:49 -0700153 const ScopedGlobalRef<jobject> j_video_frame_buffer_;
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200154};
155
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100156VideoFrame JavaToNativeFrame(JNIEnv* jni,
157 jobject j_video_frame,
158 uint32_t timestamp_rtp);
Sami Kalliomäkibc061b42017-06-16 10:08:23 +0200159
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100160jobject NativeToJavaFrame(JNIEnv* jni, const VideoFrame& frame);
sakalb5f5bdc2017-08-10 04:15:42 -0700161
magjeda3d4f682017-08-28 16:24:06 -0700162} // namespace jni
163} // namespace webrtc
glaznev@webrtc.org18c92472015-02-18 18:42:55 +0000164
Magnus Jedvertc2ac3c62017-11-14 17:08:59 +0100165#endif // SDK_ANDROID_SRC_JNI_VIDEOFRAME_H_