├── .gitignore ├── AndroidExample ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── piasy │ │ └── ugi │ │ └── example │ │ ├── EglContextHacker.java │ │ ├── LandscapePreviewActivity.java │ │ ├── MainActivity.java │ │ └── SelectorActivity.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── awesomeface.png │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_main.xml │ └── activity_selector.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── LICENSE ├── README.md ├── UltraGpuImage-Android ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── cpp │ ├── ultra_gpu_image_filters_jni.cpp │ └── ultra_gpu_image_jni.cpp │ └── java │ └── com │ └── piasy │ └── ugi │ ├── UgiFilter.java │ ├── UgiRenderer.java │ ├── UgiRendererView.java │ ├── UgiTransformation.java │ ├── egl │ ├── EglBase.java │ ├── EglBase10.java │ └── EglBase14.java │ ├── filters │ ├── UgiBrightnessFilter.java │ ├── UgiColorInvertFilter.java │ ├── UgiFilterGroup.java │ └── UgiPreprocessFilter.java │ └── utils │ ├── Logging.java │ └── ThreadUtils.java ├── UltraGpuImage-iOS ├── module.modulemap ├── project.yml └── src │ ├── Info.plist │ ├── UgiFilter.h │ ├── UgiLogging.h │ ├── UgiLogging.m │ ├── UgiRenderer.h │ ├── UgiRenderer.mm │ ├── UgiRendererView.h │ ├── UgiRendererView.m │ ├── UgiTransformation+Native.h │ ├── UgiTransformation.h │ ├── UgiTransformation.mm │ ├── UltraGpuImage_iOS.h │ └── filters │ ├── UgiBrightnessFilter.h │ ├── UgiBrightnessFilter.mm │ ├── UgiColorInvertFilter.h │ ├── UgiColorInvertFilter.mm │ ├── UgiFilterGroup.h │ ├── UgiFilterGroup.mm │ ├── UgiPreprocessFilter.h │ └── UgiPreprocessFilter.mm ├── UltraGpuImage.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── UltraGpuImage ├── project.yml └── src │ ├── filters │ ├── ugi_brightness_filter.cpp │ ├── ugi_brightness_filter.h │ ├── ugi_color_invert_filter.cpp │ ├── ugi_color_invert_filter.h │ ├── ugi_filter_group.cpp │ ├── ugi_filter_group.h │ ├── ugi_preprocess_filter.cpp │ └── ugi_preprocess_filter.h │ ├── ugi_filter.cpp │ ├── ugi_filter.h │ ├── ugi_gl.h │ ├── ugi_gl_utils.cpp │ ├── ugi_gl_utils.h │ ├── ugi_logging.cpp │ ├── ugi_logging.h │ ├── ugi_renderer.cpp │ ├── ugi_renderer.h │ ├── ugi_transformation.cpp │ └── ugi_transformation.h ├── build.gradle ├── collect_src.sh ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── iOSExample ├── Podfile ├── Podfile.lock ├── iOSExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── awesomeface.imageset │ │ │ ├── Contents.json │ │ │ └── awesomeface.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ ├── ViewController.h │ ├── ViewController.m │ └── main.m └── project.yml ├── settings.gradle └── setup_xcode_project.sh /.gitignore: -------------------------------------------------------------------------------- 1 | **.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | **/build 7 | /captures 8 | **/.externalNativeBuild 9 | 10 | **/*.xcodeproj 11 | **/xcuserdata/ 12 | **/Pods/ 13 | 14 | libs/ 15 | -------------------------------------------------------------------------------- /AndroidExample/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /AndroidExample/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion rootProject.ext.androidCompileSdkVersion 5 | defaultConfig { 6 | minSdkVersion rootProject.ext.androidMinSdkVersion 7 | targetSdkVersion rootProject.ext.androidTargetSdkVersion 8 | versionCode rootProject.ext.releaseVersionCode 9 | versionName rootProject.ext.releaseVersionName 10 | 11 | applicationId "com.piasy.ugi.example" 12 | 13 | ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | compileOptions { 22 | sourceCompatibility JavaVersion.VERSION_1_8 23 | targetCompatibility JavaVersion.VERSION_1_8 24 | } 25 | } 26 | 27 | dependencies { 28 | implementation project(':UltraGpuImage-Android') 29 | 30 | implementation 'com.jakewharton:butterknife:9.0.0-rc3' 31 | annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc3' 32 | 33 | implementation 'com.github.hotchemi:permissionsdispatcher:3.0.1' 34 | annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1' 35 | 36 | implementation 'org.webrtc:google-webrtc:1.0.25821' 37 | } 38 | -------------------------------------------------------------------------------- /AndroidExample/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /AndroidExample/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 28 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /AndroidExample/src/main/java/com/piasy/ugi/example/EglContextHacker.java: -------------------------------------------------------------------------------- 1 | package com.piasy.ugi.example; 2 | 3 | import android.opengl.EGLContext; 4 | import java.lang.reflect.Field; 5 | import org.webrtc.EglBase; 6 | 7 | /** 8 | * Created by Piasy{github.com/Piasy} on 2018/12/22. 9 | */ 10 | public class EglContextHacker { 11 | public static EGLContext getContextFromEglBase(EglBase eglBase) { 12 | EglBase.Context context = eglBase.getEglBaseContext(); 13 | try { 14 | Field f = context.getClass().getDeclaredField("egl14Context"); 15 | f.setAccessible(true); 16 | return (EGLContext) f.get(context); 17 | } catch (NoSuchFieldException | IllegalAccessException e) { 18 | e.printStackTrace(); 19 | } 20 | return null; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /AndroidExample/src/main/java/com/piasy/ugi/example/LandscapePreviewActivity.java: -------------------------------------------------------------------------------- 1 | package com.piasy.ugi.example; 2 | 3 | /** 4 | * Created by Piasy{github.com/Piasy} on 2018/12/22. 5 | */ 6 | public class LandscapePreviewActivity extends MainActivity { 7 | } 8 | -------------------------------------------------------------------------------- /AndroidExample/src/main/java/com/piasy/ugi/example/SelectorActivity.java: -------------------------------------------------------------------------------- 1 | package com.piasy.ugi.example; 2 | 3 | import android.Manifest; 4 | import android.app.Activity; 5 | import android.content.Intent; 6 | import android.hardware.Camera; 7 | import android.os.Bundle; 8 | import android.widget.CheckBox; 9 | import androidx.annotation.NonNull; 10 | import butterknife.BindView; 11 | import butterknife.ButterKnife; 12 | import butterknife.OnClick; 13 | import com.piasy.ugi.UgiRendererView; 14 | import permissions.dispatcher.NeedsPermission; 15 | import permissions.dispatcher.RuntimePermissions; 16 | 17 | @RuntimePermissions 18 | public class SelectorActivity extends Activity { 19 | 20 | @BindView(R.id.frontCamera) 21 | CheckBox frontCamera; 22 | @BindView(R.id.portrait) 23 | CheckBox portrait; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_selector); 29 | 30 | SelectorActivityPermissionsDispatcher.checkPermissionWithPermissionCheck(this); 31 | } 32 | 33 | @Override 34 | public void onRequestPermissionsResult(final int requestCode, 35 | @NonNull final String[] permissions, @NonNull final int[] grantResults) { 36 | super.onRequestPermissionsResult(requestCode, permissions, grantResults); 37 | SelectorActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, 38 | grantResults); 39 | } 40 | 41 | @OnClick(R.id.picture) 42 | void picture() { 43 | startDemo(UgiRendererView.RENDER_MODE_PICTURE); 44 | } 45 | 46 | @OnClick(R.id.camera) 47 | void camera() { 48 | startDemo(UgiRendererView.RENDER_MODE_CAMERA_PREVIEW); 49 | } 50 | 51 | @NeedsPermission({ 52 | Manifest.permission.CAMERA, 53 | Manifest.permission.WRITE_EXTERNAL_STORAGE, 54 | }) 55 | void checkPermission() { 56 | ButterKnife.bind(this); 57 | } 58 | 59 | private void startDemo(int renderMode) { 60 | Intent intent = new Intent(this, 61 | portrait.isChecked() ? MainActivity.class : LandscapePreviewActivity.class); 62 | intent.putExtra(MainActivity.MODE_EXTRA_KEY, renderMode); 63 | intent.putExtra(MainActivity.CAMERA_FACE_EXTRA_KEY, 64 | frontCamera.isChecked() ? Camera.CameraInfo.CAMERA_FACING_FRONT 65 | : Camera.CameraInfo.CAMERA_FACING_BACK); 66 | startActivity(intent); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /AndroidExample/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /AndroidExample/src/main/res/drawable/awesomeface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Piasy/UltraGpuImage/c402307b4bf6682c5476d87de8e07b3616e6547c/AndroidExample/src/main/res/drawable/awesomeface.png -------------------------------------------------------------------------------- /AndroidExample/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /AndroidExample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 21 | 22 | 27 | 28 | 37 | 38 | 47 | 48 | 57 | 58 | 66 | 67 | 68 | 73 | 74 | 83 | 84 | 93 | 94 | 95 | 100 | 101 | 110 | 111 | 120 | 121 | 122 | 127 | 128 | 133 | 134 | 139 | 140 | 145 | 146 | 152 | 153 | -------------------------------------------------------------------------------- /AndroidExample/src/main/res/layout/activity_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |