Move setMaxDelayBetweenSamplesMs on Transformer builder
This property is transformer specific and does not belong to muxer interface. This is to eventually replace muxer interface in Transformer module with muxer interface in Muxer module. PiperOrigin-RevId: 618895836
This commit is contained in:
parent
f4e444bdd2
commit
2eaece5ed9
@ -326,18 +326,13 @@ public final class TransformerActivity extends AppCompatActivity {
|
|||||||
.setEnableFallback(bundle.getBoolean(ConfigurationActivity.ENABLE_FALLBACK))
|
.setEnableFallback(bundle.getBoolean(ConfigurationActivity.ENABLE_FALLBACK))
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
long maxDelayBetweenSamplesMs = DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS;
|
|
||||||
if (!bundle.getBoolean(ConfigurationActivity.ABORT_SLOW_EXPORT)) {
|
if (!bundle.getBoolean(ConfigurationActivity.ABORT_SLOW_EXPORT)) {
|
||||||
maxDelayBetweenSamplesMs = C.TIME_UNSET;
|
transformerBuilder.setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
Muxer.Factory muxerFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs);
|
Muxer.Factory muxerFactory = new DefaultMuxer.Factory();
|
||||||
if (bundle.getBoolean(ConfigurationActivity.PRODUCE_FRAGMENTED_MP4)) {
|
if (bundle.getBoolean(ConfigurationActivity.PRODUCE_FRAGMENTED_MP4)) {
|
||||||
muxerFactory =
|
muxerFactory = new InAppMuxer.Factory.Builder().setFragmentedMp4Enabled(true).build();
|
||||||
new InAppMuxer.Factory.Builder()
|
|
||||||
.setMaxDelayBetweenSamplesMs(maxDelayBetweenSamplesMs)
|
|
||||||
.setFragmentedMp4Enabled(true)
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
transformerBuilder.setMuxerFactory(muxerFactory);
|
transformerBuilder.setMuxerFactory(muxerFactory);
|
||||||
|
|
||||||
|
@ -471,10 +471,5 @@ public class TransformerPauseResumeTest {
|
|||||||
public void release(boolean forCancellation) throws MuxerException {
|
public void release(boolean forCancellation) throws MuxerException {
|
||||||
wrappedMuxer.release(forCancellation);
|
wrappedMuxer.release(forCancellation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getMaxDelayBetweenSamplesMs() {
|
|
||||||
return wrappedMuxer.getMaxDelayBetweenSamplesMs();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,39 +28,22 @@ public final class DefaultMuxer implements Muxer {
|
|||||||
|
|
||||||
/** A {@link Muxer.Factory} for {@link DefaultMuxer}. */
|
/** A {@link Muxer.Factory} for {@link DefaultMuxer}. */
|
||||||
public static final class Factory implements Muxer.Factory {
|
public static final class Factory implements Muxer.Factory {
|
||||||
|
|
||||||
/** The default value returned by {@link #getMaxDelayBetweenSamplesMs()}. */
|
|
||||||
public static final long DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS = 10_000;
|
|
||||||
|
|
||||||
private final Muxer.Factory muxerFactory;
|
private final Muxer.Factory muxerFactory;
|
||||||
|
|
||||||
/**
|
/** Creates an instance with {@code videoDurationMs} set to {@link C#TIME_UNSET}. */
|
||||||
* Creates an instance with {@link Muxer#getMaxDelayBetweenSamplesMs() maxDelayBetweenSamplesMs}
|
|
||||||
* set to {@link #DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS}.
|
|
||||||
*/
|
|
||||||
public Factory() {
|
public Factory() {
|
||||||
this(/* maxDelayBetweenSamplesMs= */ DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS);
|
this(/* videoDurationMs= */ C.TIME_UNSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance.
|
* Creates an instance.
|
||||||
*
|
*
|
||||||
* @param maxDelayBetweenSamplesMs See {@link Muxer#getMaxDelayBetweenSamplesMs()}.
|
|
||||||
*/
|
|
||||||
public Factory(long maxDelayBetweenSamplesMs) {
|
|
||||||
this(maxDelayBetweenSamplesMs, /* videoDurationMs= */ C.TIME_UNSET);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance.
|
|
||||||
*
|
|
||||||
* @param maxDelayBetweenSamplesMs See {@link Muxer#getMaxDelayBetweenSamplesMs()}.
|
|
||||||
* @param videoDurationMs The duration of the video track (in milliseconds) to enforce in the
|
* @param videoDurationMs The duration of the video track (in milliseconds) to enforce in the
|
||||||
* output, or {@link C#TIME_UNSET} to not enforce. Only applicable when a video track is
|
* output, or {@link C#TIME_UNSET} to not enforce. Only applicable when a video track is
|
||||||
* {@linkplain #addTrack(Format) added}.
|
* {@linkplain #addTrack(Format) added}.
|
||||||
*/
|
*/
|
||||||
public Factory(long maxDelayBetweenSamplesMs, long videoDurationMs) {
|
public Factory(long videoDurationMs) {
|
||||||
this.muxerFactory = new FrameworkMuxer.Factory(maxDelayBetweenSamplesMs, videoDurationMs);
|
this.muxerFactory = new FrameworkMuxer.Factory(videoDurationMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -101,9 +84,4 @@ public final class DefaultMuxer implements Muxer {
|
|||||||
public void release(boolean forCancellation) throws MuxerException {
|
public void release(boolean forCancellation) throws MuxerException {
|
||||||
muxer.release(forCancellation);
|
muxer.release(forCancellation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getMaxDelayBetweenSamplesMs() {
|
|
||||||
return muxer.getMaxDelayBetweenSamplesMs();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ public final class ExportException extends Exception {
|
|||||||
/**
|
/**
|
||||||
* Caused by a timeout while muxing media samples.
|
* Caused by a timeout while muxing media samples.
|
||||||
*
|
*
|
||||||
* @see Muxer#getMaxDelayBetweenSamplesMs()
|
* @see Transformer.Builder#setMaxDelayBetweenMuxerSamplesMs(long)
|
||||||
*/
|
*/
|
||||||
public static final int ERROR_CODE_MUXING_TIMEOUT = 7002;
|
public static final int ERROR_CODE_MUXING_TIMEOUT = 7002;
|
||||||
|
|
||||||
|
@ -47,12 +47,9 @@ import java.nio.ByteBuffer;
|
|||||||
|
|
||||||
/** {@link Muxer.Factory} for {@link FrameworkMuxer}. */
|
/** {@link Muxer.Factory} for {@link FrameworkMuxer}. */
|
||||||
public static final class Factory implements Muxer.Factory {
|
public static final class Factory implements Muxer.Factory {
|
||||||
|
|
||||||
private final long maxDelayBetweenSamplesMs;
|
|
||||||
private final long videoDurationMs;
|
private final long videoDurationMs;
|
||||||
|
|
||||||
public Factory(long maxDelayBetweenSamplesMs, long videoDurationMs) {
|
public Factory(long videoDurationMs) {
|
||||||
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
|
||||||
this.videoDurationMs = videoDurationMs;
|
this.videoDurationMs = videoDurationMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +61,7 @@ import java.nio.ByteBuffer;
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new MuxerException("Error creating muxer", e);
|
throw new MuxerException("Error creating muxer", e);
|
||||||
}
|
}
|
||||||
return new FrameworkMuxer(mediaMuxer, maxDelayBetweenSamplesMs, videoDurationMs);
|
return new FrameworkMuxer(mediaMuxer, videoDurationMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -79,7 +76,6 @@ import java.nio.ByteBuffer;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final MediaMuxer mediaMuxer;
|
private final MediaMuxer mediaMuxer;
|
||||||
private final long maxDelayBetweenSamplesMs;
|
|
||||||
private final long videoDurationUs;
|
private final long videoDurationUs;
|
||||||
private final MediaCodec.BufferInfo bufferInfo;
|
private final MediaCodec.BufferInfo bufferInfo;
|
||||||
private final SparseLongArray trackIndexToLastPresentationTimeUs;
|
private final SparseLongArray trackIndexToLastPresentationTimeUs;
|
||||||
@ -89,10 +85,8 @@ import java.nio.ByteBuffer;
|
|||||||
|
|
||||||
private boolean isStarted;
|
private boolean isStarted;
|
||||||
|
|
||||||
private FrameworkMuxer(
|
private FrameworkMuxer(MediaMuxer mediaMuxer, long videoDurationMs) {
|
||||||
MediaMuxer mediaMuxer, long maxDelayBetweenSamplesMs, long videoDurationMs) {
|
|
||||||
this.mediaMuxer = mediaMuxer;
|
this.mediaMuxer = mediaMuxer;
|
||||||
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
|
||||||
this.videoDurationUs = Util.msToUs(videoDurationMs);
|
this.videoDurationUs = Util.msToUs(videoDurationMs);
|
||||||
bufferInfo = new MediaCodec.BufferInfo();
|
bufferInfo = new MediaCodec.BufferInfo();
|
||||||
trackIndexToLastPresentationTimeUs = new SparseLongArray();
|
trackIndexToLastPresentationTimeUs = new SparseLongArray();
|
||||||
@ -236,11 +230,6 @@ import java.nio.ByteBuffer;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getMaxDelayBetweenSamplesMs() {
|
|
||||||
return maxDelayBetweenSamplesMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Accesses MediaMuxer state via reflection to ensure that muxer resources can be released even
|
// Accesses MediaMuxer state via reflection to ensure that muxer resources can be released even
|
||||||
// if stopping fails.
|
// if stopping fails.
|
||||||
@SuppressLint("PrivateApi")
|
@SuppressLint("PrivateApi")
|
||||||
|
@ -62,24 +62,15 @@ public final class InAppMuxer implements Muxer {
|
|||||||
|
|
||||||
/** A builder for {@link Factory} instances. */
|
/** A builder for {@link Factory} instances. */
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
private long maxDelayBetweenSamplesMs;
|
|
||||||
private @Nullable MetadataProvider metadataProvider;
|
private @Nullable MetadataProvider metadataProvider;
|
||||||
private boolean fragmentedMp4Enabled;
|
private boolean fragmentedMp4Enabled;
|
||||||
private int fragmentDurationUs;
|
private int fragmentDurationUs;
|
||||||
|
|
||||||
/** Creates a {@link Builder} instance with default values. */
|
/** Creates a {@link Builder} instance with default values. */
|
||||||
public Builder() {
|
public Builder() {
|
||||||
maxDelayBetweenSamplesMs = DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS;
|
|
||||||
fragmentDurationUs = Mp4Muxer.DEFAULT_FRAGMENT_DURATION_US;
|
fragmentDurationUs = Mp4Muxer.DEFAULT_FRAGMENT_DURATION_US;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See {@link Muxer#getMaxDelayBetweenSamplesMs()}. */
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public Builder setMaxDelayBetweenSamplesMs(long maxDelayBetweenSamplesMs) {
|
|
||||||
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an implementation of {@link MetadataProvider}.
|
* Sets an implementation of {@link MetadataProvider}.
|
||||||
*
|
*
|
||||||
@ -110,22 +101,18 @@ public final class InAppMuxer implements Muxer {
|
|||||||
|
|
||||||
/** Builds a {@link Factory} instance. */
|
/** Builds a {@link Factory} instance. */
|
||||||
public Factory build() {
|
public Factory build() {
|
||||||
return new Factory(
|
return new Factory(metadataProvider, fragmentedMp4Enabled, fragmentDurationUs);
|
||||||
maxDelayBetweenSamplesMs, metadataProvider, fragmentedMp4Enabled, fragmentDurationUs);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final long maxDelayBetweenSamplesMs;
|
|
||||||
private final @Nullable MetadataProvider metadataProvider;
|
private final @Nullable MetadataProvider metadataProvider;
|
||||||
private final boolean fragmentedMp4Enabled;
|
private final boolean fragmentedMp4Enabled;
|
||||||
private final int fragmentDurationUs;
|
private final int fragmentDurationUs;
|
||||||
|
|
||||||
private Factory(
|
private Factory(
|
||||||
long maxDelayBetweenSamplesMs,
|
|
||||||
@Nullable MetadataProvider metadataProvider,
|
@Nullable MetadataProvider metadataProvider,
|
||||||
boolean fragmentedMp4Enabled,
|
boolean fragmentedMp4Enabled,
|
||||||
int fragmentDurationUs) {
|
int fragmentDurationUs) {
|
||||||
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
|
||||||
this.metadataProvider = metadataProvider;
|
this.metadataProvider = metadataProvider;
|
||||||
this.fragmentedMp4Enabled = fragmentedMp4Enabled;
|
this.fragmentedMp4Enabled = fragmentedMp4Enabled;
|
||||||
this.fragmentDurationUs = fragmentDurationUs;
|
this.fragmentDurationUs = fragmentDurationUs;
|
||||||
@ -145,7 +132,7 @@ public final class InAppMuxer implements Muxer {
|
|||||||
.setFragmentedMp4Enabled(fragmentedMp4Enabled)
|
.setFragmentedMp4Enabled(fragmentedMp4Enabled)
|
||||||
.setFragmentDurationUs(fragmentDurationUs)
|
.setFragmentDurationUs(fragmentDurationUs)
|
||||||
.build();
|
.build();
|
||||||
return new InAppMuxer(mp4Muxer, maxDelayBetweenSamplesMs, metadataProvider);
|
return new InAppMuxer(mp4Muxer, metadataProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -160,18 +147,13 @@ public final class InAppMuxer implements Muxer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final Mp4Muxer mp4Muxer;
|
private final Mp4Muxer mp4Muxer;
|
||||||
private final long maxDelayBetweenSamplesMs;
|
|
||||||
private final @Nullable MetadataProvider metadataProvider;
|
private final @Nullable MetadataProvider metadataProvider;
|
||||||
private final List<TrackToken> trackTokenList;
|
private final List<TrackToken> trackTokenList;
|
||||||
private final BufferInfo bufferInfo;
|
private final BufferInfo bufferInfo;
|
||||||
private final Set<Metadata.Entry> metadataEntries;
|
private final Set<Metadata.Entry> metadataEntries;
|
||||||
|
|
||||||
private InAppMuxer(
|
private InAppMuxer(Mp4Muxer mp4Muxer, @Nullable MetadataProvider metadataProvider) {
|
||||||
Mp4Muxer mp4Muxer,
|
|
||||||
long maxDelayBetweenSamplesMs,
|
|
||||||
@Nullable MetadataProvider metadataProvider) {
|
|
||||||
this.mp4Muxer = mp4Muxer;
|
this.mp4Muxer = mp4Muxer;
|
||||||
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
|
||||||
this.metadataProvider = metadataProvider;
|
this.metadataProvider = metadataProvider;
|
||||||
trackTokenList = new ArrayList<>();
|
trackTokenList = new ArrayList<>();
|
||||||
bufferInfo = new BufferInfo();
|
bufferInfo = new BufferInfo();
|
||||||
@ -247,11 +229,6 @@ public final class InAppMuxer implements Muxer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getMaxDelayBetweenSamplesMs() {
|
|
||||||
return maxDelayBetweenSamplesMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeMetadata() {
|
private void writeMetadata() {
|
||||||
if (metadataProvider != null) {
|
if (metadataProvider != null) {
|
||||||
Set<Metadata.Entry> metadataEntriesCopy = new LinkedHashSet<>(metadataEntries);
|
Set<Metadata.Entry> metadataEntriesCopy = new LinkedHashSet<>(metadataEntries);
|
||||||
|
@ -104,16 +104,4 @@ public interface Muxer {
|
|||||||
* forCancellation} is false.
|
* forCancellation} is false.
|
||||||
*/
|
*/
|
||||||
void release(boolean forCancellation) throws MuxerException;
|
void release(boolean forCancellation) throws MuxerException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the maximum delay allowed between output samples, in milliseconds, or {@link
|
|
||||||
* C#TIME_UNSET} if there is no maximum.
|
|
||||||
*
|
|
||||||
* <p>This is the maximum delay between samples of any track. They can be of the same or of
|
|
||||||
* different track types.
|
|
||||||
*
|
|
||||||
* <p>This value is used to abort the export when the maximum delay is reached. Note that there is
|
|
||||||
* no guarantee that the export will be aborted exactly at that time.
|
|
||||||
*/
|
|
||||||
long getMaxDelayBetweenSamplesMs();
|
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
private final SparseArray<TrackInfo> trackTypeToInfo;
|
private final SparseArray<TrackInfo> trackTypeToInfo;
|
||||||
private final ScheduledExecutorService abortScheduledExecutorService;
|
private final ScheduledExecutorService abortScheduledExecutorService;
|
||||||
private final @MonotonicNonNull Format appendVideoFormat;
|
private final @MonotonicNonNull Format appendVideoFormat;
|
||||||
|
private final long maxDelayBetweenSamplesMs;
|
||||||
|
|
||||||
private boolean isReady;
|
private boolean isReady;
|
||||||
private boolean isEnded;
|
private boolean isEnded;
|
||||||
@ -177,6 +178,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
* presentation timestamps before the first video sample.
|
* presentation timestamps before the first video sample.
|
||||||
* @param appendVideoFormat The format which will be used to write samples after transitioning
|
* @param appendVideoFormat The format which will be used to write samples after transitioning
|
||||||
* from {@link #MUXER_MODE_MUX_PARTIAL} to {@link #MUXER_MODE_APPEND}.
|
* from {@link #MUXER_MODE_MUX_PARTIAL} to {@link #MUXER_MODE_APPEND}.
|
||||||
|
* @param maxDelayBetweenSamplesMs The maximum delay allowed between output samples regardless of
|
||||||
|
* the track type, or {@link C#TIME_UNSET} if there is no maximum.
|
||||||
*/
|
*/
|
||||||
public MuxerWrapper(
|
public MuxerWrapper(
|
||||||
String outputPath,
|
String outputPath,
|
||||||
@ -184,7 +187,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
Listener listener,
|
Listener listener,
|
||||||
@MuxerMode int muxerMode,
|
@MuxerMode int muxerMode,
|
||||||
boolean dropSamplesBeforeFirstVideoSample,
|
boolean dropSamplesBeforeFirstVideoSample,
|
||||||
@Nullable Format appendVideoFormat) {
|
@Nullable Format appendVideoFormat,
|
||||||
|
long maxDelayBetweenSamplesMs) {
|
||||||
this.outputPath = outputPath;
|
this.outputPath = outputPath;
|
||||||
this.muxerFactory = muxerFactory;
|
this.muxerFactory = muxerFactory;
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
@ -196,6 +200,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
|| (muxerMode == MUXER_MODE_MUX_PARTIAL && appendVideoFormat != null),
|
|| (muxerMode == MUXER_MODE_MUX_PARTIAL && appendVideoFormat != null),
|
||||||
"appendVideoFormat must be present if and only if muxerMode is MUXER_MODE_MUX_PARTIAL.");
|
"appendVideoFormat must be present if and only if muxerMode is MUXER_MODE_MUX_PARTIAL.");
|
||||||
this.appendVideoFormat = appendVideoFormat;
|
this.appendVideoFormat = appendVideoFormat;
|
||||||
|
this.maxDelayBetweenSamplesMs = maxDelayBetweenSamplesMs;
|
||||||
trackTypeToInfo = new SparseArray<>();
|
trackTypeToInfo = new SparseArray<>();
|
||||||
previousTrackType = C.TRACK_TYPE_NONE;
|
previousTrackType = C.TRACK_TYPE_NONE;
|
||||||
firstVideoPresentationTimeUs = C.TIME_UNSET;
|
firstVideoPresentationTimeUs = C.TIME_UNSET;
|
||||||
@ -673,7 +678,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
|
|
||||||
private void resetAbortTimer() {
|
private void resetAbortTimer() {
|
||||||
checkStateNotNull(muxer);
|
checkStateNotNull(muxer);
|
||||||
long maxDelayBetweenSamplesMs = muxer.getMaxDelayBetweenSamplesMs();
|
|
||||||
if (maxDelayBetweenSamplesMs == C.TIME_UNSET) {
|
if (maxDelayBetweenSamplesMs == C.TIME_UNSET) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,7 @@ public final class Transformer {
|
|||||||
private boolean flattenForSlowMotion;
|
private boolean flattenForSlowMotion;
|
||||||
private boolean trimOptimizationEnabled;
|
private boolean trimOptimizationEnabled;
|
||||||
private boolean fileStartsOnVideoFrameEnabled;
|
private boolean fileStartsOnVideoFrameEnabled;
|
||||||
|
private long maxDelayBetweenMuxerSamplesMs;
|
||||||
private ListenerSet<Transformer.Listener> listeners;
|
private ListenerSet<Transformer.Listener> listeners;
|
||||||
private AssetLoader.@MonotonicNonNull Factory assetLoaderFactory;
|
private AssetLoader.@MonotonicNonNull Factory assetLoaderFactory;
|
||||||
private AudioMixer.Factory audioMixerFactory;
|
private AudioMixer.Factory audioMixerFactory;
|
||||||
@ -129,6 +130,7 @@ public final class Transformer {
|
|||||||
*/
|
*/
|
||||||
public Builder(Context context) {
|
public Builder(Context context) {
|
||||||
this.context = context.getApplicationContext();
|
this.context = context.getApplicationContext();
|
||||||
|
maxDelayBetweenMuxerSamplesMs = DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS;
|
||||||
audioProcessors = ImmutableList.of();
|
audioProcessors = ImmutableList.of();
|
||||||
videoEffects = ImmutableList.of();
|
videoEffects = ImmutableList.of();
|
||||||
audioMixerFactory = new DefaultAudioMixer.Factory();
|
audioMixerFactory = new DefaultAudioMixer.Factory();
|
||||||
@ -153,6 +155,7 @@ public final class Transformer {
|
|||||||
this.removeVideo = transformer.removeVideo;
|
this.removeVideo = transformer.removeVideo;
|
||||||
this.trimOptimizationEnabled = transformer.trimOptimizationEnabled;
|
this.trimOptimizationEnabled = transformer.trimOptimizationEnabled;
|
||||||
this.fileStartsOnVideoFrameEnabled = transformer.fileStartsOnVideoFrameEnabled;
|
this.fileStartsOnVideoFrameEnabled = transformer.fileStartsOnVideoFrameEnabled;
|
||||||
|
this.maxDelayBetweenMuxerSamplesMs = transformer.maxDelayBetweenMuxerSamplesMs;
|
||||||
this.listeners = transformer.listeners;
|
this.listeners = transformer.listeners;
|
||||||
this.assetLoaderFactory = transformer.assetLoaderFactory;
|
this.assetLoaderFactory = transformer.assetLoaderFactory;
|
||||||
this.audioMixerFactory = transformer.audioMixerFactory;
|
this.audioMixerFactory = transformer.audioMixerFactory;
|
||||||
@ -329,7 +332,7 @@ public final class Transformer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set whether to ensure that the output file starts on a video frame.
|
* Sets whether to ensure that the output file starts on a video frame.
|
||||||
*
|
*
|
||||||
* <p>Any audio samples that are earlier than the first video frame will be dropped. This can
|
* <p>Any audio samples that are earlier than the first video frame will be dropped. This can
|
||||||
* make the output of trimming operations more compatible with player implementations that don't
|
* make the output of trimming operations more compatible with player implementations that don't
|
||||||
@ -347,6 +350,24 @@ public final class Transformer {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the maximum delay allowed between output samples regardless of the track type, or {@link
|
||||||
|
* C#TIME_UNSET} if there is no maximum. The default value is {@link
|
||||||
|
* #DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS}.
|
||||||
|
*
|
||||||
|
* <p>The export will be aborted when no sample is written in {@code
|
||||||
|
* maxDelayBetweenMuxerSamplesMs}. Note that there is no guarantee that the export will be
|
||||||
|
* aborted exactly at that time.
|
||||||
|
*
|
||||||
|
* @param maxDelayBetweenMuxerSamplesMs The maximum delay allowed (in microseconds).
|
||||||
|
* @return This builder.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public Builder setMaxDelayBetweenMuxerSamplesMs(long maxDelayBetweenMuxerSamplesMs) {
|
||||||
|
this.maxDelayBetweenMuxerSamplesMs = maxDelayBetweenMuxerSamplesMs;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Use {@link #addListener(Listener)}, {@link #removeListener(Listener)} or {@link
|
* @deprecated Use {@link #addListener(Listener)}, {@link #removeListener(Listener)} or {@link
|
||||||
* #removeAllListeners()} instead.
|
* #removeAllListeners()} instead.
|
||||||
@ -564,6 +585,7 @@ public final class Transformer {
|
|||||||
flattenForSlowMotion,
|
flattenForSlowMotion,
|
||||||
trimOptimizationEnabled,
|
trimOptimizationEnabled,
|
||||||
fileStartsOnVideoFrameEnabled,
|
fileStartsOnVideoFrameEnabled,
|
||||||
|
maxDelayBetweenMuxerSamplesMs,
|
||||||
listeners,
|
listeners,
|
||||||
assetLoaderFactory,
|
assetLoaderFactory,
|
||||||
audioMixerFactory,
|
audioMixerFactory,
|
||||||
@ -730,6 +752,12 @@ 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default value for the {@linkplain Builder#setMaxDelayBetweenMuxerSamplesMs maximum delay
|
||||||
|
* between output samples}.
|
||||||
|
*/
|
||||||
|
public static final long DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS = 10_000;
|
||||||
|
|
||||||
@Documented
|
@Documented
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@Target(TYPE_USE)
|
@Target(TYPE_USE)
|
||||||
@ -808,6 +836,8 @@ public final class Transformer {
|
|||||||
private final boolean flattenForSlowMotion;
|
private final boolean flattenForSlowMotion;
|
||||||
private final boolean trimOptimizationEnabled;
|
private final boolean trimOptimizationEnabled;
|
||||||
private final boolean fileStartsOnVideoFrameEnabled;
|
private final boolean fileStartsOnVideoFrameEnabled;
|
||||||
|
private final long maxDelayBetweenMuxerSamplesMs;
|
||||||
|
|
||||||
private final ListenerSet<Transformer.Listener> listeners;
|
private final ListenerSet<Transformer.Listener> listeners;
|
||||||
@Nullable private final AssetLoader.Factory assetLoaderFactory;
|
@Nullable private final AssetLoader.Factory assetLoaderFactory;
|
||||||
private final AudioMixer.Factory audioMixerFactory;
|
private final AudioMixer.Factory audioMixerFactory;
|
||||||
@ -843,6 +873,7 @@ public final class Transformer {
|
|||||||
boolean flattenForSlowMotion,
|
boolean flattenForSlowMotion,
|
||||||
boolean trimOptimizationEnabled,
|
boolean trimOptimizationEnabled,
|
||||||
boolean fileStartsOnVideoFrameEnabled,
|
boolean fileStartsOnVideoFrameEnabled,
|
||||||
|
long maxDelayBetweenMuxerSamplesMs,
|
||||||
ListenerSet<Listener> listeners,
|
ListenerSet<Listener> listeners,
|
||||||
@Nullable AssetLoader.Factory assetLoaderFactory,
|
@Nullable AssetLoader.Factory assetLoaderFactory,
|
||||||
AudioMixer.Factory audioMixerFactory,
|
AudioMixer.Factory audioMixerFactory,
|
||||||
@ -862,6 +893,7 @@ public final class Transformer {
|
|||||||
this.flattenForSlowMotion = flattenForSlowMotion;
|
this.flattenForSlowMotion = flattenForSlowMotion;
|
||||||
this.trimOptimizationEnabled = trimOptimizationEnabled;
|
this.trimOptimizationEnabled = trimOptimizationEnabled;
|
||||||
this.fileStartsOnVideoFrameEnabled = fileStartsOnVideoFrameEnabled;
|
this.fileStartsOnVideoFrameEnabled = fileStartsOnVideoFrameEnabled;
|
||||||
|
this.maxDelayBetweenMuxerSamplesMs = maxDelayBetweenMuxerSamplesMs;
|
||||||
this.listeners = listeners;
|
this.listeners = listeners;
|
||||||
this.assetLoaderFactory = assetLoaderFactory;
|
this.assetLoaderFactory = assetLoaderFactory;
|
||||||
this.audioMixerFactory = audioMixerFactory;
|
this.audioMixerFactory = audioMixerFactory;
|
||||||
@ -1006,7 +1038,8 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
MuxerWrapper.MUXER_MODE_DEFAULT,
|
MuxerWrapper.MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ fileStartsOnVideoFrameEnabled,
|
/* dropSamplesBeforeFirstVideoSample= */ fileStartsOnVideoFrameEnabled,
|
||||||
/* appendVideoFormat= */ null),
|
/* appendVideoFormat= */ null,
|
||||||
|
maxDelayBetweenMuxerSamplesMs),
|
||||||
componentListener,
|
componentListener,
|
||||||
/* initialTimestampOffsetUs= */ 0,
|
/* initialTimestampOffsetUs= */ 0,
|
||||||
/* useDefaultAssetLoaderFactory= */ false);
|
/* useDefaultAssetLoaderFactory= */ false);
|
||||||
@ -1256,7 +1289,8 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
MuxerWrapper.MUXER_MODE_DEFAULT,
|
MuxerWrapper.MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null),
|
/* appendVideoFormat= */ null,
|
||||||
|
maxDelayBetweenMuxerSamplesMs),
|
||||||
componentListener,
|
componentListener,
|
||||||
/* initialTimestampOffsetUs= */ 0,
|
/* initialTimestampOffsetUs= */ 0,
|
||||||
/* useDefaultAssetLoaderFactory= */ false);
|
/* useDefaultAssetLoaderFactory= */ false);
|
||||||
@ -1289,7 +1323,8 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
MuxerWrapper.MUXER_MODE_MUX_PARTIAL,
|
MuxerWrapper.MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ resumeMetadata.videoFormat);
|
/* appendVideoFormat= */ resumeMetadata.videoFormat,
|
||||||
|
maxDelayBetweenMuxerSamplesMs);
|
||||||
|
|
||||||
startInternal(
|
startInternal(
|
||||||
TransmuxTranscodeHelper.createVideoOnlyComposition(
|
TransmuxTranscodeHelper.createVideoOnlyComposition(
|
||||||
@ -1340,7 +1375,8 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
MuxerWrapper.MUXER_MODE_DEFAULT,
|
MuxerWrapper.MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
maxDelayBetweenMuxerSamplesMs);
|
||||||
|
|
||||||
startInternal(
|
startInternal(
|
||||||
TransmuxTranscodeHelper.createAudioTranscodeAndVideoTransmuxComposition(
|
TransmuxTranscodeHelper.createAudioTranscodeAndVideoTransmuxComposition(
|
||||||
@ -1435,7 +1471,8 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
MuxerWrapper.MUXER_MODE_MUX_PARTIAL,
|
MuxerWrapper.MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
mp4Info.videoFormat);
|
mp4Info.videoFormat,
|
||||||
|
maxDelayBetweenMuxerSamplesMs);
|
||||||
if (shouldTranscodeVideo(
|
if (shouldTranscodeVideo(
|
||||||
checkNotNull(mp4Info.videoFormat),
|
checkNotNull(mp4Info.videoFormat),
|
||||||
composition,
|
composition,
|
||||||
|
@ -52,11 +52,7 @@ public final class CapturingMuxer implements Muxer, Dumpable {
|
|||||||
@Nullable private CapturingMuxer muxer;
|
@Nullable private CapturingMuxer muxer;
|
||||||
|
|
||||||
public Factory() {
|
public Factory() {
|
||||||
this(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
|
this.wrappedFactory = new DefaultMuxer.Factory();
|
||||||
}
|
|
||||||
|
|
||||||
public Factory(long maxDelayBetweenSamplesMs) {
|
|
||||||
this.wrappedFactory = new DefaultMuxer.Factory(maxDelayBetweenSamplesMs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the most recently {@linkplain #create created} {@code TestMuxer}. */
|
/** Returns the most recently {@linkplain #create created} {@code TestMuxer}. */
|
||||||
@ -136,11 +132,6 @@ public final class CapturingMuxer implements Muxer, Dumpable {
|
|||||||
wrappedMuxer.release(forCancellation);
|
wrappedMuxer.release(forCancellation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getMaxDelayBetweenSamplesMs() {
|
|
||||||
return wrappedMuxer.getMaxDelayBetweenSamplesMs();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dumper.Dumpable implementation.
|
// Dumper.Dumpable implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -69,7 +69,8 @@ public final class EncodedSampleExporterTest {
|
|||||||
mock(MuxerWrapper.Listener.class),
|
mock(MuxerWrapper.Listener.class),
|
||||||
MuxerWrapper.MUXER_MODE_DEFAULT,
|
MuxerWrapper.MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null),
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS),
|
||||||
fallbackListener,
|
fallbackListener,
|
||||||
/* initialTimestampOffsetUs= */ 0);
|
/* initialTimestampOffsetUs= */ 0);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ package androidx.media3.transformer;
|
|||||||
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runLooperUntil;
|
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runLooperUntil;
|
||||||
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED;
|
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED;
|
||||||
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED;
|
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED;
|
||||||
import static androidx.media3.transformer.DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS;
|
|
||||||
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_NA;
|
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_NA;
|
||||||
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED;
|
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED;
|
||||||
import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM;
|
import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM;
|
||||||
@ -919,10 +918,10 @@ public final class MediaItemExportTest {
|
|||||||
decoderFactory,
|
decoderFactory,
|
||||||
new FakeClock(/* isAutoAdvancing= */ true),
|
new FakeClock(/* isAutoAdvancing= */ true),
|
||||||
mediaSourceFactory);
|
mediaSourceFactory);
|
||||||
CapturingMuxer.Factory muxerFactory =
|
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory();
|
||||||
new CapturingMuxer.Factory(/* maxDelayBetweenSamplesMs= */ 1);
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
createTransformerBuilder(muxerFactory, /* enableFallback= */ false)
|
createTransformerBuilder(muxerFactory, /* enableFallback= */ false)
|
||||||
|
.setMaxDelayBetweenMuxerSamplesMs(1)
|
||||||
.setAssetLoaderFactory(assetLoaderFactory)
|
.setAssetLoaderFactory(assetLoaderFactory)
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
|
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
|
||||||
@ -936,10 +935,11 @@ public final class MediaItemExportTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void start_withUnsetMaxDelayBetweenSamples_completesSuccessfully() throws Exception {
|
public void start_withUnsetMaxDelayBetweenSamples_completesSuccessfully() throws Exception {
|
||||||
CapturingMuxer.Factory muxerFactory =
|
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory();
|
||||||
new CapturingMuxer.Factory(/* maxDelayBetweenSamplesMs= */ C.TIME_UNSET);
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build();
|
createTransformerBuilder(muxerFactory, /* enableFallback= */ false)
|
||||||
|
.setMaxDelayBetweenMuxerSamplesMs(C.TIME_UNSET)
|
||||||
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
|
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
|
||||||
|
|
||||||
transformer.start(mediaItem, outputDir.newFile().getPath());
|
transformer.start(mediaItem, outputDir.newFile().getPath());
|
||||||
@ -1490,8 +1490,7 @@ public final class MediaItemExportTest {
|
|||||||
// FrameworkMuxer.
|
// FrameworkMuxer.
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
createTransformerBuilder(
|
createTransformerBuilder(
|
||||||
new FrameworkMuxer.Factory(DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS, C.TIME_UNSET),
|
new FrameworkMuxer.Factory(C.TIME_UNSET), /* enableFallback= */ false)
|
||||||
/* enableFallback= */ false)
|
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ELST_SKIP_500MS);
|
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ELST_SKIP_500MS);
|
||||||
|
|
||||||
|
@ -91,7 +91,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setAdditionalRotationDegrees(90);
|
muxerWrapper.setAdditionalRotationDegrees(90);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.setAdditionalRotationDegrees(180);
|
muxerWrapper.setAdditionalRotationDegrees(180);
|
||||||
@ -109,7 +110,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setAdditionalRotationDegrees(90);
|
muxerWrapper.setAdditionalRotationDegrees(90);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.setAdditionalRotationDegrees(180);
|
muxerWrapper.setAdditionalRotationDegrees(180);
|
||||||
@ -127,7 +129,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
|
|
||||||
assertThrows(IllegalStateException.class, muxerWrapper::changeToAppendMode);
|
assertThrows(IllegalStateException.class, muxerWrapper::changeToAppendMode);
|
||||||
}
|
}
|
||||||
@ -144,7 +147,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null));
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -156,7 +160,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
|
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
@ -179,7 +184,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -202,7 +208,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ differentVideoFormat);
|
/* appendVideoFormat= */ differentVideoFormat,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -237,7 +244,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ differentVideoFormat);
|
/* appendVideoFormat= */ differentVideoFormat,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -263,7 +271,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -290,7 +299,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ true,
|
/* dropSamplesBeforeFirstVideoSample= */ true,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(2);
|
muxerWrapper.setTrackCount(2);
|
||||||
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
@ -318,7 +328,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ true,
|
/* dropSamplesBeforeFirstVideoSample= */ true,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(2);
|
muxerWrapper.setTrackCount(2);
|
||||||
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_AUDIO_TRACK_FORMAT);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
@ -357,7 +368,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -378,7 +390,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
|
|
||||||
muxerWrapper.setTrackCount(2);
|
muxerWrapper.setTrackCount(2);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
@ -407,7 +420,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -564,7 +578,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -590,7 +605,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
@ -615,7 +631,8 @@ public class MuxerWrapperTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_MUX_PARTIAL,
|
MUXER_MODE_MUX_PARTIAL,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT);
|
/* appendVideoFormat= */ FAKE_VIDEO_TRACK_FORMAT,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
muxerWrapper.setTrackCount(1);
|
muxerWrapper.setTrackCount(1);
|
||||||
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
muxerWrapper.addTrackFormat(FAKE_VIDEO_TRACK_FORMAT);
|
||||||
muxerWrapper.writeSample(
|
muxerWrapper.writeSample(
|
||||||
|
@ -71,7 +71,8 @@ public final class TransformerUtilTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
|
|
||||||
assertThat(
|
assertThat(
|
||||||
shouldTranscodeVideo(
|
shouldTranscodeVideo(
|
||||||
@ -104,7 +105,8 @@ public final class TransformerUtilTest {
|
|||||||
new NoOpMuxerListenerImpl(),
|
new NoOpMuxerListenerImpl(),
|
||||||
MUXER_MODE_DEFAULT,
|
MUXER_MODE_DEFAULT,
|
||||||
/* dropSamplesBeforeFirstVideoSample= */ false,
|
/* dropSamplesBeforeFirstVideoSample= */ false,
|
||||||
/* appendVideoFormat= */ null);
|
/* appendVideoFormat= */ null,
|
||||||
|
Transformer.DEFAULT_MAX_DELAY_BETWEEN_MUXER_SAMPLES_MS);
|
||||||
|
|
||||||
assertThat(
|
assertThat(
|
||||||
shouldTranscodeVideo(
|
shouldTranscodeVideo(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user