Support ijk hardware

pull/123/head
FongMi 3 years ago
parent 44b0148a2b
commit e89e232e0f
  1. 24
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 27
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 13
      app/src/leanback/res/layout/view_control_live.xml
  4. 13
      app/src/leanback/res/layout/view_control_vod.xml
  5. 20
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  6. 8
      app/src/main/java/com/fongmi/android/tv/utils/Prefers.java
  7. 9
      app/src/main/res/values-zh-rCN/strings.xml
  8. 9
      app/src/main/res/values-zh-rTW/strings.xml
  9. 9
      app/src/main/res/values/strings.xml
  10. 13
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java

@ -153,7 +153,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mR1 = this::hideControl;
mR2 = this::hideCenter;
setRecyclerView();
setVideoVisible();
setPlayerView();
setVideoView();
setViewModel();
getDetail();
@ -170,6 +170,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mBinding.control.scale.setOnClickListener(view -> onScale());
mBinding.control.speed.setOnClickListener(view -> onSpeed());
mBinding.control.player.setOnClickListener(view -> onPlayer());
mBinding.control.decode.setOnClickListener(view -> onDecode());
mBinding.control.tracks.setOnClickListener(view -> onTracks());
mBinding.control.ending.setOnClickListener(view -> onEnding());
mBinding.control.opening.setOnClickListener(view -> onOpening());
@ -210,18 +211,21 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mParseAdapter.setItems(ApiConfig.get().getParses(), null);
}
private void setVideoVisible() {
private void setPlayerView() {
getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE);
getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE);
mBinding.control.decode.setVisibility(mPlayers.isExo() ? View.GONE : View.VISIBLE);
}
private void setVideoView() {
mPlayers.setupIjk(mBinding.ijk);
mPlayers.setupIjk(getIjk());
setScale(Prefers.getVodScale());
getExo().setPlayer(mPlayers.exo());
getIjk().setRender(Prefers.getRender());
getIjk().setDecode(Prefers.getDecode());
getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle());
mBinding.control.player.setText(ResUtil.getStringArray(R.array.select_player)[Prefers.getPlayer()]);
mBinding.control.decode.setText(ResUtil.getStringArray(R.array.select_decode)[Prefers.getDecode()]);
mBinding.control.speed.setText(mPlayers.getSpeedText());
}
@ -474,11 +478,21 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
if (SoLoader.isFail()) return;
int index = Prefers.getPlayer();
CharSequence[] array = ResUtil.getStringArray(R.array.select_player);
Prefers.putPlayer(index = index == array.length - 1 ? 0 : ++index);
Prefers.putPlayer(index = index == 0 ? 1 : 0);
mBinding.control.player.setText(array[index]);
App.post(() -> getPlayer(false), 250);
setVideoVisible();
mPlayers.toggle();
setPlayerView();
}
private void onDecode() {
if (mPlayers.isExo()) return;
int index = Prefers.getDecode();
CharSequence[] array = ResUtil.getStringArray(R.array.select_decode);
Prefers.putDecode(index = index == 0 ? 1 : 0);
mBinding.control.decode.setText(array[index]);
mPlayers.setDecode(index);
getPlayer(false);
}
private void onTracks() {

@ -127,7 +127,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mFormatTime = new SimpleDateFormat("yyyy-MM-ddHH:mm", Locale.getDefault());
mHides = new ArrayList<>();
setRecyclerView();
setVideoVisible();
setPlayerView();
setVideoView();
setViewModel();
getLive();
@ -142,6 +142,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.control.scale.setOnClickListener(view -> onScale());
mBinding.control.speed.setOnClickListener(view -> onSpeed());
mBinding.control.player.setOnClickListener(view -> onPlayer());
mBinding.control.decode.setOnClickListener(view -> onDecode());
mBinding.control.tracks.setOnClickListener(view -> onTracks());
mBinding.control.line.setOnClickListener(view -> nextLine(false));
mBinding.control.speed.setOnLongClickListener(view -> onSpeedLong());
@ -160,25 +161,28 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.channel.setAdapter(new ItemBridgeAdapter(mChannelAdapter = new ArrayObjectAdapter(new ChannelPresenter(this))));
}
private void setVideoVisible() {
private void setPlayerView() {
getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE);
getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE);
mBinding.control.decode.setVisibility(mPlayers.isExo() ? View.GONE : View.VISIBLE);
}
private void setVideoView() {
mPlayers.setupIjk(mBinding.ijk);
mPlayers.setupIjk(getIjk());
getExo().setPlayer(mPlayers.exo());
getExo().setResizeMode(Prefers.getLiveScale());
getExo().setOnClickListener(view -> onToggle());
getExo().setOnLongClickListener(view -> onLongPress());
getIjk().setResizeMode(Prefers.getLiveScale());
getIjk().setRender(Prefers.getRender());
getIjk().setDecode(Prefers.getDecode());
getIjk().setOnClickListener(view -> onToggle());
getIjk().setOnLongClickListener(view -> onLongPress());
mBinding.control.speed.setText(mPlayers.getSpeedText());
mBinding.control.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE);
mBinding.control.player.setText(ResUtil.getStringArray(R.array.select_player)[Prefers.getPlayer()]);
mBinding.control.decode.setText(ResUtil.getStringArray(R.array.select_decode)[Prefers.getDecode()]);
mBinding.control.scale.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getLiveScale()]);
mBinding.control.speed.setText(mPlayers.getSpeedText());
}
private void setViewModel() {
@ -274,11 +278,21 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
if (SoLoader.isFail()) return;
int index = Prefers.getPlayer();
CharSequence[] array = ResUtil.getStringArray(R.array.select_player);
Prefers.putPlayer(index = index == array.length - 1 ? 0 : ++index);
Prefers.putPlayer(index = index == 0 ? 1 : 0);
mBinding.control.player.setText(array[index]);
App.post(this::getUrl, 250);
setVideoVisible();
mPlayers.toggle();
setPlayerView();
}
private void onDecode() {
if (mPlayers.isExo()) return;
int index = Prefers.getDecode();
CharSequence[] array = ResUtil.getStringArray(R.array.select_decode);
Prefers.putDecode(index = index == 0 ? 1 : 0);
mBinding.control.decode.setText(array[index]);
mPlayers.setDecode(index);
getUrl();
}
private void onTracks() {
@ -632,7 +646,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
protected void onResume() {
super.onResume();
Clock.start(mBinding.widget.time);
mBinding.ijk.start();
mPlayers.play();
}

@ -86,6 +86,19 @@
android:focusableInTouchMode="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="EXO" />
<TextView
android:id="@+id/decode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/parse"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="硬解" />
<TextView

@ -84,6 +84,19 @@
android:nextFocusDown="@id/parse"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="EXO" />
<TextView
android:id="@+id/decode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/parse"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="硬解" />
<TextView

@ -157,6 +157,10 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM
return stringToTime(time);
}
public void setDecode(int decode) {
if (isIjk()) ijkPlayer.setDecode(decode);
}
public void seekTo(int time) {
if (time == 0) return;
if (isExo()) exoPlayer.seekTo(getPosition() + time);
@ -169,14 +173,6 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM
else if (isIjk()) ijkPlayer.seekTo(time);
}
public boolean isVod() {
return getDuration() > 5 * 60 * 1000;
}
public boolean canNext() {
return getPosition() >= getDuration();
}
public void play() {
if (isExo()) exoPlayer.play();
else if (isIjk()) ijkPlayer.start();
@ -204,6 +200,14 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM
else if (isIjk()) releaseIjk();
}
public boolean isVod() {
return getDuration() > 5 * 60 * 1000;
}
public boolean canNext() {
return getPosition() >= getDuration();
}
public void start(Channel channel) {
setMediaSource(channel.getHeaders(), channel.getUrl());
}

@ -75,6 +75,14 @@ public class Prefers {
put("player", player);
}
public static int getDecode() {
return getInt("decode", 0);
}
public static void putDecode(int decode) {
put("decode", decode);
}
public static int getRender() {
return getInt("render", 0);
}

@ -98,9 +98,14 @@
<!-- UNIT -->
<string name="all">全部</string>
<string-array name="select_player">
<item>硬解</item>
<string-array name="select_decode">
<item>软解</item>
<item>硬解</item>
</string-array>
<string-array name="select_player">
<item>EXO</item>
<item>IJK</item>
</string-array>
<string-array name="select_quality">

@ -98,9 +98,14 @@
<!-- UNIT -->
<string name="all">全部</string>
<string-array name="select_player">
<item>硬解</item>
<string-array name="select_decode">
<item>軟解</item>
<item>硬解</item>
</string-array>
<string-array name="select_player">
<item>EXO</item>
<item>IJK</item>
</string-array>
<string-array name="select_quality">

@ -98,9 +98,14 @@
<!-- UNIT -->
<string name="all">All</string>
<string-array name="select_decode">
<item>Soft</item>
<item>Hard</item>
</string-array>
<string-array name="select_player">
<item>Hardware</item>
<item>Software</item>
<item>EXO</item>
<item>IJK</item>
</string-array>
<string-array name="select_render">

@ -50,6 +50,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
private float mCurrentSpeed = 1;
private int mCurrentAspectRatio;
private int mCurrentRender;
private int mCurrentDecode;
private int mStartPosition;
private int mCurrentState = STATE_IDLE;
@ -449,6 +450,10 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
return mCurrentSpeed;
}
public void setDecode(int decode) {
this.mCurrentDecode = decode;
}
public Size getSize() {
return new Size(mVideoWidth, mVideoHeight);
}
@ -520,10 +525,10 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl
mIjkPlayer.setOption(player, "fast", 1);
mIjkPlayer.setOption(player, "framedrop", 1);
mIjkPlayer.setOption(player, "max-buffer-size", 1024 * 1024);
mIjkPlayer.setOption(player, "mediacodec", 0);
mIjkPlayer.setOption(player, "mediacodec-auto-rotate", 0);
mIjkPlayer.setOption(player, "mediacodec-handle-resolution-change", 0);
mIjkPlayer.setOption(player, "mediacodec-hevc", 0);
mIjkPlayer.setOption(player, "mediacodec", mCurrentDecode);
mIjkPlayer.setOption(player, "mediacodec-auto-rotate", mCurrentDecode);
mIjkPlayer.setOption(player, "mediacodec-handle-resolution-change", mCurrentDecode);
mIjkPlayer.setOption(player, "mediacodec-hevc", mCurrentDecode);
mIjkPlayer.setOption(player, "min-frames", 1024);
mIjkPlayer.setOption(player, "opensles", 0);
mIjkPlayer.setOption(player, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);

Loading…
Cancel
Save