Pass through clip information to video player.

This commit is contained in:
Alex Hart
2022-10-12 14:49:27 -03:00
committed by Greyson Parrelli
parent 8c76cead58
commit 220931d3df
10 changed files with 61 additions and 41 deletions

View File

@@ -26,10 +26,12 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Tracks;
import com.google.android.exoplayer2.source.ClippingMediaSource;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource;
@@ -56,7 +58,7 @@ public class VideoPlayer extends FrameLayout {
private final PlayerControlView exoControls;
private final DefaultMediaSourceFactory mediaSourceFactory;
private SimpleExoPlayer exoPlayer;
private ExoPlayer exoPlayer;
private Window window;
private PlayerStateCallback playerStateCallback;
private PlayerPositionDiscontinuityCallback playerPositionDiscontinuityCallback;
@@ -125,6 +127,10 @@ public class VideoPlayer extends FrameLayout {
private MediaItem mediaItem;
public void setVideoSource(@NonNull VideoSlide videoSource, boolean autoplay, String poolTag) {
setVideoSource(videoSource, autoplay, poolTag, 0, 0);
}
public void setVideoSource(@NonNull VideoSlide videoSource, boolean autoplay, String poolTag, long clipStartMs, long clipEndMs) {
if (exoPlayer == null) {
exoPlayer = ApplicationDependencies.getExoPlayerPool().require(poolTag);
exoPlayer.addListener(exoPlayerListener);
@@ -136,7 +142,10 @@ public class VideoPlayer extends FrameLayout {
}
}
mediaItem = MediaItem.fromUri(Objects.requireNonNull(videoSource.getUri()));
mediaItem = MediaItem.fromUri(Objects.requireNonNull(videoSource.getUri())).buildUpon()
.setClippingConfiguration(getClippingConfiguration(clipStartMs, clipEndMs))
.build();
exoPlayer.setMediaItem(mediaItem);
exoPlayer.prepare();
exoPlayer.setPlayWhenReady(autoplay);
@@ -144,31 +153,22 @@ public class VideoPlayer extends FrameLayout {
public void mute() {
this.muted = true;
if (exoPlayer != null && exoPlayer.getAudioComponent() != null) {
exoPlayer.getAudioComponent().setVolume(0f);
if (exoPlayer != null) {
exoPlayer.setVolume(0f);
}
}
public void unmute() {
this.muted = false;
if (exoPlayer != null && exoPlayer.getAudioComponent() != null) {
exoPlayer.getAudioComponent().setVolume(1f);
if (exoPlayer != null) {
exoPlayer.setVolume(1f);
}
}
public boolean hasAudioTrack() {
if (exoPlayer != null) {
TrackGroupArray trackGroupArray = exoPlayer.getCurrentTrackGroups();
if (trackGroupArray != null) {
for (int i = 0; i < trackGroupArray.length; i++) {
for (int j = 0; j < trackGroupArray.get(i).length; j++) {
String sampleMimeType = trackGroupArray.get(i).getFormat(j).sampleMimeType;
if (MediaUtil.isAudioType(sampleMimeType)) {
return true;
}
}
}
}
Tracks tracks = exoPlayer.getCurrentTracks();
return tracks.containsType(C.TRACK_TYPE_AUDIO);
}
return false;
@@ -317,6 +317,14 @@ public class VideoPlayer extends FrameLayout {
}
}
private @NonNull MediaItem.ClippingConfiguration getClippingConfiguration(long startMs, long endMs) {
return startMs != endMs ? new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(startMs)
.setEndPositionMs(endMs)
.build()
: MediaItem.ClippingConfiguration.UNSET;
}
private class ExoPlayerListener implements Player.Listener {
@Override

View File

@@ -3,11 +3,10 @@ package org.thoughtcrime.securesms.video.exo
import android.content.Context
import androidx.annotation.MainThread
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException
import com.google.android.exoplayer2.source.MediaSourceFactory
import com.google.android.exoplayer2.source.ProgressiveMediaSource
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.upstream.DataSource
import com.google.android.exoplayer2.util.MimeTypes
import org.signal.core.util.logging.Log
@@ -19,11 +18,11 @@ import org.thoughtcrime.securesms.util.DeviceProperties
/**
* ExoPlayerPool concrete instance which helps to manage a pool of SimpleExoPlayer objects
*/
class SimpleExoPlayerPool(context: Context) : ExoPlayerPool<SimpleExoPlayer>(MAXIMUM_RESERVED_PLAYERS) {
class SimpleExoPlayerPool(context: Context) : ExoPlayerPool<ExoPlayer>(MAXIMUM_RESERVED_PLAYERS) {
private val context: Context = context.applicationContext
private val okHttpClient = ApplicationDependencies.getOkHttpClient().newBuilder().proxySelector(ContentProxySelector()).build()
private val dataSourceFactory: DataSource.Factory = SignalDataSource.Factory(ApplicationDependencies.getApplication(), okHttpClient, null)
private val mediaSourceFactory: MediaSourceFactory = ProgressiveMediaSource.Factory(dataSourceFactory)
private val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(dataSourceFactory)
init {
ApplicationDependencies.getAppForegroundObserver().addListener(this)
@@ -57,8 +56,8 @@ class SimpleExoPlayerPool(context: Context) : ExoPlayerPool<SimpleExoPlayer>(MAX
}
@MainThread
override fun createPlayer(): SimpleExoPlayer {
return SimpleExoPlayer.Builder(context)
override fun createPlayer(): ExoPlayer {
return ExoPlayer.Builder(context)
.setMediaSourceFactory(mediaSourceFactory)
.build()
}