MCPcopy Index your code
hub / github.com/MasayukiSuda/GPUVideo-android

github.com/MasayukiSuda/GPUVideo-android @v0.1.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.1.2 ↗ · + Follow
757 symbols 1,591 edges 105 files 59 documented · 8%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

GPUVideo-android

Platform API

This library apply video filter on generate an Mp4 and on ExoPlayer video and Video Recording with Camera2.

Android MediaCodec API is used this library.

Features

  • apply video filter, scale, and rotate Mp4.
  • apply video filter on ExoPlayer video.
  • apply video filter on Video Recording with Camera2.

apply video filter on generate an Mp4

Sample Video No filter GlGlayScaleFilter apply GlMonochromeFilter apply GlWatermarkFilter apply

apply video filter on ExoPlayer video

apply video filter on Video Recording with Camera2.

Gradle

Step 1. Add the JitPack repository to your build file

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Step 2. Add the dependency

dependencies {
        implementation 'com.github.MasayukiSuda:GPUVideo-android:v0.1.2'
        // if apply video filter on ExoPlayer video
        implementation 'com.google.android.exoplayer:exoplayer-core:2.15.1'
}

Sample Usage apply video filter on generate an Mp4

    new GPUMp4Composer(srcMp4Path, destMp4Path)
            .rotation(Rotation.ROTATION_90)
            .size((width) 540, (height) 960)
            .fillMode(FillMode.PRESERVE_ASPECT_FIT)
            .filter(new GlFilterGroup(new GlMonochromeFilter(), new GlVignetteFilter()))
            .listener(new GPUMp4Composer.Listener() {
                @Override
                public void onProgress(double progress) {
                    Log.d(TAG, "onProgress = " + progress);
                }

                @Override
                public void onCompleted() {
                    Log.d(TAG, "onCompleted()");
                    runOnUiThread(() -> {
                        Toast.makeText(context, "codec complete path =" + destPath, Toast.LENGTH_SHORT).show();
                    });
                }

                @Override
                public void onCanceled() {
                    Log.d(TAG, "onCanceled");
                }

                @Override
                public void onFailed(Exception exception) {
                    Log.e(TAG, "onFailed()", exception);
                }
            })
            .start();

Builder Method

method description
rotation Rotation of the movie, default Rotation.NORMAL
size Resolution of the movie, default same resolution of src movie
fillMode Options for scaling the bounds of an movie. PRESERVE_ASPECT_FIT is fit center. PRESERVE_ASPECT_CROP is center crop , default PRESERVE_ASPECT_FIT
filter This filter is OpenGL Shaders to apply effects on video. Custom filters can be created by inheriting GlFilter.java. , default GlFilter(No filter). Filters is here.
videoBitrate Set Video Bitrate, default video bitrate is 0.25 * 30 * outputWidth * outputHeight
mute Mute audio track on exported video. Default mute = false.
flipVertical Flip Vertical on exported video. Default flipVertical = false.
flipHorizontal Flip Horizontal on exported video. Default flipHorizontal = false.

Sample Usage apply video filter on ExoPlayer video

STEP 1

Create SimpleExoPlayer instance. In this case, play MP4 file.

Read this if you want to play other video formats.

    TrackSelector trackSelector = new DefaultTrackSelector();

    // Measures bandwidth during playback. Can be null if not required.
    DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
    // Produces DataSource instances through which media data is loaded.
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "yourApplicationName"), defaultBandwidthMeter);
    // This is the MediaSource representing the media to be played.
    MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(MP4_URL));

    // SimpleExoPlayer
    player = ExoPlayerFactory.newSimpleInstance(context, mediaSource);
    // Prepare the player with the source.
    player.prepare(videoSource);
    player.setPlayWhenReady(true);

STEP 2

Create GPUPlayerView and set SimpleExoPlayer to GPUPlayerView.

    gpuPlayerView = new GPUPlayerView(this);
    // set SimpleExoPlayer
    gpuPlayerView.setSimpleExoPlayer(player);
    gpuPlayerView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    // add gpuPlayerView to WrapperView
    ((MovieWrapperView) findViewById(R.id.layout_movie_wrapper)).addView(gpuPlayerView);
    gpuPlayerView.onResume();

STEP 3

Set Filter. Filters is here.

Custom filters can be created by inheriting GlFilter.java.

    gpuPlayerView.setGlFilter(new GlSepiaFilter());

Sample Usage apply video filter on Video Recording with Camera2.

SetUp on onResume method.

  sampleGLView = new GLSurfaceView(getApplicationContext());
  FrameLayout frameLayout = findViewById(R.id.wrap_view);
  frameLayout.addView(sampleGLView);

  gpuCameraRecorder = new GPUCameraRecorderBuilder(activity, sampleGLView)
    .lensFacing(LensFacing.BACK)
    .build();

Release on onPause method.

  sampleGLView.onPause();      

  gpuCameraRecorder.stop();
  gpuCameraRecorder.release();
  gpuCameraRecorder = null;

  ((FrameLayout) findViewById(R.id.wrap_view)).removeView(sampleGLView);
  sampleGLView = null;

Start and Stop Video record.

  // record start.
  gpuCameraRecorder.start(filepath);
  // record stop.
  gpuCameraRecorder.stop();

This filter is OpenGL Shaders to apply effects on camera preview. Custom filters can be created by inheriting GlFilter.java. , default GlFilter(No filter). Filters is here.

  gpuCameraRecorder.setFilter(GlFilter);

Other methods.

  // if flash enable, turn on or off camera flash. 
  gpuCameraRecorder.switchFlashMode();
  // autofocus change.
  gpuCameraRecorder.changeAutoFocus();
  // set focus point at manual.
  gpuCameraRecorder.changeManualFocusPoint(float eventX, float eventY, int viewWidth, int viewHeight); 
  // scale camera preview
  gpuCameraRecorder.setGestureScale(float scale);

Builder Method

method description
cameraRecordListener onGetFlashSupport, onRecordComplete, onError, and onCameraThreadFinish. Detail is here.
filter This filter is OpenGL Shaders to apply effects on camera preview. Custom filters can be created by inheriting GlFilter.java. , default GlFilter(No filter). Filters is here.
videoSize Resolution of the movie, default width=720, height=1280.
cameraSize Preview size.
lensFacing Select back or front camera. Default LensFacing.FRONT.
flipHorizontal Flip Horizontal on recorded video. Default flipHorizontal = false.
flipVertical Flip Vertical on recorded video. Default flipVertical = false.
mute Mute audio track on recorded video. Default mute = false.
recordNoFilter No Filter on recorded video although preview apply a filter. Default recordNoFilter = false.

Filters

  • Bilateral
  • BoxBlur
  • Brightness
  • BulgeDistortion
  • CGAColorspace
  • Contrast
  • Crosshatch
  • Exposure
  • FilterGroup
  • Gamma
  • GaussianBlur
  • GrayScale
  • Halftone
  • Haze
  • HighlightShadow
  • Hue
  • Invert
  • LookUpTable
  • Luminance
  • LuminanceThreshold
  • Monochrome
  • Opacity
  • Overlay
  • Pixelation
  • Posterize
  • RGB
  • Saturation
  • Sepia
  • Sharpen
  • Solarize
  • SphereRefraction
  • Swirl
  • ToneCurve
  • Tone
  • Vibrance
  • Vignette
  • Watermark
  • WeakPixelInclusion
  • WhiteBalance
  • ZoomBlur

References And Special Thanks to

Sample Dependencies

License

MIT License

ExoPlayer and ExoPlayer demo.

Copyright (C) 2014 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Extension points exported contracts — how you extend this code

CameraRecordListener (Interface)
Created by sudamasayuki on 2018/03/13. [1 implementers]
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/CameraRecordListener.java
TouchListener (Interface)
(no doc) [1 implementers]
sample/src/main/java/com/daasuu/gpuvideoandroid/widget/SampleCameraGLView.java
Listener (Interface)
(no doc) [1 implementers]
gpuv/src/main/java/com/daasuu/gpuv/composer/GPUMp4Composer.java
Callback (Interface)
(no doc) [1 implementers]
sample/src/main/java/com/daasuu/gpuvideoandroid/widget/PlayerTimer.java
MediaEncoderListener (Interface)
(no doc) [1 implementers]
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/capture/MediaEncoder.java
VideoLoadListener (Interface)
(no doc) [1 implementers]
sample/src/main/java/com/daasuu/gpuvideoandroid/compose/VideoLoadListener.java
SurfaceCreateListener (Interface)
(no doc) [1 implementers]
gpuv/src/main/java/com/daasuu/gpuv/egl/GlPreviewRenderer.java
FilterAdjuster (Interface)
(no doc)
sample/src/main/java/com/daasuu/gpuvideoandroid/FilterAdjuster.java

Core symbols most depended-on inside this repo

getHandle
called by 97
gpuv/src/main/java/com/daasuu/gpuv/egl/filter/GlFilter.java
release
called by 42
gpuv/src/main/java/com/daasuu/gpuv/composer/IAudioComposer.java
range
called by 26
sample/src/main/java/com/daasuu/gpuvideoandroid/FilterType.java
setup
called by 25
gpuv/src/main/java/com/daasuu/gpuv/composer/IAudioComposer.java
getWidth
called by 22
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/capture/EglSurface.java
getHeight
called by 22
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/capture/EglSurface.java
getWidth
called by 14
gpuv/src/main/java/com/daasuu/gpuv/egl/GlFramebufferObject.java
getHeight
called by 14
gpuv/src/main/java/com/daasuu/gpuv/egl/GlFramebufferObject.java

Shape

Method 637
Class 101
Interface 12
Enum 7

Languages

Java99%
Kotlin1%

Modules by API surface

gpuv/src/main/java/com/daasuu/gpuv/composer/GPUMp4Composer.java26 symbols
sample/src/main/java/com/daasuu/gpuvideoandroid/BaseCameraActivity.java25 symbols
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/GPUCameraRecorder.java22 symbols
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/CameraThread.java21 symbols
gpuv/src/main/java/com/daasuu/gpuv/egl/GlPreviewRenderer.java19 symbols
sample/src/main/java/com/daasuu/gpuvideoandroid/Mp4ComposeActivity.java17 symbols
gpuv/src/main/java/com/daasuu/gpuv/egl/filter/GlToneCurveFilter.java17 symbols
sample/src/main/java/com/daasuu/gpuvideoandroid/PlayerActivity.java16 symbols
gpuv/src/main/java/com/daasuu/gpuv/composer/DecoderSurface.java16 symbols
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/capture/MediaEncoder.java16 symbols
gpuv/src/main/java/com/daasuu/gpuv/camerarecorder/capture/EglWrapper.java16 symbols
gpuv/src/main/java/com/daasuu/gpuv/composer/FillModeCustomItem.java12 symbols

For agents

$ claude mcp add GPUVideo-android \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact