From ec7daeae282918b13ed4321f409f04fc599903a5 Mon Sep 17 00:00:00 2001 From: CoXier Date: Sun, 19 Feb 2017 14:13:49 +0800 Subject: [PATCH] feat use ParsingMedia to manage Player and TextureView --- .../parsingplayer/parser/VideoParser.java | 2 +- .../parser/extractor/BilibiliExtractor.java | 2 +- .../parser/extractor/YoukuExtractor.java | 4 +- .../player/android/VideoActivity.java | 4 +- .../player/io/ConcatExecutorService.java | 2 +- .../player/{ => io}/FileMediaDataSource.java | 3 +- .../player/io/ParsingFileManager.java | 2 +- .../player/{ => media}/IParsingPlayer.java | 2 +- .../player/media/ParsingMedia.java | 69 ++++++ .../player/{ => media}/ParsingPlayer.java | 28 +-- .../player/{ => media}/ParsingTask.java | 5 +- .../player/{ => view}/ControllerView.java | 2 +- .../player/{ => view}/IMediaController.java | 2 +- .../{ => view}/IMediaPlayerControl.java | 27 ++- .../player/{ => view}/IRenderView.java | 2 +- .../player/{ => view}/MeasureHelper.java | 4 +- .../player/{ => view}/ParsingVideoView.java | 199 +++++------------- .../player/{ => view}/QualityView.java | 4 +- .../player/{ => view}/TextureRenderView.java | 16 +- .../{ => view}/VerticalProgressBar.java | 5 +- .../parsingplayer/{ => util}/LogUtil.java | 4 +- .../parsingplayer/{ => util}/Util.java | 2 +- .../src/main/res/layout/activity_video.xml | 2 +- .../main/res/layout/parsing_video_view.xml | 4 +- .../src/main/res/layout/slide_panel.xml | 2 +- .../com/hustunique/sample/MainActivity.java | 2 +- sample/src/main/res/layout/activity_main.xml | 2 +- 27 files changed, 177 insertions(+), 225 deletions(-) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => io}/FileMediaDataSource.java (96%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => media}/IParsingPlayer.java (97%) create mode 100644 parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingMedia.java rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => media}/ParsingPlayer.java (94%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => media}/ParsingTask.java (92%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/ControllerView.java (99%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/IMediaController.java (94%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/IMediaPlayerControl.java (82%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/IRenderView.java (97%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/MeasureHelper.java (98%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/ParsingVideoView.java (87%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/QualityView.java (97%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/TextureRenderView.java (97%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/player/{ => view}/VerticalProgressBar.java (94%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/{ => util}/LogUtil.java (95%) rename parsingplayer/src/main/java/com/hustunique/parsingplayer/{ => util}/Util.java (99%) diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/VideoParser.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/VideoParser.java index 82a436e..1d28f5b 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/VideoParser.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/VideoParser.java @@ -21,7 +21,7 @@ import android.support.annotation.Nullable; import android.util.Log; -import com.hustunique.parsingplayer.LogUtil; +import com.hustunique.parsingplayer.util.LogUtil; import com.hustunique.parsingplayer.parser.entity.VideoInfo; import com.hustunique.parsingplayer.parser.extractor.BilibiliExtractor; import com.hustunique.parsingplayer.parser.extractor.Extractor; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/BilibiliExtractor.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/BilibiliExtractor.java index 292369e..b7568cd 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/BilibiliExtractor.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/BilibiliExtractor.java @@ -23,7 +23,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.hustunique.parsingplayer.Util; +import com.hustunique.parsingplayer.util.Util; import com.hustunique.parsingplayer.parser.entity.Seg; import com.hustunique.parsingplayer.parser.entity.Stream; import com.hustunique.parsingplayer.parser.entity.VideoInfo; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/YoukuExtractor.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/YoukuExtractor.java index 27256f3..4c6a1ab 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/YoukuExtractor.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/parser/extractor/YoukuExtractor.java @@ -27,8 +27,8 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.hustunique.parsingplayer.LogUtil; -import com.hustunique.parsingplayer.Util; +import com.hustunique.parsingplayer.util.LogUtil; +import com.hustunique.parsingplayer.util.Util; import com.hustunique.parsingplayer.parser.ExtractException; import com.hustunique.parsingplayer.parser.entity.Seg; import com.hustunique.parsingplayer.parser.entity.Stream; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/android/VideoActivity.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/android/VideoActivity.java index d69c6a4..e1af2e1 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/android/VideoActivity.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/android/VideoActivity.java @@ -30,9 +30,9 @@ import android.view.View; import android.view.WindowManager; -import com.hustunique.parsingplayer.LogUtil; +import com.hustunique.parsingplayer.util.LogUtil; import com.hustunique.parsingplayer.R; -import com.hustunique.parsingplayer.player.ParsingVideoView; +import com.hustunique.parsingplayer.player.view.ParsingVideoView; import tv.danmaku.ijk.media.player.IMediaPlayer; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ConcatExecutorService.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ConcatExecutorService.java index a9abc3f..7ea2d77 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ConcatExecutorService.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ConcatExecutorService.java @@ -17,7 +17,7 @@ package com.hustunique.parsingplayer.player.io; -import com.hustunique.parsingplayer.Util; +import com.hustunique.parsingplayer.util.Util; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/FileMediaDataSource.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/FileMediaDataSource.java similarity index 96% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/FileMediaDataSource.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/FileMediaDataSource.java index 5ddf9e7..6d1e420 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/FileMediaDataSource.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/FileMediaDataSource.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.io; import java.io.File; import java.io.IOException; @@ -23,6 +23,7 @@ import tv.danmaku.ijk.media.player.misc.IMediaDataSource; +@Deprecated public class FileMediaDataSource implements IMediaDataSource { private RandomAccessFile mFile; private long mFileSize; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ParsingFileManager.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ParsingFileManager.java index 0484315..d6533d9 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ParsingFileManager.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/io/ParsingFileManager.java @@ -19,7 +19,7 @@ import android.util.Log; -import com.hustunique.parsingplayer.Util; +import com.hustunique.parsingplayer.util.Util; import java.io.File; import java.io.FileNotFoundException; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IParsingPlayer.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/IParsingPlayer.java similarity index 97% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IParsingPlayer.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/IParsingPlayer.java index f2f9060..eb9eede 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IParsingPlayer.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/IParsingPlayer.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.media; import android.support.annotation.IntDef; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingMedia.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingMedia.java new file mode 100644 index 0000000..f8eebe3 --- /dev/null +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingMedia.java @@ -0,0 +1,69 @@ +package com.hustunique.parsingplayer.player.media; + +import android.content.Context; +import android.net.Uri; +import android.view.Surface; +import android.view.SurfaceHolder; + +import com.hustunique.parsingplayer.player.io.LoadingCallback; +import com.hustunique.parsingplayer.player.view.TextureRenderView; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.util.Map; + +import tv.danmaku.ijk.media.player.BuildConfig; +import tv.danmaku.ijk.media.player.MediaInfo; +import tv.danmaku.ijk.media.player.misc.IMediaDataSource; +import tv.danmaku.ijk.media.player.misc.ITrackInfo; + +/** + * Created by CoXier on 17-2-19. + */ + +public class ParsingMedia { + + private IParsingPlayer mPlayer; + private TextureRenderView mRenderView; + + private static ParsingMedia mManager; + + private ParsingMedia(Context context){ + mPlayer = createPlayer(context); + } + + public static ParsingMedia getInstance(Context context){ + if (mManager == null) + mManager = new ParsingMedia(context); + return mManager; + } + + public void configurePlayer(IParsingPlayer player){ + mPlayer = player; + } + + public void configureRenderView(TextureRenderView renderView){ + mRenderView = renderView; + } + + public IParsingPlayer getPlayer(){ + return mPlayer; + } + + public TextureRenderView getRenderView(){ + return mRenderView; + } + + private IParsingPlayer createPlayer(Context context) { + IParsingPlayer iParsingPlayer = new ParsingPlayer(context); + iParsingPlayer.setOnPreparedListener(mPreparedListener); + iParsingPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); + iParsingPlayer.setOnCompletionListener(mCompletionListener); + iParsingPlayer.setOnErrorListener(mErrorListener); + iParsingPlayer.setOnInfoListener(mInfoListener); + iParsingPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); + iParsingPlayer.setOnSeekCompleteListener(mSeekCompleteListener); + return iParsingPlayer; + } + +} diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingPlayer.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingPlayer.java similarity index 94% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingPlayer.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingPlayer.java index c561250..afa1522 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingPlayer.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingPlayer.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.media; import android.content.Context; import android.net.Uri; @@ -27,7 +27,7 @@ import android.view.SurfaceHolder; import com.hustunique.parsingplayer.BuildConfig; -import com.hustunique.parsingplayer.Util; +import com.hustunique.parsingplayer.util.Util; import com.hustunique.parsingplayer.player.io.LoadingCallback; import com.hustunique.parsingplayer.player.io.ParsingFileManager; @@ -53,35 +53,17 @@ public class ParsingPlayer implements IParsingPlayer { private final IjkMediaPlayer mMediaPlayer; private final ParsingFileManager mManager; - private static ParsingPlayer mSingleton; - - - public static ParsingPlayer getInstance(Context context) { - return getInstance(context, new Config()); - } - - public static ParsingPlayer getInstance(@NonNull Context context, @Nullable Config config) { - if (context == null) throw new IllegalArgumentException("context == null"); - if (mSingleton == null) { - synchronized (ParsingPlayer.class) { - if (mSingleton == null) { - mSingleton = new ParsingPlayer(context, config); - } - } - } - return mSingleton; + public ParsingPlayer(Context context) { + this(context, new Config()); } - - private ParsingPlayer(Context context, Config config) { + public ParsingPlayer(Context context, Config config) { mMediaPlayer = createPlayer(config); mManager = ParsingFileManager.getInstance(Util.getDiskCacheDir(context, CACHE_DIR)); } - - public void setOption(@OptionCategory int category, String name, String value) { if (mMediaPlayer != null) { mMediaPlayer.setOption(category, name, value); diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingTask.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingTask.java similarity index 92% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingTask.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingTask.java index 8ae9fb6..8e012a3 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingTask.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/media/ParsingTask.java @@ -15,13 +15,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.media; import android.os.AsyncTask; import com.hustunique.parsingplayer.parser.VideoParser; import com.hustunique.parsingplayer.parser.entity.VideoInfo; import com.hustunique.parsingplayer.parser.provider.Quality; +import com.hustunique.parsingplayer.player.view.ParsingVideoView; /** * Created by CoXier on 17-2-7. @@ -47,7 +48,5 @@ protected void onPostExecute(VideoInfo videoInfo) { super.onPostExecute(videoInfo); // videoView will start playing automatically when process prepared mVideoView.setConcatVideos(videoInfo, mQuality); - - } } diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ControllerView.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ControllerView.java similarity index 99% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ControllerView.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ControllerView.java index 73cc14b..76e11f4 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ControllerView.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ControllerView.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.content.Context; import android.util.AttributeSet; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaController.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaController.java similarity index 94% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaController.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaController.java index b85006f..47e59fc 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaController.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaController.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; /** * Created by JianGuo on 1/20/17. diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaPlayerControl.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaPlayerControl.java similarity index 82% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaPlayerControl.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaPlayerControl.java index 23a7891..5d5dc39 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IMediaPlayerControl.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IMediaPlayerControl.java @@ -15,27 +15,37 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; /** * Created by JianGuo on 1/27/17. */ public interface IMediaPlayerControl { - void start(); - void pause(); - int getDuration(); - int getCurrentPosition(); - void seekTo(int pos); + void start(); + + void pause(); + + int getDuration(); + + int getCurrentPosition(); + + void seekTo(int pos); + boolean isPlaying(); - int getBufferPercentage(); + + int getBufferPercentage(); + boolean canPause(); + boolean canSeekBackward(); + boolean canSeekForward(); /** * As ParsingPlayer animated to parse video url and play real video address, * the param videoUrl is limited. + * * @param videoUrl */ void play(String videoUrl); @@ -43,7 +53,8 @@ public interface IMediaPlayerControl { /** * Get the audio session id for the player used by this VideoView. This can be used to * apply audio effects to the audio track of a video. + * * @return The audio session, or 0 if there was an error. */ - int getAudioSessionId(); + int getAudioSessionId(); } diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IRenderView.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IRenderView.java similarity index 97% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IRenderView.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IRenderView.java index 751cdb2..8dcd924 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/IRenderView.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/IRenderView.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.graphics.SurfaceTexture; import android.support.annotation.NonNull; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/MeasureHelper.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/MeasureHelper.java similarity index 98% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/MeasureHelper.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/MeasureHelper.java index 37a6d29..fe76559 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/MeasureHelper.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/MeasureHelper.java @@ -15,10 +15,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.view.View; +import com.hustunique.parsingplayer.player.view.IRenderView; + import java.lang.ref.WeakReference; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingVideoView.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ParsingVideoView.java similarity index 87% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingVideoView.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ParsingVideoView.java index 4b97718..4306de1 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/ParsingVideoView.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/ParsingVideoView.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.app.Activity; import android.content.Context; @@ -33,21 +33,23 @@ import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.util.Log; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; -import android.view.ScaleGestureDetector; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.RelativeLayout; -import com.hustunique.parsingplayer.LogUtil; +import com.hustunique.parsingplayer.player.media.ParsingMedia; +import com.hustunique.parsingplayer.util.LogUtil; import com.hustunique.parsingplayer.R; import com.hustunique.parsingplayer.parser.entity.VideoInfo; import com.hustunique.parsingplayer.parser.provider.ConcatSourceProvider; import com.hustunique.parsingplayer.parser.provider.Quality; import com.hustunique.parsingplayer.parser.provider.VideoInfoSourceProvider; +import com.hustunique.parsingplayer.player.media.IParsingPlayer; +import com.hustunique.parsingplayer.player.media.ParsingPlayer; +import com.hustunique.parsingplayer.player.media.ParsingTask; import com.hustunique.parsingplayer.player.io.LoadingCallback; import java.io.IOException; @@ -76,6 +78,7 @@ public class ParsingVideoView extends RelativeLayout implements IMediaPlayerCont private IMediaPlayer.OnInfoListener mOnInfoListener; private Context mContext; + private ParsingMedia mMedia; // all possible internal states private static final int STATE_ERROR = -1; @@ -119,7 +122,6 @@ public ParsingVideoView(Context context, AttributeSet attrs) { public ParsingVideoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); - initGesture(); LogUtil.w(TAG, "createView"); } @@ -127,7 +129,18 @@ public ParsingVideoView(Context context, AttributeSet attrs, int defStyleAttr) { public ParsingVideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); initView(context); - initGesture(); + } + + private void initView(Context context) { + mContext = context; + LayoutInflater.from(context).inflate(R.layout.parsing_video_view, this); + mRenderView = (TextureRenderView) findViewById(R.id.texture_view); + mControllerView = (ControllerView) findViewById(R.id.controller_view); + mMedia = ParsingMedia.getInstance(); + mRenderView.setOnClickListener(mRenderViewClickListener); + mControllerView.setFullscreenListener(mFullscreenListener); + mDecorView = (ViewGroup) ((Activity) getContext()).getWindow().getDecorView(); + mDecorView.setOnSystemUiVisibilityChangeListener(mSysUiChangeListener); } private void configurePlayer() { @@ -142,7 +155,7 @@ private void configurePlayer() { // visible for override protected IParsingPlayer createPlayer() { - IParsingPlayer iParsingPlayer = ParsingPlayer.getInstance(mContext); + IParsingPlayer iParsingPlayer = new ParsingPlayer(mContext); iParsingPlayer.setOnPreparedListener(mPreparedListener); iParsingPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); iParsingPlayer.setOnCompletionListener(mCompletionListener); @@ -150,23 +163,24 @@ protected IParsingPlayer createPlayer() { iParsingPlayer.setOnInfoListener(mInfoListener); iParsingPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); iParsingPlayer.setOnSeekCompleteListener(mSeekCompleteListener); - iParsingPlayer.setOnTimedTextListener(mOnTimedTextListener); return iParsingPlayer; } - private void initView(Context context) { - mContext = context; - LayoutInflater.from(context).inflate(R.layout.parsing_video_view, this); - mRenderView = (TextureRenderView) findViewById(R.id.texture_view); - mControllerView = (ControllerView) findViewById(R.id.controller_view); - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - mRenderView.setOnClickListener(mRenderViewClickListener); - mDecorView = (ViewGroup) ((Activity) getContext()).getWindow().getDecorView(); - mDecorView.setOnSystemUiVisibilityChangeListener(mSysUiChangeListener); - mControllerView.setFullscreenListener(mFullscreenListener); - } + // visible for override + protected void configureRenderView() { + mRenderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer); + mRenderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight()); + mRenderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), + mMediaPlayer.getVideoSarDen()); + mRenderView.setAspectRatioMode(mCurrentAspectRatio); + mRenderView.setAspectRatioMode(mCurrentAspectRatio); + if (mVideoWidth > 0 && mVideoHeight > 0) + mRenderView.setVideoSize(mVideoWidth, mVideoHeight); + if (mVideoSarNum > 0 && mVideoSarDen > 0) + mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); + mRenderView.addRenderCallback(mSHCallback); +// mRenderView.setVideoRotation(mVideoRotationDegree); + } void setQuality(@Quality int quality) { // We need to recreate a instance of player to play another video @@ -177,23 +191,6 @@ void setQuality(@Quality int quality) { setConcatContent(mProvider.provideSource(quality)); } - // visible for override - protected void configureRenderView() { - if (mMediaPlayer != null) { - mRenderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer); - mRenderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight()); - mRenderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), - mMediaPlayer.getVideoSarDen()); - mRenderView.setAspectRatioMode(mCurrentAspectRatio); - } - mRenderView.setAspectRatioMode(mCurrentAspectRatio); - if (mVideoWidth > 0 && mVideoHeight > 0) - mRenderView.setVideoSize(mVideoWidth, mVideoHeight); - if (mVideoSarNum > 0 && mVideoSarDen > 0) - mRenderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen); - mRenderView.addRenderCallback(mSHCallback); - mRenderView.setVideoRotation(mVideoRotationDegree); - } private View.OnClickListener mFullscreenListener = new OnClickListener() { @Override @@ -298,7 +295,7 @@ public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNu @Override public boolean dispatchTouchEvent(MotionEvent ev) { - switch (ev.getActionMasked()) { + switch (ev.getActionMasked()) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); @@ -475,12 +472,6 @@ public void onSeekComplete(IMediaPlayer mp) { } }; - private IMediaPlayer.OnTimedTextListener mOnTimedTextListener = new IMediaPlayer.OnTimedTextListener() { - @Override - public void onTimedText(IMediaPlayer mp, IjkTimedText text) { - // TODO: 1/21/17 Show subtitle if necessary - } - }; private void openVideo() { mCurrentBufferPercentage = 0; @@ -492,6 +483,16 @@ private void openVideo() { } + /** + * Set video source info for concat segments. + * + * @param videoInfo the video info + */ + public void setConcatVideos(@NonNull VideoInfo videoInfo, @Quality int quality) { + mProvider = new ConcatSourceProvider(videoInfo, mContext); + setConcatContent(mProvider.provideSource(quality)); + } + // TODO: 2/5/17 Show sth if the io is running private void setConcatContent(String content) { LogUtil.i(TAG, "set temp file content: \n" + content); @@ -505,7 +506,6 @@ public void onSuccess(final String result) { post(new Runnable() { @Override public void run() { - setVideoPath(result); } }); @@ -519,17 +519,6 @@ public void onFailed(Exception e) { }); } - - /** - * Set video source info for concat segments. - * - * @param videoInfo the video info - */ - public void setConcatVideos(@NonNull VideoInfo videoInfo, @Quality int quality) { - mProvider = new ConcatSourceProvider(videoInfo, mContext); - setConcatContent(mProvider.provideSource(quality)); - } - /** * Set video path * @@ -553,8 +542,6 @@ private void setVideoURI(Uri uri, Map headers) { try { mMediaPlayer.setDataSource(mContext, uri, headers); openVideo(); - requestLayout(); - invalidate(); } catch (IOException e) { LogUtil.wtf(TAG, e); mCurrentState = STATE_ERROR; @@ -565,19 +552,10 @@ private void setVideoURI(Uri uri, Map headers) { } public void setMediaController() { - if (mControllerView != null) { - mControllerView.hide(); - } - attachMediaController(); + mControllerView.setMediaPlayer(this); } - private void attachMediaController() { - if (mMediaPlayer != null && mControllerView != null) { - mControllerView.setMediaPlayer(this); - } - } - /** * Release media player * @@ -610,6 +588,7 @@ private void bindSurfaceHolder(IMediaPlayer mp, IRenderView.ISurfaceHolder holde /** * Set view to render frame in video stream. * Deprecated because we deprecate the {@link IRenderView} + * * @param renderView see {@link IRenderView} for details */ @Deprecated @@ -633,81 +612,6 @@ public void setRenderView(IRenderView renderView) { } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - boolean isKeyCodeSupported = keyCode != KeyEvent.KEYCODE_BACK && - keyCode != KeyEvent.KEYCODE_VOLUME_UP && - keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && - keyCode != KeyEvent.KEYCODE_VOLUME_MUTE && - keyCode != KeyEvent.KEYCODE_MENU && - keyCode != KeyEvent.KEYCODE_CALL && - keyCode != KeyEvent.KEYCODE_ENDCALL; - if (isInPlayBackState() && isKeyCodeSupported && mControllerView != null) { - if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || - keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { - if (mMediaPlayer.isPlaying()) { - pause(); - mControllerView.show(); - } else { - start(); - mControllerView.hide(); - } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) { - if (!mMediaPlayer.isPlaying()) { - start(); - mControllerView.hide(); - } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP || - keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) { - if (mMediaPlayer.isPlaying()) { - pause(); - mControllerView.show(); - } - return true; - } else { - toggleMediaControlsVisibility(); - } - } - return super.onKeyDown(keyCode, event); - } - - private ScaleGestureDetector mScaleGestureDetector; - private boolean onScale = false; - private android.view.ScaleGestureDetector.OnScaleGestureListener mScaleListener = new ScaleGestureDetector.SimpleOnScaleGestureListener() { - @Override - public boolean onScaleBegin(ScaleGestureDetector detector) { - onScale = true; - return super.onScaleBegin(detector); - } - - @Override - public boolean onScale(ScaleGestureDetector detector) { - float scaleFactorDiff = detector.getScaleFactor(); - if (detector.isInProgress()) { - handleScale(scaleFactorDiff); - } - return Float.compare(scaleFactorDiff, 1.0f) != 0; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - super.onScaleEnd(detector); - onScale = false; - } - }; - - private void handleScale(float scaleFactorDiff) { - if (mRenderView != null) - mRenderView.setAspectRatio(scaleFactorDiff); - } - - private void initGesture() { - mScaleGestureDetector = new ScaleGestureDetector(mContext, mScaleListener); - } - - private void toggleMediaControlsVisibility() { if (mControllerView.isShowing()) { mControllerView.hide(); @@ -902,6 +806,7 @@ private void showTiny() { private ViewGroup.LayoutParams lp; + private void showFullscreen() { lp = getLayoutParams(); ((Activity) getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); @@ -1004,10 +909,4 @@ protected void onWindowVisibilityChanged(int visibility) { } } } - - private int rootId; - - public void setRootLayoutId(int id) { - this.rootId = id; - } } diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/QualityView.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/QualityView.java similarity index 97% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/QualityView.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/QualityView.java index fde76d0..5abfb9e 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/QualityView.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/QualityView.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.animation.Animator; import android.content.Context; @@ -27,7 +27,7 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.hustunique.parsingplayer.LogUtil; +import com.hustunique.parsingplayer.util.LogUtil; import com.hustunique.parsingplayer.R; import com.hustunique.parsingplayer.parser.entity.VideoInfo; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/TextureRenderView.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/TextureRenderView.java similarity index 97% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/TextureRenderView.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/TextureRenderView.java index d684a6b..a4c10a9 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/TextureRenderView.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/TextureRenderView.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.annotation.TargetApi; import android.app.Activity; @@ -32,12 +32,11 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.TextureView; -import android.view.View; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; -import com.hustunique.parsingplayer.LogUtil; +import com.hustunique.parsingplayer.util.LogUtil; import com.orhanobut.logger.Logger; import java.lang.ref.WeakReference; @@ -48,9 +47,8 @@ import tv.danmaku.ijk.media.player.ISurfaceTextureHolder; import tv.danmaku.ijk.media.player.ISurfaceTextureHost; -// TODO: 2/18/17 Implement scale feature @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) -public class TextureRenderView extends TextureView implements IRenderView, View.OnClickListener { +public class TextureRenderView extends TextureView implements IRenderView { private static final String TAG = "TextureRenderView"; private static final float MINIMUM_BRIGHTNESS = 0.04f; private MeasureHelper mMeasureHelper; @@ -223,16 +221,12 @@ private void updateBrightness(float dy) { // LogUtil.d(TAG, "set brightness: " + brightnessPercent); } - private void updateVolume(float dy) { - dy = -dy; AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int deltaV = (int) (maxVolume * dy * 3 / (getHeight())); am.setStreamVolume(AudioManager.STREAM_MUSIC, mGestureDownVolume + deltaV, 0); - float volumePercentage = mGestureDownVolume * 100 / maxVolume + dy * 3 * 100 / (getHeight()); -// LogUtil.d(TAG, "update volume: " + volumePercentage); } @@ -244,10 +238,6 @@ public IRenderView.ISurfaceHolder getSurfaceHolder() { return new InternalSurfaceHolder(this, mSurfaceCallback.mSurfaceTexture, mSurfaceCallback); } - @Override - public void onClick(View v) { - Logger.d("click"); - } private static final class InternalSurfaceHolder implements IRenderView.ISurfaceHolder { private TextureRenderView mTextureView; diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/VerticalProgressBar.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/VerticalProgressBar.java similarity index 94% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/player/VerticalProgressBar.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/VerticalProgressBar.java index 4b4b833..45babec 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/VerticalProgressBar.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/player/view/VerticalProgressBar.java @@ -1,4 +1,4 @@ -package com.hustunique.parsingplayer.player; +package com.hustunique.parsingplayer.player.view; import android.content.Context; import android.content.res.TypedArray; @@ -6,12 +6,9 @@ import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; -import android.util.Log; import android.view.View; -import com.hustunique.parsingplayer.LogUtil; import com.hustunique.parsingplayer.R; -import com.orhanobut.logger.Logger; /** * Created by CoXier on 17-2-18. diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/LogUtil.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/util/LogUtil.java similarity index 95% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/LogUtil.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/util/LogUtil.java index 78e965c..8793321 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/LogUtil.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/util/LogUtil.java @@ -15,10 +15,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer; +package com.hustunique.parsingplayer.util; import android.util.Log; +import com.hustunique.parsingplayer.BuildConfig; + /** * Created by JianGuo on 1/16/17. * Wrapper for {@link Log} diff --git a/parsingplayer/src/main/java/com/hustunique/parsingplayer/Util.java b/parsingplayer/src/main/java/com/hustunique/parsingplayer/util/Util.java similarity index 99% rename from parsingplayer/src/main/java/com/hustunique/parsingplayer/Util.java rename to parsingplayer/src/main/java/com/hustunique/parsingplayer/util/Util.java index 54d6264..264b802 100644 --- a/parsingplayer/src/main/java/com/hustunique/parsingplayer/Util.java +++ b/parsingplayer/src/main/java/com/hustunique/parsingplayer/util/Util.java @@ -15,7 +15,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package com.hustunique.parsingplayer; +package com.hustunique.parsingplayer.util; import android.annotation.TargetApi; import android.content.Context; diff --git a/parsingplayer/src/main/res/layout/activity_video.xml b/parsingplayer/src/main/res/layout/activity_video.xml index 38f92ce..a626210 100644 --- a/parsingplayer/src/main/res/layout/activity_video.xml +++ b/parsingplayer/src/main/res/layout/activity_video.xml @@ -27,7 +27,7 @@ - - - - -