diff --git a/README.md b/README.md index a5b2358..739485a 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,9 @@ Custom filters can be created by inheriting [GlFilter.java](https://github.com/M ePlayerView.setGlFilter(new GlSepiaFilter()); ``` +## AlphaVideo +Use `AlphaFrameFilter` render video with alpha +[how-to-create-an-alpha-video](https://felgo.com/doc/felgo-alphavideo/#how-to-create-an-alpha-video) ## Special Thanks to * [android-gpuimage](https://github.com/CyberAgent/android-gpuimage) diff --git a/epf/src/main/java/com/daasuu/epf/EPlayerRenderer.java b/epf/src/main/java/com/daasuu/epf/EPlayerRenderer.java index 74b37e7..0c03035 100644 --- a/epf/src/main/java/com/daasuu/epf/EPlayerRenderer.java +++ b/epf/src/main/java/com/daasuu/epf/EPlayerRenderer.java @@ -77,7 +77,7 @@ public void run() { @Override public void onSurfaceCreated(final EGLConfig config) { - GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); final int[] args = new int[1]; @@ -136,6 +136,8 @@ public void onSurfaceChanged(final int width, final int height) { @Override public void onDrawFrame(final EFramebufferObject fbo) { + GLES20.glEnable(GLES20.GL_BLEND); + GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); synchronized (this) { if (updateSurface) { diff --git a/epf/src/main/java/com/daasuu/epf/EPlayerView.java b/epf/src/main/java/com/daasuu/epf/EPlayerView.java index ef88354..196c94d 100644 --- a/epf/src/main/java/com/daasuu/epf/EPlayerView.java +++ b/epf/src/main/java/com/daasuu/epf/EPlayerView.java @@ -1,11 +1,13 @@ package com.daasuu.epf; import android.content.Context; +import android.graphics.PixelFormat; import android.opengl.GLSurfaceView; import android.util.AttributeSet; import com.daasuu.epf.chooser.EConfigChooser; import com.daasuu.epf.contextfactory.EContextFactory; +import com.daasuu.epf.filter.AlphaFrameFilter; import com.daasuu.epf.filter.GlFilter; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.video.VideoListener; @@ -33,9 +35,12 @@ public EPlayerView(Context context, AttributeSet attrs) { setEGLContextFactory(new EContextFactory()); setEGLConfigChooser(new EConfigChooser()); + setZOrderOnTop(true); + setEGLConfigChooser(8, 8, 8, 8, 16, 0); + getHolder().setFormat(PixelFormat.RGBA_8888); + renderer = new EPlayerRenderer(this); setRenderer(renderer); - } public EPlayerView setSimpleExoPlayer(SimpleExoPlayer player) { @@ -49,8 +54,23 @@ public EPlayerView setSimpleExoPlayer(SimpleExoPlayer player) { return this; } + private GlFilter filter = null; public void setGlFilter(GlFilter glFilter) { renderer.setGlFilter(glFilter); + if (glFilter != null) { + if (glFilter instanceof AlphaFrameFilter) { + videoAspect = videoAspect * 2; + requestLayout(); + } else { + if (filter != null) { + if (filter instanceof AlphaFrameFilter) { + videoAspect = videoAspect / 2; + requestLayout(); + } + } + } + } + filter = glFilter; } public void setPlayerScaleType(PlayerScaleType playerScaleType) { diff --git a/epf/src/main/java/com/daasuu/epf/filter/AlphaFrameFilter.java b/epf/src/main/java/com/daasuu/epf/filter/AlphaFrameFilter.java new file mode 100644 index 0000000..b2818c4 --- /dev/null +++ b/epf/src/main/java/com/daasuu/epf/filter/AlphaFrameFilter.java @@ -0,0 +1,28 @@ +package com.daasuu.epf.filter; + +public class AlphaFrameFilter extends GlFilter { + private static final String VERTEX_SHADER = + "attribute vec4 aPosition;\n" + + "attribute vec4 aTextureCoord;\n" + + "varying highp vec2 vTextureCoord;\n" + + "varying highp vec2 vTextureCoord2;\n" + + "void main() {\n" + + "gl_Position = aPosition;\n" + + "vTextureCoord = vec2(aTextureCoord.x, aTextureCoord.y*0.5+0.5);\n" + + "vTextureCoord2 = vec2(aTextureCoord.x, aTextureCoord.y*0.5);\n" + + "}\n"; + private static final String FRAGMENT_SHADER = + "precision mediump float;\n" + + "varying highp vec2 vTextureCoord;\n" + + "varying highp vec2 vTextureCoord2;\n" + + "uniform lowp sampler2D sTexture;\n" + + "void main() {\n" + + "vec4 color1 = texture2D(sTexture, vTextureCoord);\n" + + "vec4 color2 = texture2D(sTexture, vTextureCoord2);\n" + + "gl_FragColor = vec4(color1.rgb, color2.r);\n" + + "}\n"; + + public AlphaFrameFilter() { + super(VERTEX_SHADER, FRAGMENT_SHADER); + } +} diff --git a/sample/src/main/assets/playdoh_bat.mp4 b/sample/src/main/assets/playdoh_bat.mp4 new file mode 100755 index 0000000..9c83ca6 Binary files /dev/null and b/sample/src/main/assets/playdoh_bat.mp4 differ diff --git a/sample/src/main/java/com/daasuu/exoplayerfilter/FilterType.java b/sample/src/main/java/com/daasuu/exoplayerfilter/FilterType.java index fc10fb3..9de3f1d 100644 --- a/sample/src/main/java/com/daasuu/exoplayerfilter/FilterType.java +++ b/sample/src/main/java/com/daasuu/exoplayerfilter/FilterType.java @@ -5,6 +5,7 @@ import android.graphics.BitmapFactory; import android.util.Log; +import com.daasuu.epf.filter.AlphaFrameFilter; import com.daasuu.epf.filter.GlBilateralFilter; import com.daasuu.epf.filter.GlBoxBlurFilter; import com.daasuu.epf.filter.GlBrightnessFilter; @@ -58,6 +59,7 @@ public enum FilterType { DEFAULT, + ALPHA_FRAME, BITMAP_OVERLAY_SAMPLE, BILATERAL_BLUR, BOX_BLUR, @@ -98,8 +100,7 @@ public enum FilterType { WATERMARK, WEAK_PIXEL, WHITE_BALANCE, - ZOOM_BLUR, - ; + ZOOM_BLUR; public static List createFilterList() { @@ -269,6 +270,8 @@ public static GlFilter createGlFilter(FilterType filterType, Context context) { return new GlZoomBlurFilter(); case BITMAP_OVERLAY_SAMPLE: return new GlBitmapOverlaySample(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher_round)); + case ALPHA_FRAME: + return new AlphaFrameFilter(); default: return new GlFilter(); } diff --git a/sample/src/main/java/com/daasuu/exoplayerfilter/MainActivity.java b/sample/src/main/java/com/daasuu/exoplayerfilter/MainActivity.java index d5f20a0..418e172 100644 --- a/sample/src/main/java/com/daasuu/exoplayerfilter/MainActivity.java +++ b/sample/src/main/java/com/daasuu/exoplayerfilter/MainActivity.java @@ -123,8 +123,9 @@ private void setUpSimpleExoPlayer() { DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "yourApplicationName")); // This is the MediaSource representing the media to be played. - MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory) - .createMediaSource(Uri.parse(Constant.STREAM_URL_MP4_VOD_LONG)); +// MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory) +// .createMediaSource(Uri.parse(Constant.STREAM_URL_MP4_VOD_LONG)); + MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse("asset:///playdoh_bat.mp4")); // SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this); diff --git a/sample/src/main/java/com/daasuu/exoplayerfilter/MovieWrapperView.java b/sample/src/main/java/com/daasuu/exoplayerfilter/MovieWrapperView.java index 75db40d..51449a2 100644 --- a/sample/src/main/java/com/daasuu/exoplayerfilter/MovieWrapperView.java +++ b/sample/src/main/java/com/daasuu/exoplayerfilter/MovieWrapperView.java @@ -25,10 +25,4 @@ public MovieWrapperView(@NonNull Context context, @Nullable AttributeSet attrs, super(context, attrs, defStyleAttr); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int measuredWidth = getMeasuredWidth(); - setMeasuredDimension(measuredWidth, measuredWidth / 16 * 9); - } } diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index 7fceacd..561490e 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -9,6 +9,7 @@