Commit bbffa8ae by kimvde Committed by Rohit Singh

Remove setDecoderFactory from Transformer

It makes more sense to have it in the AssetLoader now that decoding is
done there, particularly as the decoder factory should rarely be
customized.

Also remove the setter from the AssetLoader.Factory because it's
uncommon to have setters in a factory.

PiperOrigin-RevId: 501244974
parent a5288a20
...@@ -23,6 +23,7 @@ import androidx.annotation.IntDef; ...@@ -23,6 +23,7 @@ import androidx.annotation.IntDef;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.common.collect.ImmutableMap;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
...@@ -78,10 +79,6 @@ public interface AssetLoader { ...@@ -78,10 +79,6 @@ public interface AssetLoader {
@CanIgnoreReturnValue @CanIgnoreReturnValue
Factory setFlattenVideoForSlowMotion(boolean flattenVideoForSlowMotion); Factory setFlattenVideoForSlowMotion(boolean flattenVideoForSlowMotion);
/** Sets the {@link Codec.DecoderFactory} to be used to decode the samples (if necessary). */
@CanIgnoreReturnValue
Factory setDecoderFactory(Codec.DecoderFactory decoderFactory);
/** /**
* Creates an {@link AssetLoader} instance. All the setters in this factory must be called * Creates an {@link AssetLoader} instance. All the setters in this factory must be called
* before creating the {@link AssetLoader}. * before creating the {@link AssetLoader}.
...@@ -176,6 +173,14 @@ public interface AssetLoader { ...@@ -176,6 +173,14 @@ public interface AssetLoader {
@Transformer.ProgressState @Transformer.ProgressState
int getProgress(ProgressHolder progressHolder); int getProgress(ProgressHolder progressHolder);
/**
* Return the used decoders' names.
*
* @return The decoders' names keyed by {@linkplain com.google.android.exoplayer2.C.TrackType
* track type}.
*/
ImmutableMap<Integer, String> getDecoderNames();
/** Stops loading data and releases all resources associated with the asset loader. */ /** Stops loading data and releases all resources associated with the asset loader. */
void release(); void release();
} }
...@@ -34,12 +34,18 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { ...@@ -34,12 +34,18 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory {
* @param context The {@link Context}. * @param context The {@link Context}.
* @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to * @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to
* transform when an {@link ExoPlayerAssetLoader} is used. * transform when an {@link ExoPlayerAssetLoader} is used.
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for * @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing. * testing.
*/ */
public DefaultAssetLoaderFactory( public DefaultAssetLoaderFactory(
Context context, MediaSource.Factory mediaSourceFactory, Clock clock) { Context context,
assetLoaderFactory = new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, clock); MediaSource.Factory mediaSourceFactory,
Codec.DecoderFactory decoderFactory,
Clock clock) {
assetLoaderFactory =
new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, decoderFactory, clock);
} }
@Override @Override
...@@ -62,12 +68,6 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { ...@@ -62,12 +68,6 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory {
} }
@Override @Override
@CanIgnoreReturnValue
public AssetLoader.Factory setDecoderFactory(Codec.DecoderFactory decoderFactory) {
return assetLoaderFactory.setDecoderFactory(decoderFactory);
}
@Override
public AssetLoader createAssetLoader( public AssetLoader createAssetLoader(
MediaItem mediaItem, Looper looper, AssetLoader.Listener listener) { MediaItem mediaItem, Looper looper, AssetLoader.Listener listener) {
return assetLoaderFactory.createAssetLoader(mediaItem, looper, listener); return assetLoaderFactory.createAssetLoader(mediaItem, looper, listener);
......
...@@ -27,7 +27,6 @@ import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STA ...@@ -27,7 +27,6 @@ import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STA
import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STATE_UNAVAILABLE; import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STATE_UNAVAILABLE;
import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STATE_WAITING_FOR_AVAILABILITY; import static com.google.android.exoplayer2.transformer.Transformer.PROGRESS_STATE_WAITING_FOR_AVAILABILITY;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull;
import static java.lang.Math.min; import static java.lang.Math.min;
import android.content.Context; import android.content.Context;
...@@ -51,6 +50,7 @@ import com.google.android.exoplayer2.text.TextOutput; ...@@ -51,6 +50,7 @@ import com.google.android.exoplayer2.text.TextOutput;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.google.android.exoplayer2.video.VideoRendererEventListener;
import com.google.common.collect.ImmutableMap;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
/** An {@link AssetLoader} implementation that uses an {@link ExoPlayer} to load samples. */ /** An {@link AssetLoader} implementation that uses an {@link ExoPlayer} to load samples. */
...@@ -61,12 +61,12 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -61,12 +61,12 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
private final Context context; private final Context context;
private final MediaSource.Factory mediaSourceFactory; private final MediaSource.Factory mediaSourceFactory;
private final Codec.DecoderFactory decoderFactory;
private final Clock clock; private final Clock clock;
private boolean removeAudio; private boolean removeAudio;
private boolean removeVideo; private boolean removeVideo;
private boolean flattenVideoForSlowMotion; private boolean flattenVideoForSlowMotion;
@Nullable private Codec.DecoderFactory decoderFactory;
/** /**
* Creates an instance. * Creates an instance.
...@@ -74,12 +74,19 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -74,12 +74,19 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
* @param context The {@link Context}. * @param context The {@link Context}.
* @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to * @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to
* transform. * transform.
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for * @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing. * testing.
*/ */
public Factory(Context context, MediaSource.Factory mediaSourceFactory, Clock clock) { public Factory(
Context context,
MediaSource.Factory mediaSourceFactory,
Codec.DecoderFactory decoderFactory,
Clock clock) {
this.context = context; this.context = context;
this.mediaSourceFactory = mediaSourceFactory; this.mediaSourceFactory = mediaSourceFactory;
this.decoderFactory = decoderFactory;
this.clock = clock; this.clock = clock;
} }
...@@ -105,13 +112,6 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -105,13 +112,6 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
} }
@Override @Override
@CanIgnoreReturnValue
public AssetLoader.Factory setDecoderFactory(Codec.DecoderFactory decoderFactory) {
this.decoderFactory = decoderFactory;
return this;
}
@Override
public AssetLoader createAssetLoader(MediaItem mediaItem, Looper looper, Listener listener) { public AssetLoader createAssetLoader(MediaItem mediaItem, Looper looper, Listener listener) {
return new ExoPlayerAssetLoader( return new ExoPlayerAssetLoader(
context, context,
...@@ -120,7 +120,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -120,7 +120,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
removeVideo, removeVideo,
flattenVideoForSlowMotion, flattenVideoForSlowMotion,
mediaSourceFactory, mediaSourceFactory,
checkStateNotNull(decoderFactory), decoderFactory,
looper, looper,
listener, listener,
clock); clock);
...@@ -128,6 +128,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -128,6 +128,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
} }
private final MediaItem mediaItem; private final MediaItem mediaItem;
private final CapturingDecoderFactory decoderFactory;
private final ExoPlayer player; private final ExoPlayer player;
private @Transformer.ProgressState int progressState; private @Transformer.ProgressState int progressState;
...@@ -144,6 +145,8 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -144,6 +145,8 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
Listener listener, Listener listener,
Clock clock) { Clock clock) {
this.mediaItem = mediaItem; this.mediaItem = mediaItem;
this.decoderFactory = new CapturingDecoderFactory(decoderFactory);
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
trackSelector.setParameters( trackSelector.setParameters(
new DefaultTrackSelector.Parameters.Builder(context) new DefaultTrackSelector.Parameters.Builder(context)
...@@ -163,7 +166,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -163,7 +166,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
new ExoPlayer.Builder( new ExoPlayer.Builder(
context, context,
new RenderersFactoryImpl( new RenderersFactoryImpl(
removeAudio, removeVideo, flattenForSlowMotion, decoderFactory, listener)) removeAudio, removeVideo, flattenForSlowMotion, this.decoderFactory, listener))
.setMediaSourceFactory(mediaSourceFactory) .setMediaSourceFactory(mediaSourceFactory)
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.setLoadControl(loadControl) .setLoadControl(loadControl)
...@@ -174,7 +177,6 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -174,7 +177,6 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
@SuppressWarnings("VisibleForTests") @SuppressWarnings("VisibleForTests")
ExoPlayer.Builder unusedForAnnotation = playerBuilder.setClock(clock); ExoPlayer.Builder unusedForAnnotation = playerBuilder.setClock(clock);
} }
player = playerBuilder.build(); player = playerBuilder.build();
player.addListener(new PlayerListener(listener)); player.addListener(new PlayerListener(listener));
...@@ -199,6 +201,20 @@ public final class ExoPlayerAssetLoader implements AssetLoader { ...@@ -199,6 +201,20 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
} }
@Override @Override
public ImmutableMap<Integer, String> getDecoderNames() {
ImmutableMap.Builder<Integer, String> decoderNamesByTrackType = new ImmutableMap.Builder<>();
@Nullable String audioDecoderName = decoderFactory.getAudioDecoderName();
if (audioDecoderName != null) {
decoderNamesByTrackType.put(C.TRACK_TYPE_AUDIO, audioDecoderName);
}
@Nullable String videoDecoderName = decoderFactory.getVideoDecoderName();
if (videoDecoderName != null) {
decoderNamesByTrackType.put(C.TRACK_TYPE_VIDEO, videoDecoderName);
}
return decoderNamesByTrackType.buildOrThrow();
}
@Override
public void release() { public void release() {
player.release(); player.release();
progressState = PROGRESS_STATE_NOT_STARTED; progressState = PROGRESS_STATE_NOT_STARTED;
......
...@@ -89,9 +89,8 @@ public final class Transformer { ...@@ -89,9 +89,8 @@ public final class Transformer {
private boolean forceSilentAudio; private boolean forceSilentAudio;
private ListenerSet<Transformer.Listener> listeners; private ListenerSet<Transformer.Listener> listeners;
@Nullable private AssetLoader.Factory assetLoaderFactory; @Nullable private AssetLoader.Factory assetLoaderFactory;
private Codec.DecoderFactory decoderFactory;
private Codec.EncoderFactory encoderFactory;
private FrameProcessor.Factory frameProcessorFactory; private FrameProcessor.Factory frameProcessorFactory;
private Codec.EncoderFactory encoderFactory;
private Muxer.Factory muxerFactory; private Muxer.Factory muxerFactory;
private Looper looper; private Looper looper;
private DebugViewProvider debugViewProvider; private DebugViewProvider debugViewProvider;
...@@ -107,9 +106,8 @@ public final class Transformer { ...@@ -107,9 +106,8 @@ public final class Transformer {
transformationRequest = new TransformationRequest.Builder().build(); transformationRequest = new TransformationRequest.Builder().build();
audioProcessors = ImmutableList.of(); audioProcessors = ImmutableList.of();
videoEffects = ImmutableList.of(); videoEffects = ImmutableList.of();
decoderFactory = new DefaultDecoderFactory(this.context);
encoderFactory = new DefaultEncoderFactory.Builder(this.context).build();
frameProcessorFactory = new GlEffectsFrameProcessor.Factory(); frameProcessorFactory = new GlEffectsFrameProcessor.Factory();
encoderFactory = new DefaultEncoderFactory.Builder(this.context).build();
muxerFactory = new DefaultMuxer.Factory(); muxerFactory = new DefaultMuxer.Factory();
looper = Util.getCurrentOrMainLooper(); looper = Util.getCurrentOrMainLooper();
debugViewProvider = DebugViewProvider.NONE; debugViewProvider = DebugViewProvider.NONE;
...@@ -128,9 +126,8 @@ public final class Transformer { ...@@ -128,9 +126,8 @@ public final class Transformer {
this.forceSilentAudio = transformer.forceSilentAudio; this.forceSilentAudio = transformer.forceSilentAudio;
this.listeners = transformer.listeners; this.listeners = transformer.listeners;
this.assetLoaderFactory = transformer.assetLoaderFactory; this.assetLoaderFactory = transformer.assetLoaderFactory;
this.decoderFactory = transformer.decoderFactory;
this.encoderFactory = transformer.encoderFactory;
this.frameProcessorFactory = transformer.frameProcessorFactory; this.frameProcessorFactory = transformer.frameProcessorFactory;
this.encoderFactory = transformer.encoderFactory;
this.muxerFactory = transformer.muxerFactory; this.muxerFactory = transformer.muxerFactory;
this.looper = transformer.looper; this.looper = transformer.looper;
this.debugViewProvider = transformer.debugViewProvider; this.debugViewProvider = transformer.debugViewProvider;
...@@ -292,7 +289,7 @@ public final class Transformer { ...@@ -292,7 +289,7 @@ public final class Transformer {
* Sets the {@link AssetLoader.Factory} to be used to retrieve the samples to transform. * Sets the {@link AssetLoader.Factory} to be used to retrieve the samples to transform.
* *
* <p>The default value is a {@link DefaultAssetLoaderFactory} built with a {@link * <p>The default value is a {@link DefaultAssetLoaderFactory} built with a {@link
* DefaultMediaSourceFactory}. * DefaultMediaSourceFactory} and a {@link DefaultDecoderFactory}.
* *
* @param assetLoaderFactory An {@link AssetLoader.Factory}. * @param assetLoaderFactory An {@link AssetLoader.Factory}.
* @return This builder. * @return This builder.
...@@ -304,16 +301,22 @@ public final class Transformer { ...@@ -304,16 +301,22 @@ public final class Transformer {
} }
/** /**
* Sets the {@link Codec.DecoderFactory} that will be used by the transformer. * Sets the {@link FrameProcessor.Factory} for the {@link FrameProcessor} to use when applying
* {@linkplain Effect effects} to the video frames.
* *
* <p>The default value is a {@link DefaultDecoderFactory} instance. * <p>This factory will be used to create the {@link FrameProcessor} used for applying the
* {@link Effect} instances passed to {@link #setVideoEffects(List)} and any additional {@link
* GlMatrixTransformation} instances derived from the {@link TransformationRequest} set using
* {@link #setTransformationRequest(TransformationRequest)}.
* *
* @param decoderFactory The {@link Codec.DecoderFactory} instance. * <p>The default is {@link GlEffectsFrameProcessor.Factory}.
*
* @param frameProcessorFactory The {@link FrameProcessor.Factory} to use.
* @return This builder. * @return This builder.
*/ */
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Builder setDecoderFactory(Codec.DecoderFactory decoderFactory) { public Builder setFrameProcessorFactory(FrameProcessor.Factory frameProcessorFactory) {
this.decoderFactory = decoderFactory; this.frameProcessorFactory = frameProcessorFactory;
return this; return this;
} }
...@@ -332,26 +335,6 @@ public final class Transformer { ...@@ -332,26 +335,6 @@ public final class Transformer {
} }
/** /**
* Sets the {@link FrameProcessor.Factory} for the {@link FrameProcessor} to use when applying
* {@linkplain Effect effects} to the video frames.
*
* <p>This factory will be used to create the {@link FrameProcessor} used for applying the
* {@link Effect} instances passed to {@link #setVideoEffects(List)} and any additional {@link
* GlMatrixTransformation} instances derived from the {@link TransformationRequest} set using
* {@link #setTransformationRequest(TransformationRequest)}.
*
* <p>The default is {@link GlEffectsFrameProcessor.Factory}.
*
* @param frameProcessorFactory The {@link FrameProcessor.Factory} to use.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setFrameProcessorFactory(FrameProcessor.Factory frameProcessorFactory) {
this.frameProcessorFactory = frameProcessorFactory;
return this;
}
/**
* Sets the factory for muxers that write the media container. * Sets the factory for muxers that write the media container.
* *
* <p>The default value is a {@link DefaultMuxer.Factory}. * <p>The default value is a {@link DefaultMuxer.Factory}.
...@@ -465,7 +448,9 @@ public final class Transformer { ...@@ -465,7 +448,9 @@ public final class Transformer {
} }
MediaSource.Factory mediaSourceFactory = MediaSource.Factory mediaSourceFactory =
new DefaultMediaSourceFactory(context, defaultExtractorsFactory); new DefaultMediaSourceFactory(context, defaultExtractorsFactory);
assetLoaderFactory = new DefaultAssetLoaderFactory(context, mediaSourceFactory, clock); Codec.DecoderFactory decoderFactory = new DefaultDecoderFactory(context);
assetLoaderFactory =
new DefaultAssetLoaderFactory(context, mediaSourceFactory, decoderFactory, clock);
} }
return new Transformer( return new Transformer(
context, context,
...@@ -477,9 +462,8 @@ public final class Transformer { ...@@ -477,9 +462,8 @@ public final class Transformer {
forceSilentAudio, forceSilentAudio,
listeners, listeners,
assetLoaderFactory, assetLoaderFactory,
decoderFactory,
encoderFactory,
frameProcessorFactory, frameProcessorFactory,
encoderFactory,
muxerFactory, muxerFactory,
looper, looper,
debugViewProvider, debugViewProvider,
...@@ -589,9 +573,6 @@ public final class Transformer { ...@@ -589,9 +573,6 @@ public final class Transformer {
/** Indicates that the progress is permanently unavailable. */ /** Indicates that the progress is permanently unavailable. */
public static final int PROGRESS_STATE_UNAVAILABLE = 3; public static final int PROGRESS_STATE_UNAVAILABLE = 3;
@VisibleForTesting /* package */ final Codec.DecoderFactory decoderFactory;
@VisibleForTesting /* package */ final Codec.EncoderFactory encoderFactory;
private final Context context; private final Context context;
private final TransformationRequest transformationRequest; private final TransformationRequest transformationRequest;
private final ImmutableList<AudioProcessor> audioProcessors; private final ImmutableList<AudioProcessor> audioProcessors;
...@@ -602,6 +583,7 @@ public final class Transformer { ...@@ -602,6 +583,7 @@ public final class Transformer {
private final ListenerSet<Transformer.Listener> listeners; private final ListenerSet<Transformer.Listener> listeners;
private final AssetLoader.Factory assetLoaderFactory; private final AssetLoader.Factory assetLoaderFactory;
private final FrameProcessor.Factory frameProcessorFactory; private final FrameProcessor.Factory frameProcessorFactory;
private final Codec.EncoderFactory encoderFactory;
private final Muxer.Factory muxerFactory; private final Muxer.Factory muxerFactory;
private final Looper looper; private final Looper looper;
private final DebugViewProvider debugViewProvider; private final DebugViewProvider debugViewProvider;
...@@ -619,9 +601,8 @@ public final class Transformer { ...@@ -619,9 +601,8 @@ public final class Transformer {
boolean forceSilentAudio, boolean forceSilentAudio,
ListenerSet<Listener> listeners, ListenerSet<Listener> listeners,
AssetLoader.Factory assetLoaderFactory, AssetLoader.Factory assetLoaderFactory,
Codec.DecoderFactory decoderFactory,
Codec.EncoderFactory encoderFactory,
FrameProcessor.Factory frameProcessorFactory, FrameProcessor.Factory frameProcessorFactory,
Codec.EncoderFactory encoderFactory,
Muxer.Factory muxerFactory, Muxer.Factory muxerFactory,
Looper looper, Looper looper,
DebugViewProvider debugViewProvider, DebugViewProvider debugViewProvider,
...@@ -640,9 +621,8 @@ public final class Transformer { ...@@ -640,9 +621,8 @@ public final class Transformer {
this.forceSilentAudio = forceSilentAudio; this.forceSilentAudio = forceSilentAudio;
this.listeners = listeners; this.listeners = listeners;
this.assetLoaderFactory = assetLoaderFactory; this.assetLoaderFactory = assetLoaderFactory;
this.decoderFactory = decoderFactory;
this.encoderFactory = encoderFactory;
this.frameProcessorFactory = frameProcessorFactory; this.frameProcessorFactory = frameProcessorFactory;
this.encoderFactory = encoderFactory;
this.muxerFactory = muxerFactory; this.muxerFactory = muxerFactory;
this.looper = looper; this.looper = looper;
this.debugViewProvider = debugViewProvider; this.debugViewProvider = debugViewProvider;
...@@ -783,9 +763,8 @@ public final class Transformer { ...@@ -783,9 +763,8 @@ public final class Transformer {
removeVideo, removeVideo,
forceSilentAudio, forceSilentAudio,
assetLoaderFactory, assetLoaderFactory,
decoderFactory,
encoderFactory,
frameProcessorFactory, frameProcessorFactory,
encoderFactory,
muxerFactory, muxerFactory,
transformerInternalListener, transformerInternalListener,
fallbackListener, fallbackListener,
......
...@@ -45,6 +45,7 @@ import com.google.android.exoplayer2.util.FrameProcessor; ...@@ -45,6 +45,7 @@ import com.google.android.exoplayer2.util.FrameProcessor;
import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.HandlerWrapper;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -93,9 +94,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -93,9 +94,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final ImmutableList<AudioProcessor> audioProcessors; private final ImmutableList<AudioProcessor> audioProcessors;
private final ImmutableList<Effect> videoEffects; private final ImmutableList<Effect> videoEffects;
private final boolean forceSilentAudio; private final boolean forceSilentAudio;
private final CapturingDecoderFactory decoderFactory;
private final CapturingEncoderFactory encoderFactory;
private final FrameProcessor.Factory frameProcessorFactory; private final FrameProcessor.Factory frameProcessorFactory;
private final CapturingEncoderFactory encoderFactory;
private final Listener listener; private final Listener listener;
private final HandlerWrapper applicationHandler; private final HandlerWrapper applicationHandler;
private final DebugViewProvider debugViewProvider; private final DebugViewProvider debugViewProvider;
...@@ -126,9 +126,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -126,9 +126,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
boolean removeVideo, boolean removeVideo,
boolean forceSilentAudio, boolean forceSilentAudio,
AssetLoader.Factory assetLoaderFactory, AssetLoader.Factory assetLoaderFactory,
Codec.DecoderFactory decoderFactory,
Codec.EncoderFactory encoderFactory,
FrameProcessor.Factory frameProcessorFactory, FrameProcessor.Factory frameProcessorFactory,
Codec.EncoderFactory encoderFactory,
Muxer.Factory muxerFactory, Muxer.Factory muxerFactory,
Listener listener, Listener listener,
FallbackListener fallbackListener, FallbackListener fallbackListener,
...@@ -140,9 +139,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -140,9 +139,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
this.audioProcessors = audioProcessors; this.audioProcessors = audioProcessors;
this.videoEffects = videoEffects; this.videoEffects = videoEffects;
this.forceSilentAudio = forceSilentAudio; this.forceSilentAudio = forceSilentAudio;
this.decoderFactory = new CapturingDecoderFactory(decoderFactory);
this.encoderFactory = new CapturingEncoderFactory(encoderFactory);
this.frameProcessorFactory = frameProcessorFactory; this.frameProcessorFactory = frameProcessorFactory;
this.encoderFactory = new CapturingEncoderFactory(encoderFactory);
this.listener = listener; this.listener = listener;
this.applicationHandler = applicationHandler; this.applicationHandler = applicationHandler;
this.debugViewProvider = debugViewProvider; this.debugViewProvider = debugViewProvider;
...@@ -156,7 +154,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -156,7 +154,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
.setRemoveAudio(removeAudio) .setRemoveAudio(removeAudio)
.setRemoveVideo(removeVideo) .setRemoveVideo(removeVideo)
.setFlattenVideoForSlowMotion(transformationRequest.flattenForSlowMotion) .setFlattenVideoForSlowMotion(transformationRequest.flattenForSlowMotion)
.setDecoderFactory(this.decoderFactory)
.createAssetLoader(mediaItem, internalLooper, componentListener); .createAssetLoader(mediaItem, internalLooper, componentListener);
samplePipelines = new ArrayList<>(); samplePipelines = new ArrayList<>();
muxerWrapper = muxerWrapper =
...@@ -263,9 +260,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -263,9 +260,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private void endInternal( private void endInternal(
@EndReason int endReason, @Nullable TransformationException transformationException) { @EndReason int endReason, @Nullable TransformationException transformationException) {
ImmutableMap<Integer, String> decoderNames = assetLoader.getDecoderNames();
transformationResultBuilder transformationResultBuilder
.setAudioDecoderName(decoderFactory.getAudioDecoderName()) .setAudioDecoderName(decoderNames.get(C.TRACK_TYPE_AUDIO))
.setVideoDecoderName(decoderFactory.getVideoDecoderName()) .setVideoDecoderName(decoderNames.get(C.TRACK_TYPE_VIDEO))
.setAudioEncoderName(encoderFactory.getAudioEncoderName()) .setAudioEncoderName(encoderFactory.getAudioEncoderName())
.setVideoEncoderName(encoderFactory.getVideoEncoderName()); .setVideoEncoderName(encoderFactory.getVideoEncoderName());
......
...@@ -119,12 +119,12 @@ public class ExoPlayerAssetLoaderTest { ...@@ -119,12 +119,12 @@ public class ExoPlayerAssetLoaderTest {
Looper looper, AssetLoader.Listener listener, Clock clock) { Looper looper, AssetLoader.Listener listener, Clock clock) {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context); MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context);
Codec.DecoderFactory decoderFactory = new DefaultDecoderFactory(context);
MediaItem mediaItem = MediaItem.fromUri("asset:///media/mp4/sample.mp4"); MediaItem mediaItem = MediaItem.fromUri("asset:///media/mp4/sample.mp4");
return new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, clock) return new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, decoderFactory, clock)
.setRemoveAudio(false) .setRemoveAudio(false)
.setRemoveVideo(false) .setRemoveVideo(false)
.setFlattenVideoForSlowMotion(false) .setFlattenVideoForSlowMotion(false)
.setDecoderFactory(new DefaultDecoderFactory(context))
.createAssetLoader(mediaItem, looper, listener); .createAssetLoader(mediaItem, looper, listener);
} }
......
...@@ -61,6 +61,7 @@ import com.google.android.exoplayer2.testutil.FakeClock; ...@@ -61,6 +61,7 @@ import com.google.android.exoplayer2.testutil.FakeClock;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import java.io.IOException; import java.io.IOException;
...@@ -527,8 +528,9 @@ public final class TransformerEndToEndTest { ...@@ -527,8 +528,9 @@ public final class TransformerEndToEndTest {
MediaSource.Factory mediaSourceFactory = MediaSource.Factory mediaSourceFactory =
new DefaultMediaSourceFactory( new DefaultMediaSourceFactory(
context, new SlowExtractorsFactory(/* delayBetweenReadsMs= */ 10)); context, new SlowExtractorsFactory(/* delayBetweenReadsMs= */ 10));
Codec.DecoderFactory decoderFactory = new DefaultDecoderFactory(context);
AssetLoader.Factory assetLoaderFactory = AssetLoader.Factory assetLoaderFactory =
new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, clock); new ExoPlayerAssetLoader.Factory(context, mediaSourceFactory, decoderFactory, clock);
Muxer.Factory muxerFactory = new TestMuxerFactory(/* maxDelayBetweenSamplesMs= */ 1); Muxer.Factory muxerFactory = new TestMuxerFactory(/* maxDelayBetweenSamplesMs= */ 1);
Transformer transformer = Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false) createTransformerBuilder(/* enableFallback= */ false)
...@@ -1102,11 +1104,6 @@ public final class TransformerEndToEndTest { ...@@ -1102,11 +1104,6 @@ public final class TransformerEndToEndTest {
} }
@Override @Override
public AssetLoader.Factory setDecoderFactory(Codec.DecoderFactory decoderFactory) {
return this;
}
@Override
public AssetLoader createAssetLoader(MediaItem mediaItem, Looper looper, Listener listener) { public AssetLoader createAssetLoader(MediaItem mediaItem, Looper looper, Listener listener) {
return new FakeAssetLoader(listener, supportedOutputTypes, sampleConsumerRef); return new FakeAssetLoader(listener, supportedOutputTypes, sampleConsumerRef);
} }
...@@ -1156,6 +1153,11 @@ public final class TransformerEndToEndTest { ...@@ -1156,6 +1153,11 @@ public final class TransformerEndToEndTest {
} }
@Override @Override
public ImmutableMap<Integer, String> getDecoderNames() {
return ImmutableMap.of();
}
@Override
public void release() {} public void release() {}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment