Skip to content

Commit

Permalink
feature: 支持GLTextureView
Browse files Browse the repository at this point in the history
  • Loading branch information
dengzhuoyao committed Aug 19, 2020
1 parent cf6fa3f commit 3f67801
Show file tree
Hide file tree
Showing 11 changed files with 2,123 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ import com.ss.ugc.android.alpha_player.player.DefaultSystemPlayer
import com.ss.ugc.android.alpha_player.player.IMediaPlayer
import com.ss.ugc.android.alpha_player.player.PlayerState
import com.ss.ugc.android.alpha_player.render.VideoRenderer
import com.ss.ugc.android.alpha_player.widget.AlphaVideoView
import com.ss.ugc.android.alpha_player.widget.AlphaVideoGLSurfaceView
import com.ss.ugc.android.alpha_player.widget.AlphaVideoGLTextureView
import com.ss.ugc.android.alpha_player.widget.IAlphaVideoView
import java.io.File
import java.lang.Exception

Expand Down Expand Up @@ -55,8 +57,8 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
val context: Context
var mMonitor: IMonitor? = null
var mPlayerAction: IPlayerAction? = null
val mediaPlayer: IMediaPlayer
var alphaVideoView: AlphaVideoView? = null
var mediaPlayer: IMediaPlayer
lateinit var alphaVideoView: IAlphaVideoView

var workHandler: Handler? = null
val mainHandler: Handler = Handler(Looper.getMainLooper())
Expand Down Expand Up @@ -91,12 +93,12 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
}

private fun initAlphaView() {
alphaVideoView = AlphaVideoView(context, null)
alphaVideoView!!.let {
alphaVideoView = AlphaVideoGLSurfaceView(context, null)
alphaVideoView.let {
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
it.layoutParams = layoutParams
it.setLayoutParams(layoutParams)
it.setPlayerController(this)
it.setVideoRenderer(VideoRenderer(it))
}
Expand All @@ -115,23 +117,18 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
}

override fun setVisibility(visibility: Int) {
alphaVideoView!!.visibility = visibility
alphaVideoView.setVisibility(visibility)
if (visibility == View.VISIBLE) {
alphaVideoView!!.bringToFront()
alphaVideoView.bringToFront()
}
}

override fun attachAlphaView(parentView: ViewGroup) {
if (parentView.indexOfChild(alphaVideoView) == -1) {
alphaVideoView!!.parent?.let {
(it as ViewGroup).removeView(alphaVideoView)
}
parentView.addView(alphaVideoView)
}
alphaVideoView.addParentView(parentView)
}

override fun detachAlphaView(parentView: ViewGroup) {
parentView.removeView(alphaVideoView)
alphaVideoView.removeParentView(parentView)
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
Expand Down Expand Up @@ -207,7 +204,7 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
}

override fun getView(): View {
return alphaVideoView!!
return alphaVideoView.getView()
}

override fun getPlayerType(): String {
Expand All @@ -216,18 +213,24 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe

@WorkerThread
private fun initPlayer() {
mediaPlayer.initMediaPlayer()
try {
mediaPlayer.initMediaPlayer()
} catch (e: Exception) {
mediaPlayer = DefaultSystemPlayer()
mediaPlayer.initMediaPlayer()
// TODO: add log
}
mediaPlayer.setScreenOnWhilePlaying(true)
mediaPlayer.setLooping(false)

mediaPlayer.setOnFirstFrameListener(object : IMediaPlayer.OnFirstFrameListener {
override fun onFirstFrame() {
alphaVideoView!!.onFirstFrame()
alphaVideoView.onFirstFrame()
}
})
mediaPlayer.setOnCompletionListener(object : IMediaPlayer.OnCompletionListener {
override fun onCompletion() {
alphaVideoView!!.onCompletion()
alphaVideoView.onCompletion()
playerState = PlayerState.PAUSED
monitor(true, errorInfo = "")
emitEndSignal()
Expand Down Expand Up @@ -260,17 +263,17 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
return
}
scaleType?.let {
alphaVideoView!!.setScaleType(it)
alphaVideoView.setScaleType(it)
}
mediaPlayer.setDataSource(dataPath)
if (alphaVideoView!!.isSurfaceCreated) {
if (alphaVideoView.isSurfaceCreated()) {
prepareAsync()
}
}

@WorkerThread
private fun prepareAsync() {
mediaPlayer?.let {
mediaPlayer.let {
if (playerState == PlayerState.NOT_PREPARED || playerState == PlayerState.STOPPED) {
it.setOnPreparedListener(mPreparedListener)
it.setOnErrorListener(mErrorListener)
Expand Down Expand Up @@ -309,9 +312,9 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
@WorkerThread
private fun parseVideoSize() {
val videoInfo = mediaPlayer.getVideoInfo()
alphaVideoView!!.measureInternal((videoInfo.videoWidth / 2).toFloat(), videoInfo.videoHeight.toFloat())
alphaVideoView.measureInternal((videoInfo.videoWidth / 2).toFloat(), videoInfo.videoHeight.toFloat())

val scaleType = alphaVideoView!!.mScaleType
val scaleType = alphaVideoView.getScaleType()
mainHandler.post {
mPlayerAction?.onVideoSizeChanged(videoInfo.videoWidth / 2, videoInfo.videoHeight, scaleType)
}
Expand Down Expand Up @@ -366,7 +369,7 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
}
}
DESTROY -> {
alphaVideoView!!.onPause()
alphaVideoView.onPause()
if (playerState == PlayerState.STARTED) {
mediaPlayer.pause()
playerState = PlayerState.PAUSED
Expand All @@ -376,7 +379,7 @@ class PlayerController(context: Context, owner: LifecycleOwner, mediaPlayer: IMe
playerState = PlayerState.STOPPED
}
mediaPlayer.release()
alphaVideoView!!.release()
alphaVideoView.release()
playerState = PlayerState.RELEASE

playThread?.let {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.ss.ugc.android.alpha_player.player

import android.content.Context
import android.media.MediaMetadataRetriever
import android.media.MediaPlayer
import android.text.TextUtils
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.ss.ugc.android.alpha_player.player
import android.view.Surface
import com.ss.ugc.android.alpha_player.model.VideoInfo
import java.io.IOException
import java.lang.Exception

/**
* created by dengzhuoyao on 2020/07/07
Expand Down Expand Up @@ -36,6 +35,7 @@ interface IMediaPlayer {
/**
* Maybe will init mediaPlayer on sub thread.
*/
@Throws(Exception::class)
fun initMediaPlayer()

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ import android.graphics.SurfaceTexture
import android.opengl.GLSurfaceView
import android.view.Surface
import com.ss.ugc.android.alpha_player.model.ScaleType
import com.ss.ugc.android.alpha_player.widget.GLTextureView

/**
* created by dengzhuoyao on 2020/07/07
*
* A generic renderer with opengles interface.
*/
interface IRender : GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {
interface IRender : GLTextureView.Renderer, GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {

fun setSurfaceListener(surfaceListener: SurfaceListener)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package com.ss.ugc.android.alpha_player.render

import android.graphics.SurfaceTexture
import android.opengl.GLES20
import android.opengl.GLSurfaceView
import android.opengl.Matrix
import android.os.Build
import android.util.Log
import android.view.Surface
import com.ss.ugc.android.alpha_player.model.ScaleType
import com.ss.ugc.android.alpha_player.utils.ShaderUtil
import com.ss.ugc.android.alpha_player.utils.TextureCropUtil
import com.ss.ugc.android.alpha_player.widget.IAlphaVideoView
import java.lang.Exception
import java.nio.ByteBuffer
import java.nio.ByteOrder
Expand All @@ -21,7 +21,7 @@ import javax.microedition.khronos.opengles.GL10
/**
* created by dengzhuoyao on 2020/07/07
*/
class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {
class VideoRenderer(val alphaVideoView: IAlphaVideoView) : IRender {

private val TAG = "VideoRender"

Expand Down Expand Up @@ -67,7 +67,6 @@ class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {

private var surfaceTexture: SurfaceTexture? = null
private var surfaceListener: IRender.SurfaceListener? = null
private var glSurfaceView: GLSurfaceView? = glSurfaceView
private var scaleType = ScaleType.ScaleAspectFill

init {
Expand Down Expand Up @@ -186,6 +185,10 @@ class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {
prepareSurface()
}

override fun onSurfaceDestroyed(gl: GL10?) {
surfaceListener?.onSurfaceDestroyed()
}

private fun prepareSurface() {
val textures = IntArray(1)
GLES20.glGenTextures(1, textures, 0)
Expand All @@ -206,8 +209,8 @@ class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {
surfaceTexture = SurfaceTexture(textureID)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
surfaceTexture!!.setDefaultBufferSize(
glSurfaceView!!.measuredWidth,
glSurfaceView!!.measuredHeight
alphaVideoView.getMeasuredWidth(),
alphaVideoView.getMeasuredHeight()
)
}
surfaceTexture!!.setOnFrameAvailableListener(this)
Expand All @@ -221,19 +224,19 @@ class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {

override fun onFrameAvailable(surface: SurfaceTexture) {
updateSurface.compareAndSet(false, true)
glSurfaceView!!.requestRender()
alphaVideoView.requestRender()
}

override fun onFirstFrame() {
canDraw.compareAndSet(false, true)
Log.i(TAG, "onFirstFrame: canDraw = " + canDraw.get())
glSurfaceView!!.requestRender()
alphaVideoView.requestRender()
}

override fun onCompletion() {
canDraw.compareAndSet(true, false)
Log.i(TAG, "onCompletion: canDraw = " + canDraw.get())
glSurfaceView!!.requestRender()
alphaVideoView.requestRender()
}

/**
Expand Down Expand Up @@ -270,8 +273,8 @@ class VideoRenderer(glSurfaceView: GLSurfaceView) : IRender {
* @return programID If link program success, it will return program handle, else return 0.
*/
private fun createProgram(): Int {
val vertexSource = ShaderUtil.loadFromAssetsFile("vertex.sh", glSurfaceView!!.resources)
val fragmentSource = ShaderUtil.loadFromAssetsFile("frag.sh", glSurfaceView!!.resources)
val vertexSource = ShaderUtil.loadFromAssetsFile("vertex.sh", alphaVideoView.getView().resources)
val fragmentSource = ShaderUtil.loadFromAssetsFile("frag.sh", alphaVideoView.getView().resources)

val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource)
if (vertexShader == 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,25 @@ import android.graphics.PixelFormat
import android.opengl.GLSurfaceView
import android.util.AttributeSet
import android.view.Surface
import android.view.View
import android.view.ViewGroup
import com.ss.ugc.android.alpha_player.controller.IPlayerControllerExt
import com.ss.ugc.android.alpha_player.model.ScaleType
import com.ss.ugc.android.alpha_player.render.IRender

/**
* created by dengzhuoyao on 2020/07/07
*/
class AlphaVideoView @JvmOverloads constructor(context: Context, attr: AttributeSet? = null)
: GLSurfaceView(context, attr) {
class AlphaVideoGLSurfaceView @JvmOverloads constructor(context: Context, attr: AttributeSet? = null)
: GLSurfaceView(context, attr), IAlphaVideoView {

val GL_CONTEXT_VERSION = 2

@Volatile
var isSurfaceCreated: Boolean = false
private var isSurfaceCreated: Boolean = false
override fun isSurfaceCreated(): Boolean {
return isSurfaceCreated
}

var mVideoWidth: Float = 0f
var mVideoHeight: Float = 0f
Expand All @@ -28,7 +33,7 @@ class AlphaVideoView @JvmOverloads constructor(context: Context, attr: Attribute
var mPlayerController: IPlayerControllerExt? = null
var mSurface: Surface? = null

val mSurfaceListener = object: IRender.SurfaceListener {
private val mSurfaceListener = object: IRender.SurfaceListener {
override fun onSurfacePrepared(surface: Surface) {
mSurface?.release()
mSurface = surface
Expand Down Expand Up @@ -57,23 +62,44 @@ class AlphaVideoView @JvmOverloads constructor(context: Context, attr: Attribute
mRenderer?.setSurfaceListener(mSurfaceListener)
}

fun setPlayerController(playerController: IPlayerControllerExt) {
override fun addParentView(parentView: ViewGroup) {
if (parentView.indexOfChild(this) == -1) {
this.parent?.let {
(it as ViewGroup).removeView(this)
}
parentView.addView(this)
}
}

override fun removeParentView(parentView: ViewGroup) {
parentView.removeView(this)
}

override fun getView(): View {
return this
}

override fun setPlayerController(playerController: IPlayerControllerExt) {
this.mPlayerController = playerController
}

fun setVideoRenderer(renderer: IRender) {
override fun setVideoRenderer(renderer: IRender) {
this.mRenderer = renderer
setRenderer(renderer)
addOnSurfacePreparedListener()
renderMode = RENDERMODE_WHEN_DIRTY
}

fun setScaleType(scaleType: ScaleType) {
override fun setScaleType(scaleType: ScaleType) {
this.mScaleType = scaleType
mRenderer?.setScaleType(scaleType)
}

fun measureInternal(videoWidth: Float, videoHeight: Float) {
override fun getScaleType(): ScaleType {
return mScaleType
}

override fun measureInternal(videoWidth: Float, videoHeight: Float) {
if (videoWidth > 0 && videoHeight > 0) {
mVideoWidth = videoWidth
mVideoHeight = videoHeight
Expand All @@ -87,11 +113,11 @@ class AlphaVideoView @JvmOverloads constructor(context: Context, attr: Attribute
}
}

fun onFirstFrame() {
override fun onFirstFrame() {
mRenderer?.onFirstFrame()
}

fun onCompletion() {
override fun onCompletion() {
mRenderer?.onCompletion()
}

Expand All @@ -100,7 +126,7 @@ class AlphaVideoView @JvmOverloads constructor(context: Context, attr: Attribute
measureInternal(mVideoWidth, mVideoHeight)
}

fun release() {
override fun release() {
mSurfaceListener.onSurfaceDestroyed()
}
}
Loading

0 comments on commit 3f67801

Please sign in to comment.