Commit a5288a20 by kimvde Committed by Rohit Singh

Add a queue at the start of the buffer SamplePipelines

This improves performance and makes the code more intuitive.

PiperOrigin-RevId: 501220234
parent 4a91a234
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package com.google.android.exoplayer2.transformer; package com.google.android.exoplayer2.transformer;
import static com.google.android.exoplayer2.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT;
import static com.google.android.exoplayer2.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED; import static com.google.android.exoplayer2.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED;
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.checkState; import static com.google.android.exoplayer2.util.Assertions.checkState;
...@@ -31,24 +32,28 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -31,24 +32,28 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
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 java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.List; import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.Pure;
/** Pipeline to process, re-encode and mux raw audio samples. */ /** Pipeline to process, re-encode and mux raw audio samples. */
/* package */ final class AudioSamplePipeline extends SamplePipeline { /* package */ final class AudioSamplePipeline extends SamplePipeline {
private static final int MAX_INPUT_BUFFER_COUNT = 10;
private static final int DEFAULT_ENCODER_BITRATE = 128 * 1024; private static final int DEFAULT_ENCODER_BITRATE = 128 * 1024;
@Nullable private final SilentAudioGenerator silentAudioGenerator; @Nullable private final SilentAudioGenerator silentAudioGenerator;
private final DecoderInputBuffer inputBuffer; private final Queue<DecoderInputBuffer> availableInputBuffers;
private final Queue<DecoderInputBuffer> pendingInputBuffers;
private final AudioProcessingPipeline audioProcessingPipeline; private final AudioProcessingPipeline audioProcessingPipeline;
private final Codec encoder; private final Codec encoder;
private final AudioFormat encoderInputAudioFormat; private final AudioFormat encoderInputAudioFormat;
private final DecoderInputBuffer encoderInputBuffer; private final DecoderInputBuffer encoderInputBuffer;
private final DecoderInputBuffer encoderOutputBuffer; private final DecoderInputBuffer encoderOutputBuffer;
private boolean hasPendingInputBuffer;
private long nextEncoderInputBufferTimeUs; private long nextEncoderInputBufferTimeUs;
private long encoderBufferDurationRemainder; private long encoderBufferDurationRemainder;
...@@ -72,7 +77,15 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -72,7 +77,15 @@ import org.checkerframework.dataflow.qual.Pure;
silentAudioGenerator = null; silentAudioGenerator = null;
} }
inputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED); availableInputBuffers = new ConcurrentLinkedDeque<>();
ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
for (int i = 0; i < MAX_INPUT_BUFFER_COUNT; i++) {
DecoderInputBuffer inputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DIRECT);
inputBuffer.data = emptyBuffer;
availableInputBuffers.add(inputBuffer);
}
pendingInputBuffers = new ConcurrentLinkedDeque<>();
encoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED); encoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
encoderOutputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED); encoderOutputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
...@@ -140,12 +153,12 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -140,12 +153,12 @@ import org.checkerframework.dataflow.qual.Pure;
@Override @Override
@Nullable @Nullable
public DecoderInputBuffer getInputBuffer() { public DecoderInputBuffer getInputBuffer() {
return hasPendingInputBuffer ? null : inputBuffer; return availableInputBuffers.peek();
} }
@Override @Override
public void queueInputBuffer() { public void queueInputBuffer() {
hasPendingInputBuffer = true; pendingInputBuffers.add(availableInputBuffers.remove());
} }
@Override @Override
...@@ -197,22 +210,34 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -197,22 +210,34 @@ import org.checkerframework.dataflow.qual.Pure;
* @return Whether it may be possible to feed more data immediately by calling this method again. * @return Whether it may be possible to feed more data immediately by calling this method again.
*/ */
private boolean feedEncoderFromInput() throws TransformationException { private boolean feedEncoderFromInput() throws TransformationException {
if ((!isInputSilent() && !hasPendingInputBuffer) if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) {
|| !encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { return false;
}
if (isInputSilent()) {
if (silentAudioGenerator.isEnded()) {
queueEndOfStreamToEncoder();
return false;
}
feedEncoder(silentAudioGenerator.getBuffer());
return true;
}
if (pendingInputBuffers.isEmpty()) {
return false; return false;
} }
if (isInputSilent() ? silentAudioGenerator.isEnded() : inputBuffer.isEndOfStream()) { DecoderInputBuffer pendingInputBuffer = pendingInputBuffers.element();
if (pendingInputBuffer.isEndOfStream()) {
queueEndOfStreamToEncoder(); queueEndOfStreamToEncoder();
hasPendingInputBuffer = false; removePendingInputBuffer();
return false; return false;
} }
ByteBuffer inputData = ByteBuffer inputData = checkNotNull(pendingInputBuffer.data);
isInputSilent() ? silentAudioGenerator.getBuffer() : checkNotNull(inputBuffer.data);
feedEncoder(inputData); feedEncoder(inputData);
if (!inputData.hasRemaining()) { if (!inputData.hasRemaining()) {
hasPendingInputBuffer = false; removePendingInputBuffer();
} }
return true; return true;
} }
...@@ -246,27 +271,44 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -246,27 +271,44 @@ import org.checkerframework.dataflow.qual.Pure;
* @return Whether it may be possible to feed more data immediately by calling this method again. * @return Whether it may be possible to feed more data immediately by calling this method again.
*/ */
private boolean feedProcessingPipelineFromInput() { private boolean feedProcessingPipelineFromInput() {
if (!isInputSilent() && !hasPendingInputBuffer) { if (isInputSilent()) {
if (silentAudioGenerator.isEnded()) {
audioProcessingPipeline.queueEndOfStream();
return false;
}
ByteBuffer inputData = silentAudioGenerator.getBuffer();
audioProcessingPipeline.queueInput(inputData);
return !inputData.hasRemaining();
}
if (pendingInputBuffers.isEmpty()) {
return false; return false;
} }
if (isInputSilent() ? silentAudioGenerator.isEnded() : inputBuffer.isEndOfStream()) { DecoderInputBuffer pendingInputBuffer = pendingInputBuffers.element();
if (pendingInputBuffer.isEndOfStream()) {
audioProcessingPipeline.queueEndOfStream(); audioProcessingPipeline.queueEndOfStream();
hasPendingInputBuffer = false; removePendingInputBuffer();
return false; return false;
} }
checkState(!audioProcessingPipeline.isEnded());
ByteBuffer inputData = ByteBuffer inputData = checkNotNull(pendingInputBuffer.data);
isInputSilent() ? silentAudioGenerator.getBuffer() : checkNotNull(inputBuffer.data);
audioProcessingPipeline.queueInput(inputData); audioProcessingPipeline.queueInput(inputData);
if (inputData.hasRemaining()) { if (inputData.hasRemaining()) {
return false; return false;
} }
hasPendingInputBuffer = false;
removePendingInputBuffer();
return true; return true;
} }
private void removePendingInputBuffer() {
DecoderInputBuffer inputBuffer = pendingInputBuffers.remove();
inputBuffer.clear();
inputBuffer.timeUs = 0;
availableInputBuffers.add(inputBuffer);
}
/** /**
* Feeds as much data as possible between the current position and limit of the specified {@link * Feeds as much data as possible between the current position and limit of the specified {@link
* ByteBuffer} to the encoder, and advances its position by the number of bytes fed. * ByteBuffer} to the encoder, and advances its position by the number of bytes fed.
......
...@@ -16,17 +16,26 @@ ...@@ -16,17 +16,26 @@
package com.google.android.exoplayer2.transformer; package com.google.android.exoplayer2.transformer;
import static com.google.android.exoplayer2.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
/** Pipeline that muxes encoded samples without any transcoding or transformation. */ /** Pipeline that muxes encoded samples without any transcoding or transformation. */
/* package */ final class EncodedSamplePipeline extends SamplePipeline { /* package */ final class EncodedSamplePipeline extends SamplePipeline {
private final DecoderInputBuffer buffer; private static final int MAX_INPUT_BUFFER_COUNT = 10;
private final Format format; private final Format format;
private final Queue<DecoderInputBuffer> availableInputBuffers;
private final Queue<DecoderInputBuffer> pendingInputBuffers;
private boolean hasPendingBuffer; private volatile boolean inputEnded;
public EncodedSamplePipeline( public EncodedSamplePipeline(
Format format, Format format,
...@@ -36,7 +45,14 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -36,7 +45,14 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
FallbackListener fallbackListener) { FallbackListener fallbackListener) {
super(format, streamStartPositionUs, muxerWrapper); super(format, streamStartPositionUs, muxerWrapper);
this.format = format; this.format = format;
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); availableInputBuffers = new ConcurrentLinkedDeque<>();
ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
for (int i = 0; i < MAX_INPUT_BUFFER_COUNT; i++) {
DecoderInputBuffer inputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DIRECT);
inputBuffer.data = emptyBuffer;
availableInputBuffers.add(inputBuffer);
}
pendingInputBuffers = new ConcurrentLinkedDeque<>();
fallbackListener.onTransformationRequestFinalized(transformationRequest); fallbackListener.onTransformationRequestFinalized(transformationRequest);
} }
...@@ -48,13 +64,16 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -48,13 +64,16 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
@Override @Override
@Nullable @Nullable
public DecoderInputBuffer getInputBuffer() { public DecoderInputBuffer getInputBuffer() {
return hasPendingBuffer ? null : buffer; return availableInputBuffers.peek();
} }
@Override @Override
public void queueInputBuffer() { public void queueInputBuffer() {
if (buffer.data != null && buffer.data.hasRemaining()) { DecoderInputBuffer inputBuffer = availableInputBuffers.remove();
hasPendingBuffer = true; if (inputBuffer.isEndOfStream()) {
inputEnded = true;
} else {
pendingInputBuffers.add(inputBuffer);
} }
} }
...@@ -69,17 +88,19 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; ...@@ -69,17 +88,19 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
@Override @Override
@Nullable @Nullable
protected DecoderInputBuffer getMuxerInputBuffer() { protected DecoderInputBuffer getMuxerInputBuffer() {
return hasPendingBuffer ? buffer : null; return pendingInputBuffers.peek();
} }
@Override @Override
protected void releaseMuxerInputBuffer() { protected void releaseMuxerInputBuffer() {
buffer.clear(); DecoderInputBuffer inputBuffer = pendingInputBuffers.remove();
hasPendingBuffer = false; inputBuffer.clear();
inputBuffer.timeUs = 0;
availableInputBuffers.add(inputBuffer);
} }
@Override @Override
protected boolean isMuxerInputEnded() { protected boolean isMuxerInputEnded() {
return buffer.isEndOfStream(); return inputEnded && pendingInputBuffers.isEmpty();
} }
} }
...@@ -31,8 +31,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -31,8 +31,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private final Codec.DecoderFactory decoderFactory; private final Codec.DecoderFactory decoderFactory;
@Nullable private ByteBuffer pendingDecoderOutputBuffer;
public ExoAssetLoaderAudioRenderer( public ExoAssetLoaderAudioRenderer(
Codec.DecoderFactory decoderFactory, Codec.DecoderFactory decoderFactory,
TransformerMediaClock mediaClock, TransformerMediaClock mediaClock,
...@@ -66,31 +64,25 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -66,31 +64,25 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
} }
Codec decoder = checkNotNull(this.decoder); Codec decoder = checkNotNull(this.decoder);
if (pendingDecoderOutputBuffer != null) {
if (pendingDecoderOutputBuffer.hasRemaining()) {
return false;
} else {
decoder.releaseOutputBuffer(/* render= */ false);
pendingDecoderOutputBuffer = null;
}
}
if (decoder.isEnded()) { if (decoder.isEnded()) {
sampleConsumerInputBuffer.data = null;
sampleConsumerInputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); sampleConsumerInputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM);
sampleConsumer.queueInputBuffer(); sampleConsumer.queueInputBuffer();
isEnded = true; isEnded = true;
return false; return false;
} }
pendingDecoderOutputBuffer = decoder.getOutputBuffer(); ByteBuffer decoderOutputBuffer = decoder.getOutputBuffer();
if (pendingDecoderOutputBuffer == null) { if (decoderOutputBuffer == null) {
return false; return false;
} }
sampleConsumerInputBuffer.data = pendingDecoderOutputBuffer; sampleConsumerInputBuffer.ensureSpaceForWrite(decoderOutputBuffer.limit());
sampleConsumerInputBuffer.data.put(decoderOutputBuffer).flip();
MediaCodec.BufferInfo bufferInfo = checkNotNull(decoder.getOutputBufferInfo()); MediaCodec.BufferInfo bufferInfo = checkNotNull(decoder.getOutputBufferInfo());
sampleConsumerInputBuffer.timeUs = bufferInfo.presentationTimeUs; sampleConsumerInputBuffer.timeUs = bufferInfo.presentationTimeUs;
sampleConsumerInputBuffer.setFlags(bufferInfo.flags); sampleConsumerInputBuffer.setFlags(bufferInfo.flags);
decoder.releaseOutputBuffer(/* render= */ false);
sampleConsumer.queueInputBuffer(); sampleConsumer.queueInputBuffer();
return true; return true;
} }
......
...@@ -20,14 +20,16 @@ import androidx.annotation.Nullable; ...@@ -20,14 +20,16 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.video.ColorInfo; import com.google.android.exoplayer2.video.ColorInfo;
/** Consumer of encoded media samples, raw audio or raw video frames. */ /**
* Consumer of encoded media samples, raw audio or raw video frames.
*
* <p>All the methods in this class can be called from any thread.
*/
public interface SampleConsumer { public interface SampleConsumer {
/** /**
* Returns whether the consumer should be fed with decoded sample data. If false, encoded sample * Returns whether the consumer should be fed with decoded sample data. If false, encoded sample
* data should be fed. * data should be fed.
*
* <p>Can be called on any thread.
*/ */
boolean expectsDecodedData(); boolean expectsDecodedData();
...@@ -65,8 +67,6 @@ public interface SampleConsumer { ...@@ -65,8 +67,6 @@ public interface SampleConsumer {
* Returns the input {@link Surface}, where the consumer reads input frames from. * Returns the input {@link Surface}, where the consumer reads input frames from.
* *
* <p>Should only be used for raw video data. * <p>Should only be used for raw video data.
*
* <p>Can be called on any thread.
*/ */
default Surface getInputSurface() { default Surface getInputSurface() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
...@@ -76,8 +76,6 @@ public interface SampleConsumer { ...@@ -76,8 +76,6 @@ public interface SampleConsumer {
* Returns the expected input {@link ColorInfo}. * Returns the expected input {@link ColorInfo}.
* *
* <p>Should only be used for raw video data. * <p>Should only be used for raw video data.
*
* <p>Can be called on any thread.
*/ */
default ColorInfo getExpectedColorInfo() { default ColorInfo getExpectedColorInfo() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
...@@ -89,8 +87,6 @@ public interface SampleConsumer { ...@@ -89,8 +87,6 @@ public interface SampleConsumer {
* {@linkplain #getInputSurface() input surface} yet. * {@linkplain #getInputSurface() input surface} yet.
* *
* <p>Should only be used for raw video data. * <p>Should only be used for raw video data.
*
* <p>Can be called on any thread.
*/ */
default int getPendingVideoFrameCount() { default int getPendingVideoFrameCount() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
...@@ -103,8 +99,6 @@ public interface SampleConsumer { ...@@ -103,8 +99,6 @@ public interface SampleConsumer {
* <p>Must be called before rendering a frame to the input surface. * <p>Must be called before rendering a frame to the input surface.
* *
* <p>Should only be used for raw video data. * <p>Should only be used for raw video data.
*
* <p>Can be called on any thread.
*/ */
default void registerVideoFrame() { default void registerVideoFrame() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
...@@ -114,8 +108,6 @@ public interface SampleConsumer { ...@@ -114,8 +108,6 @@ public interface SampleConsumer {
* Informs the consumer that no further input frames will be rendered. * Informs the consumer that no further input frames will be rendered.
* *
* <p>Should only be used for raw video data. * <p>Should only be used for raw video data.
*
* <p>Can be called on any thread.
*/ */
default void signalEndOfVideoInput() { default void signalEndOfVideoInput() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
......
...@@ -29,14 +29,12 @@ import android.os.HandlerThread; ...@@ -29,14 +29,12 @@ import android.os.HandlerThread;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.view.Surface;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
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.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.mp4.SlowMotionData; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData;
import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.Clock;
...@@ -46,7 +44,6 @@ import com.google.android.exoplayer2.util.Effect; ...@@ -46,7 +44,6 @@ import com.google.android.exoplayer2.util.Effect;
import com.google.android.exoplayer2.util.FrameProcessor; 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.android.exoplayer2.video.ColorInfo;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
...@@ -85,13 +82,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -85,13 +82,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
// Internal messages. // Internal messages.
private static final int MSG_START = 0; private static final int MSG_START = 0;
private static final int MSG_REGISTER_SAMPLE_PIPELINE = 1; private static final int MSG_REGISTER_SAMPLE_PIPELINE = 1;
private static final int MSG_DEQUEUE_BUFFER = 2; private static final int MSG_DRAIN_PIPELINES = 2;
private static final int MSG_QUEUE_BUFFER = 3; private static final int MSG_END = 3;
private static final int MSG_DRAIN_PIPELINES = 4; private static final int MSG_UPDATE_PROGRESS = 4;
private static final int MSG_END = 5;
private static final int MSG_UPDATE_PROGRESS = 6;
private static final int DRAIN_PIPELINES_DELAY_MS = 50; private static final int DRAIN_PIPELINES_DELAY_MS = 10;
private final Context context; private final Context context;
private final TransformationRequest transformationRequest; private final TransformationRequest transformationRequest;
...@@ -109,14 +104,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -109,14 +104,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final HandlerWrapper internalHandler; private final HandlerWrapper internalHandler;
private final AssetLoader assetLoader; private final AssetLoader assetLoader;
private final List<SamplePipeline> samplePipelines; private final List<SamplePipeline> samplePipelines;
private final ConditionVariable dequeueBufferConditionVariable;
private final MuxerWrapper muxerWrapper; private final MuxerWrapper muxerWrapper;
private final ConditionVariable transformerConditionVariable; private final ConditionVariable transformerConditionVariable;
private final TransformationResult.Builder transformationResultBuilder; private final TransformationResult.Builder transformationResultBuilder;
@Nullable private DecoderInputBuffer pendingInputBuffer;
private boolean isDrainingPipelines; private boolean isDrainingPipelines;
private int silentSamplePipelineIndex;
private @Transformer.ProgressState int progressState; private @Transformer.ProgressState int progressState;
private @MonotonicNonNull RuntimeException cancelException; private @MonotonicNonNull RuntimeException cancelException;
...@@ -167,8 +159,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -167,8 +159,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
.setDecoderFactory(this.decoderFactory) .setDecoderFactory(this.decoderFactory)
.createAssetLoader(mediaItem, internalLooper, componentListener); .createAssetLoader(mediaItem, internalLooper, componentListener);
samplePipelines = new ArrayList<>(); samplePipelines = new ArrayList<>();
silentSamplePipelineIndex = C.INDEX_UNSET;
dequeueBufferConditionVariable = new ConditionVariable();
muxerWrapper = muxerWrapper =
new MuxerWrapper(outputPath, outputParcelFileDescriptor, muxerFactory, componentListener); new MuxerWrapper(outputPath, outputParcelFileDescriptor, muxerFactory, componentListener);
transformerConditionVariable = new ConditionVariable(); transformerConditionVariable = new ConditionVariable();
...@@ -227,12 +217,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -227,12 +217,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
case MSG_REGISTER_SAMPLE_PIPELINE: case MSG_REGISTER_SAMPLE_PIPELINE:
registerSamplePipelineInternal((SamplePipeline) msg.obj); registerSamplePipelineInternal((SamplePipeline) msg.obj);
break; break;
case MSG_DEQUEUE_BUFFER:
dequeueBufferInternal(/* samplePipelineIndex= */ msg.arg1);
break;
case MSG_QUEUE_BUFFER:
samplePipelines.get(/* index= */ msg.arg1).queueInputBuffer();
break;
case MSG_DRAIN_PIPELINES: case MSG_DRAIN_PIPELINES:
drainPipelinesInternal(); drainPipelinesInternal();
break; break;
...@@ -262,25 +246,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -262,25 +246,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private void registerSamplePipelineInternal(SamplePipeline samplePipeline) { private void registerSamplePipelineInternal(SamplePipeline samplePipeline) {
samplePipelines.add(samplePipeline); samplePipelines.add(samplePipeline);
if (!isDrainingPipelines) { if (!isDrainingPipelines) {
// Make sure pipelines are drained regularly to prevent them from getting stuck. internalHandler.sendEmptyMessage(MSG_DRAIN_PIPELINES);
internalHandler.sendEmptyMessageDelayed(MSG_DRAIN_PIPELINES, DRAIN_PIPELINES_DELAY_MS);
isDrainingPipelines = true; isDrainingPipelines = true;
} }
} }
private void dequeueBufferInternal(int samplePipelineIndex) throws TransformationException {
SamplePipeline samplePipeline = samplePipelines.get(samplePipelineIndex);
// The sample pipeline is drained before dequeuing input to maximise the chances of having an
// input buffer to dequeue.
while (samplePipeline.processData()) {}
pendingInputBuffer = samplePipeline.getInputBuffer();
dequeueBufferConditionVariable.open();
if (forceSilentAudio) {
while (samplePipelines.get(silentSamplePipelineIndex).processData()) {}
}
}
private void drainPipelinesInternal() throws TransformationException { private void drainPipelinesInternal() throws TransformationException {
for (int i = 0; i < samplePipelines.size(); i++) { for (int i = 0; i < samplePipelines.size(); i++) {
while (samplePipelines.get(i).processData()) {} while (samplePipelines.get(i).processData()) {}
...@@ -304,10 +274,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -304,10 +274,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
if (!released) { if (!released) {
released = true; released = true;
// Make sure there is no dequeue action waiting on the asset loader thread to avoid a
// deadlock when releasing it.
pendingInputBuffer = null;
dequeueBufferConditionVariable.open();
try { try {
try { try {
assetLoader.release(); assetLoader.release();
...@@ -372,7 +338,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -372,7 +338,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final FallbackListener fallbackListener; private final FallbackListener fallbackListener;
private final AtomicInteger trackCount; private final AtomicInteger trackCount;
private int tracksAddedCount; private boolean trackAdded;
private volatile long durationUs; private volatile long durationUs;
...@@ -421,18 +387,17 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -421,18 +387,17 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
long streamStartPositionUs, long streamStartPositionUs,
long streamOffsetUs) long streamOffsetUs)
throws TransformationException { throws TransformationException {
if (tracksAddedCount == 0) { if (!trackAdded) {
// Call setTrackCount() methods here so that they are called from the same thread as the // Call setTrackCount() methods here so that they are called from the same thread as the
// MuxerWrapper and FallbackListener methods called when building the sample pipelines. // MuxerWrapper and FallbackListener methods called when building the sample pipelines.
muxerWrapper.setTrackCount(trackCount.get()); muxerWrapper.setTrackCount(trackCount.get());
fallbackListener.setTrackCount(trackCount.get()); fallbackListener.setTrackCount(trackCount.get());
trackAdded = true;
} }
SamplePipeline samplePipeline = SamplePipeline samplePipeline =
getSamplePipeline(format, supportedOutputTypes, streamStartPositionUs, streamOffsetUs); getSamplePipeline(format, supportedOutputTypes, streamStartPositionUs, streamOffsetUs);
internalHandler.obtainMessage(MSG_REGISTER_SAMPLE_PIPELINE, samplePipeline).sendToTarget(); internalHandler.obtainMessage(MSG_REGISTER_SAMPLE_PIPELINE, samplePipeline).sendToTarget();
int samplePipelineIndex = tracksAddedCount;
tracksAddedCount++;
if (forceSilentAudio) { if (forceSilentAudio) {
Format silentAudioFormat = Format silentAudioFormat =
...@@ -450,11 +415,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -450,11 +415,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
internalHandler internalHandler
.obtainMessage(MSG_REGISTER_SAMPLE_PIPELINE, audioSamplePipeline) .obtainMessage(MSG_REGISTER_SAMPLE_PIPELINE, audioSamplePipeline)
.sendToTarget(); .sendToTarget();
silentSamplePipelineIndex = tracksAddedCount;
tracksAddedCount++;
} }
return new SampleConsumerImpl(samplePipelineIndex, samplePipeline); return samplePipeline;
} }
// MuxerWrapper.Listener implementation. // MuxerWrapper.Listener implementation.
...@@ -631,73 +594,5 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -631,73 +594,5 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
return false; return false;
} }
private class SampleConsumerImpl implements SampleConsumer {
private final int samplePipelineIndex;
private final SamplePipeline samplePipeline;
public SampleConsumerImpl(int samplePipelineIndex, SamplePipeline samplePipeline) {
this.samplePipelineIndex = samplePipelineIndex;
this.samplePipeline = samplePipeline;
}
@Override
public boolean expectsDecodedData() {
return samplePipeline.expectsDecodedData();
}
@Nullable
@Override
public DecoderInputBuffer getInputBuffer() {
if (released) {
// Make sure there is no dequeue action waiting on the asset loader thread when it is
// being released to avoid a deadlock.
return null;
}
// TODO(b/252537210): Reduce the number of thread hops (for example by adding a queue at the
// start of the sample pipelines). Having 2 thread hops per sample (one for dequeuing and
// one for queuing) makes transmuxing slower than it used to be.
internalHandler
.obtainMessage(MSG_DEQUEUE_BUFFER, samplePipelineIndex, /* unused */ 0)
.sendToTarget();
clock.onThreadBlocked();
dequeueBufferConditionVariable.blockUninterruptible();
dequeueBufferConditionVariable.close();
return pendingInputBuffer;
}
@Override
public void queueInputBuffer() {
internalHandler
.obtainMessage(MSG_QUEUE_BUFFER, samplePipelineIndex, /* unused */ 0)
.sendToTarget();
}
@Override
public Surface getInputSurface() {
return samplePipeline.getInputSurface();
}
@Override
public ColorInfo getExpectedColorInfo() {
return samplePipeline.getExpectedColorInfo();
}
@Override
public int getPendingVideoFrameCount() {
return samplePipeline.getPendingVideoFrameCount();
}
@Override
public void registerVideoFrame() {
samplePipeline.registerVideoFrame();
}
@Override
public void signalEndOfVideoInput() {
samplePipeline.signalEndOfVideoInput();
}
}
} }
} }
...@@ -570,9 +570,10 @@ public final class TransformerEndToEndTest { ...@@ -570,9 +570,10 @@ public final class TransformerEndToEndTest {
// This would throw if the previous transformation had not been cancelled. // This would throw if the previous transformation had not been cancelled.
transformer.startTransformation(mediaItem, outputPath); transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runLooper(transformer); TransformationResult transformationResult = TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO)); // TODO(b/264974805): Make transformation output deterministic and check it against dump file.
assertThat(transformationResult.transformationException).isNull();
} }
@Test @Test
......
...@@ -15,6 +15,66 @@ format 1: ...@@ -15,6 +15,66 @@ format 1:
data = length 30, hash F6F3D010 data = length 30, hash F6F3D010
data = length 10, hash 7A0D0F2B data = length 10, hash 7A0D0F2B
sample: sample:
trackIndex = 1
dataHashCode = -252482306
size = 36477
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = 67864034
size = 5341
isKeyFrame = false
presentationTimeUs = 67000
sample:
trackIndex = 1
dataHashCode = 897273234
size = 596
isKeyFrame = false
presentationTimeUs = 33000
sample:
trackIndex = 1
dataHashCode = -1549870586
size = 7704
isKeyFrame = false
presentationTimeUs = 200000
sample:
trackIndex = 1
dataHashCode = 672384813
size = 989
isKeyFrame = false
presentationTimeUs = 133000
sample:
trackIndex = 1
dataHashCode = -988996493
size = 721
isKeyFrame = false
presentationTimeUs = 100000
sample:
trackIndex = 1
dataHashCode = 1711151377
size = 519
isKeyFrame = false
presentationTimeUs = 167000
sample:
trackIndex = 1
dataHashCode = -506806036
size = 6160
isKeyFrame = false
presentationTimeUs = 333000
sample:
trackIndex = 1
dataHashCode = 1902167649
size = 953
isKeyFrame = false
presentationTimeUs = 267000
sample:
trackIndex = 1
dataHashCode = 2054873212
size = 620
isKeyFrame = false
presentationTimeUs = 233000
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 555688582 dataHashCode = 555688582
size = 416 size = 416
...@@ -81,90 +141,6 @@ sample: ...@@ -81,90 +141,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 47370 presentationTimeUs = 47370
sample: sample:
trackIndex = 1
dataHashCode = -252482306
size = 36477
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = 67864034
size = 5341
isKeyFrame = false
presentationTimeUs = 67000
sample:
trackIndex = 1
dataHashCode = 897273234
size = 596
isKeyFrame = false
presentationTimeUs = 33000
sample:
trackIndex = 1
dataHashCode = -1549870586
size = 7704
isKeyFrame = false
presentationTimeUs = 200000
sample:
trackIndex = 1
dataHashCode = 672384813
size = 989
isKeyFrame = false
presentationTimeUs = 133000
sample:
trackIndex = 1
dataHashCode = -988996493
size = 721
isKeyFrame = false
presentationTimeUs = 100000
sample:
trackIndex = 1
dataHashCode = 1711151377
size = 519
isKeyFrame = false
presentationTimeUs = 167000
sample:
trackIndex = 1
dataHashCode = -506806036
size = 6160
isKeyFrame = false
presentationTimeUs = 333000
sample:
trackIndex = 1
dataHashCode = 1902167649
size = 953
isKeyFrame = false
presentationTimeUs = 267000
sample:
trackIndex = 1
dataHashCode = 2054873212
size = 620
isKeyFrame = false
presentationTimeUs = 233000
sample:
trackIndex = 1
dataHashCode = 1556608231
size = 405
isKeyFrame = false
presentationTimeUs = 300000
sample:
trackIndex = 1
dataHashCode = -1648978019
size = 4852
isKeyFrame = false
presentationTimeUs = 433000
sample:
trackIndex = 1
dataHashCode = -484808327
size = 547
isKeyFrame = false
presentationTimeUs = 400000
sample:
trackIndex = 1
dataHashCode = -20706048
size = 570
isKeyFrame = false
presentationTimeUs = 367000
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1124371059 dataHashCode = -1124371059
size = 418 size = 418
...@@ -195,12 +171,6 @@ sample: ...@@ -195,12 +171,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 71066 presentationTimeUs = 71066
sample: sample:
trackIndex = 1
dataHashCode = 2085064574
size = 5525
isKeyFrame = false
presentationTimeUs = 567000
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1297086772 dataHashCode = 1297086772
size = 418 size = 418
...@@ -225,6 +195,54 @@ sample: ...@@ -225,6 +195,54 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 90023 presentationTimeUs = 90023
sample: sample:
trackIndex = 1
dataHashCode = 1556608231
size = 405
isKeyFrame = false
presentationTimeUs = 300000
sample:
trackIndex = 1
dataHashCode = -1648978019
size = 4852
isKeyFrame = false
presentationTimeUs = 433000
sample:
trackIndex = 1
dataHashCode = -484808327
size = 547
isKeyFrame = false
presentationTimeUs = 400000
sample:
trackIndex = 1
dataHashCode = -20706048
size = 570
isKeyFrame = false
presentationTimeUs = 367000
sample:
trackIndex = 1
dataHashCode = 2085064574
size = 5525
isKeyFrame = false
presentationTimeUs = 567000
sample:
trackIndex = 1
dataHashCode = -637074022
size = 1082
isKeyFrame = false
presentationTimeUs = 500000
sample:
trackIndex = 1
dataHashCode = -1824027029
size = 807
isKeyFrame = false
presentationTimeUs = 467000
sample:
trackIndex = 1
dataHashCode = -1701945306
size = 744
isKeyFrame = false
presentationTimeUs = 533000
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -551926260 dataHashCode = -551926260
size = 418 size = 418
...@@ -280,24 +298,6 @@ sample: ...@@ -280,24 +298,6 @@ sample:
presentationTimeUs = 132676 presentationTimeUs = 132676
sample: sample:
trackIndex = 1 trackIndex = 1
dataHashCode = -637074022
size = 1082
isKeyFrame = false
presentationTimeUs = 500000
sample:
trackIndex = 1
dataHashCode = -1824027029
size = 807
isKeyFrame = false
presentationTimeUs = 467000
sample:
trackIndex = 1
dataHashCode = -1701945306
size = 744
isKeyFrame = false
presentationTimeUs = 533000
sample:
trackIndex = 1
dataHashCode = -952425536 dataHashCode = -952425536
size = 4732 size = 4732
isKeyFrame = false isKeyFrame = false
......
...@@ -15,6 +15,66 @@ format 1: ...@@ -15,6 +15,66 @@ format 1:
data = length 29, hash 4746B5D9 data = length 29, hash 4746B5D9
data = length 10, hash 7A0D0F2B data = length 10, hash 7A0D0F2B
sample: sample:
trackIndex = 1
dataHashCode = -770308242
size = 36692
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = -732087136
size = 5312
isKeyFrame = false
presentationTimeUs = 66733
sample:
trackIndex = 1
dataHashCode = 468156717
size = 599
isKeyFrame = false
presentationTimeUs = 33366
sample:
trackIndex = 1
dataHashCode = 1150349584
size = 7735
isKeyFrame = false
presentationTimeUs = 200200
sample:
trackIndex = 1
dataHashCode = 1443582006
size = 987
isKeyFrame = false
presentationTimeUs = 133466
sample:
trackIndex = 1
dataHashCode = -310585145
size = 673
isKeyFrame = false
presentationTimeUs = 100100
sample:
trackIndex = 1
dataHashCode = 807460688
size = 523
isKeyFrame = false
presentationTimeUs = 166833
sample:
trackIndex = 1
dataHashCode = 1936487090
size = 6061
isKeyFrame = false
presentationTimeUs = 333666
sample:
trackIndex = 1
dataHashCode = -32297181
size = 992
isKeyFrame = false
presentationTimeUs = 266933
sample:
trackIndex = 1
dataHashCode = 1529616406
size = 623
isKeyFrame = false
presentationTimeUs = 233566
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1868041800 dataHashCode = 1868041800
size = 22 size = 22
...@@ -87,90 +147,6 @@ sample: ...@@ -87,90 +147,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 20875 presentationTimeUs = 20875
sample: sample:
trackIndex = 1
dataHashCode = -770308242
size = 36692
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = -732087136
size = 5312
isKeyFrame = false
presentationTimeUs = 66733
sample:
trackIndex = 1
dataHashCode = 468156717
size = 599
isKeyFrame = false
presentationTimeUs = 33366
sample:
trackIndex = 1
dataHashCode = 1150349584
size = 7735
isKeyFrame = false
presentationTimeUs = 200200
sample:
trackIndex = 1
dataHashCode = 1443582006
size = 987
isKeyFrame = false
presentationTimeUs = 133466
sample:
trackIndex = 1
dataHashCode = -310585145
size = 673
isKeyFrame = false
presentationTimeUs = 100100
sample:
trackIndex = 1
dataHashCode = 807460688
size = 523
isKeyFrame = false
presentationTimeUs = 166833
sample:
trackIndex = 1
dataHashCode = 1936487090
size = 6061
isKeyFrame = false
presentationTimeUs = 333666
sample:
trackIndex = 1
dataHashCode = -32297181
size = 992
isKeyFrame = false
presentationTimeUs = 266933
sample:
trackIndex = 1
dataHashCode = 1529616406
size = 623
isKeyFrame = false
presentationTimeUs = 233566
sample:
trackIndex = 1
dataHashCode = 1949198785
size = 421
isKeyFrame = false
presentationTimeUs = 300300
sample:
trackIndex = 1
dataHashCode = -147880287
size = 4899
isKeyFrame = false
presentationTimeUs = 433766
sample:
trackIndex = 1
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 1
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1536715689 dataHashCode = -1536715689
size = 248 size = 248
...@@ -219,6 +195,30 @@ sample: ...@@ -219,6 +195,30 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 41396 presentationTimeUs = 41396
sample: sample:
trackIndex = 1
dataHashCode = 1949198785
size = 421
isKeyFrame = false
presentationTimeUs = 300300
sample:
trackIndex = 1
dataHashCode = -147880287
size = 4899
isKeyFrame = false
presentationTimeUs = 433766
sample:
trackIndex = 1
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 1
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 172275944 dataHashCode = 172275944
size = 260 size = 260
...@@ -285,6 +285,24 @@ sample: ...@@ -285,6 +285,24 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 567233 presentationTimeUs = 567233
sample: sample:
trackIndex = 1
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 1
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 1
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1290952882 dataHashCode = -1290952882
size = 260 size = 260
...@@ -375,24 +393,6 @@ sample: ...@@ -375,24 +393,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 107646 presentationTimeUs = 107646
sample: sample:
trackIndex = 1
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 1
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 1
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -2065 dataHashCode = -2065
size = 2 size = 2
......
...@@ -22,12 +22,6 @@ format 1: ...@@ -22,12 +22,6 @@ format 1:
data = length 29, hash 4746B5D9 data = length 29, hash 4746B5D9
data = length 10, hash 7A0D0F2B data = length 10, hash 7A0D0F2B
sample: sample:
trackIndex = 0
dataHashCode = 1205768497
size = 23
isKeyFrame = true
presentationTimeUs = 44000
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = -770308242 dataHashCode = -770308242
size = 36692 size = 36692
...@@ -88,29 +82,11 @@ sample: ...@@ -88,29 +82,11 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 233566 presentationTimeUs = 233566
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = 1949198785 dataHashCode = 1205768497
size = 421 size = 23
isKeyFrame = false isKeyFrame = true
presentationTimeUs = 300300 presentationTimeUs = 44000
sample:
trackIndex = 1
dataHashCode = -147880287
size = 4899
isKeyFrame = false
presentationTimeUs = 433766
sample:
trackIndex = 1
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 1
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 837571078 dataHashCode = 837571078
...@@ -124,12 +100,6 @@ sample: ...@@ -124,12 +100,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 90439 presentationTimeUs = 90439
sample: sample:
trackIndex = 1
dataHashCode = -261176150
size = 5450
isKeyFrame = false
presentationTimeUs = 567233
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -822987359 dataHashCode = -822987359
size = 189 size = 189
...@@ -172,6 +142,66 @@ sample: ...@@ -172,6 +142,66 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 252979 presentationTimeUs = 252979
sample: sample:
trackIndex = 1
dataHashCode = 1949198785
size = 421
isKeyFrame = false
presentationTimeUs = 300300
sample:
trackIndex = 1
dataHashCode = -147880287
size = 4899
isKeyFrame = false
presentationTimeUs = 433766
sample:
trackIndex = 1
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 1
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackIndex = 1
dataHashCode = -261176150
size = 5450
isKeyFrame = false
presentationTimeUs = 567233
sample:
trackIndex = 1
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 1
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 1
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 1
dataHashCode = -1408463661
size = 4725
isKeyFrame = false
presentationTimeUs = 700700
sample:
trackIndex = 1
dataHashCode = 1569455924
size = 1022
isKeyFrame = false
presentationTimeUs = 633966
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1478106136 dataHashCode = 1478106136
size = 211 size = 211
...@@ -232,66 +262,6 @@ sample: ...@@ -232,66 +262,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 485179 presentationTimeUs = 485179
sample: sample:
trackIndex = 0
dataHashCode = 1687543702
size = 241
isKeyFrame = true
presentationTimeUs = 508399
sample:
trackIndex = 0
dataHashCode = 1675188486
size = 228
isKeyFrame = true
presentationTimeUs = 531619
sample:
trackIndex = 0
dataHashCode = 888567545
size = 238
isKeyFrame = true
presentationTimeUs = 554839
sample:
trackIndex = 0
dataHashCode = -439631803
size = 234
isKeyFrame = true
presentationTimeUs = 578058
sample:
trackIndex = 1
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 0
dataHashCode = 1606694497
size = 231
isKeyFrame = true
presentationTimeUs = 601278
sample:
trackIndex = 1
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 1
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 1
dataHashCode = -1408463661
size = 4725
isKeyFrame = false
presentationTimeUs = 700700
sample:
trackIndex = 1
dataHashCode = 1569455924
size = 1022
isKeyFrame = false
presentationTimeUs = 633966
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = -1723778407 dataHashCode = -1723778407
size = 790 size = 790
...@@ -353,6 +323,36 @@ sample: ...@@ -353,6 +323,36 @@ sample:
presentationTimeUs = 934266 presentationTimeUs = 934266
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1687543702
size = 241
isKeyFrame = true
presentationTimeUs = 508399
sample:
trackIndex = 0
dataHashCode = 1675188486
size = 228
isKeyFrame = true
presentationTimeUs = 531619
sample:
trackIndex = 0
dataHashCode = 888567545
size = 238
isKeyFrame = true
presentationTimeUs = 554839
sample:
trackIndex = 0
dataHashCode = -439631803
size = 234
isKeyFrame = true
presentationTimeUs = 578058
sample:
trackIndex = 0
dataHashCode = 1606694497
size = 231
isKeyFrame = true
presentationTimeUs = 601278
sample:
trackIndex = 0
dataHashCode = 1747388653 dataHashCode = 1747388653
size = 217 size = 217
isKeyFrame = true isKeyFrame = true
......
...@@ -159,6 +159,54 @@ sample: ...@@ -159,6 +159,54 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 66733 presentationTimeUs = 66733
sample: sample:
trackIndex = 0
dataHashCode = 468156717
size = 599
isKeyFrame = false
presentationTimeUs = 33366
sample:
trackIndex = 0
dataHashCode = 1150349584
size = 7735
isKeyFrame = false
presentationTimeUs = 200200
sample:
trackIndex = 0
dataHashCode = 1443582006
size = 987
isKeyFrame = false
presentationTimeUs = 133466
sample:
trackIndex = 0
dataHashCode = -310585145
size = 673
isKeyFrame = false
presentationTimeUs = 100100
sample:
trackIndex = 0
dataHashCode = 807460688
size = 523
isKeyFrame = false
presentationTimeUs = 166833
sample:
trackIndex = 0
dataHashCode = 1936487090
size = 6061
isKeyFrame = false
presentationTimeUs = 333666
sample:
trackIndex = 0
dataHashCode = -32297181
size = 992
isKeyFrame = false
presentationTimeUs = 266933
sample:
trackIndex = 0
dataHashCode = 1529616406
size = 623
isKeyFrame = false
presentationTimeUs = 233566
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1742602241 dataHashCode = 1742602241
size = 4096 size = 4096
...@@ -177,18 +225,6 @@ sample: ...@@ -177,18 +225,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 557279 presentationTimeUs = 557279
sample: sample:
trackIndex = 0
dataHashCode = 468156717
size = 599
isKeyFrame = false
presentationTimeUs = 33366
sample:
trackIndex = 0
dataHashCode = 1150349584
size = 7735
isKeyFrame = false
presentationTimeUs = 200200
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1742602241 dataHashCode = 1742602241
size = 4096 size = 4096
...@@ -225,30 +261,6 @@ sample: ...@@ -225,30 +261,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 696599 presentationTimeUs = 696599
sample: sample:
trackIndex = 0
dataHashCode = 1443582006
size = 987
isKeyFrame = false
presentationTimeUs = 133466
sample:
trackIndex = 0
dataHashCode = -310585145
size = 673
isKeyFrame = false
presentationTimeUs = 100100
sample:
trackIndex = 0
dataHashCode = 807460688
size = 523
isKeyFrame = false
presentationTimeUs = 166833
sample:
trackIndex = 0
dataHashCode = 1936487090
size = 6061
isKeyFrame = false
presentationTimeUs = 333666
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1742602241 dataHashCode = 1742602241
size = 4096 size = 4096
...@@ -280,18 +292,6 @@ sample: ...@@ -280,18 +292,6 @@ sample:
presentationTimeUs = 812699 presentationTimeUs = 812699
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -32297181
size = 992
isKeyFrame = false
presentationTimeUs = 266933
sample:
trackIndex = 0
dataHashCode = 1529616406
size = 623
isKeyFrame = false
presentationTimeUs = 233566
sample:
trackIndex = 0
dataHashCode = 1949198785 dataHashCode = 1949198785
size = 421 size = 421
isKeyFrame = false isKeyFrame = false
...@@ -303,6 +303,54 @@ sample: ...@@ -303,6 +303,54 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 433766 presentationTimeUs = 433766
sample: sample:
trackIndex = 0
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 0
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackIndex = 0
dataHashCode = -261176150
size = 5450
isKeyFrame = false
presentationTimeUs = 567233
sample:
trackIndex = 0
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 0
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 0
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 0
dataHashCode = -1408463661
size = 4725
isKeyFrame = false
presentationTimeUs = 700700
sample:
trackIndex = 0
dataHashCode = 1569455924
size = 1022
isKeyFrame = false
presentationTimeUs = 633966
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1742602241 dataHashCode = 1742602241
size = 4096 size = 4096
...@@ -333,24 +381,6 @@ sample: ...@@ -333,24 +381,6 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 928799 presentationTimeUs = 928799
sample: sample:
trackIndex = 0
dataHashCode = 1369083472
size = 568
isKeyFrame = false
presentationTimeUs = 400400
sample:
trackIndex = 0
dataHashCode = 965782073
size = 620
isKeyFrame = false
presentationTimeUs = 367033
sample:
trackIndex = 0
dataHashCode = -261176150
size = 5450
isKeyFrame = false
presentationTimeUs = 567233
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1742602241 dataHashCode = 1742602241
size = 4096 size = 4096
...@@ -376,36 +406,6 @@ sample: ...@@ -376,36 +406,6 @@ sample:
presentationTimeUs = 1021679 presentationTimeUs = 1021679
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1830836678
size = 1051
isKeyFrame = false
presentationTimeUs = 500500
sample:
trackIndex = 0
dataHashCode = 1767407540
size = 874
isKeyFrame = false
presentationTimeUs = 467133
sample:
trackIndex = 0
dataHashCode = 918440283
size = 781
isKeyFrame = false
presentationTimeUs = 533866
sample:
trackIndex = 0
dataHashCode = -1408463661
size = 4725
isKeyFrame = false
presentationTimeUs = 700700
sample:
trackIndex = 0
dataHashCode = 1569455924
size = 1022
isKeyFrame = false
presentationTimeUs = 633966
sample:
trackIndex = 0
dataHashCode = -1723778407 dataHashCode = -1723778407
size = 790 size = 790
isKeyFrame = false isKeyFrame = false
......
...@@ -16,6 +16,66 @@ format 1: ...@@ -16,6 +16,66 @@ format 1:
data = length 33, hash D3FB879D data = length 33, hash D3FB879D
data = length 10, hash 7A0D0F2B data = length 10, hash 7A0D0F2B
sample: sample:
trackIndex = 1
dataHashCode = 1949079733
size = 5446
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = -1397194508
size = 125
isKeyFrame = false
presentationTimeUs = 14000
sample:
trackIndex = 1
dataHashCode = 1147159698
size = 147
isKeyFrame = false
presentationTimeUs = 47333
sample:
trackIndex = 1
dataHashCode = 524634358
size = 149
isKeyFrame = false
presentationTimeUs = 80667
sample:
trackIndex = 1
dataHashCode = 2031178347
size = 149
isKeyFrame = false
presentationTimeUs = 114000
sample:
trackIndex = 1
dataHashCode = -625462168
size = 169
isKeyFrame = false
presentationTimeUs = 147333
sample:
trackIndex = 1
dataHashCode = -973299745
size = 126
isKeyFrame = false
presentationTimeUs = 180667
sample:
trackIndex = 1
dataHashCode = -788426325
size = 120
isKeyFrame = false
presentationTimeUs = 228042
sample:
trackIndex = 1
dataHashCode = 2009515523
size = 126
isKeyFrame = false
presentationTimeUs = 244708
sample:
trackIndex = 1
dataHashCode = -874600600
size = 1180
isKeyFrame = false
presentationTimeUs = 334083
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -212376212 dataHashCode = -212376212
size = 20 size = 20
...@@ -88,65 +148,35 @@ sample: ...@@ -88,65 +148,35 @@ sample:
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 23000 presentationTimeUs = 23000
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = 1949079733 dataHashCode = 1580199067
size = 5446 size = 232
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 0 presentationTimeUs = 25917
sample:
trackIndex = 1
dataHashCode = -1397194508
size = 125
isKeyFrame = false
presentationTimeUs = 14000
sample:
trackIndex = 1
dataHashCode = 1147159698
size = 147
isKeyFrame = false
presentationTimeUs = 47333
sample:
trackIndex = 1
dataHashCode = 524634358
size = 149
isKeyFrame = false
presentationTimeUs = 80667
sample:
trackIndex = 1
dataHashCode = 2031178347
size = 149
isKeyFrame = false
presentationTimeUs = 114000
sample:
trackIndex = 1
dataHashCode = -625462168
size = 169
isKeyFrame = false
presentationTimeUs = 147333
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = -973299745 dataHashCode = 475464086
size = 126 size = 184
isKeyFrame = false isKeyFrame = true
presentationTimeUs = 180667 presentationTimeUs = 30750
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = -788426325 dataHashCode = -211754132
size = 120 size = 172
isKeyFrame = false isKeyFrame = true
presentationTimeUs = 228042 presentationTimeUs = 34584
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = 2009515523 dataHashCode = 1236547164
size = 126 size = 172
isKeyFrame = false isKeyFrame = true
presentationTimeUs = 244708 presentationTimeUs = 38167
sample: sample:
trackIndex = 1 trackIndex = 0
dataHashCode = -874600600 dataHashCode = -2064216186
size = 1180 size = 188
isKeyFrame = false isKeyFrame = true
presentationTimeUs = 334083 presentationTimeUs = 41750
sample: sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 984869991 dataHashCode = 984869991
...@@ -191,36 +221,6 @@ sample: ...@@ -191,36 +221,6 @@ sample:
presentationTimeUs = 434083 presentationTimeUs = 434083
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1580199067
size = 232
isKeyFrame = true
presentationTimeUs = 25917
sample:
trackIndex = 0
dataHashCode = 475464086
size = 184
isKeyFrame = true
presentationTimeUs = 30750
sample:
trackIndex = 0
dataHashCode = -211754132
size = 172
isKeyFrame = true
presentationTimeUs = 34584
sample:
trackIndex = 0
dataHashCode = 1236547164
size = 172
isKeyFrame = true
presentationTimeUs = 38167
sample:
trackIndex = 0
dataHashCode = -2064216186
size = 188
isKeyFrame = true
presentationTimeUs = 41750
sample:
trackIndex = 0
dataHashCode = -682950885 dataHashCode = -682950885
size = 260 size = 260
isKeyFrame = true isKeyFrame = true
......
...@@ -28,12 +28,6 @@ format 1: ...@@ -28,12 +28,6 @@ format 1:
data = length 31, hash 4B108214 data = length 31, hash 4B108214
data = length 9, hash FBA158BB data = length 9, hash FBA158BB
sample: sample:
trackIndex = 0
dataHashCode = 620415738
size = 508
isKeyFrame = true
presentationTimeUs = 7020
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 983000500 dataHashCode = 983000500
size = 13539 size = 13539
...@@ -94,6 +88,66 @@ sample: ...@@ -94,6 +88,66 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 150000 presentationTimeUs = 150000
sample: sample:
trackIndex = 0
dataHashCode = 620415738
size = 508
isKeyFrame = true
presentationTimeUs = 7020
sample:
trackIndex = 0
dataHashCode = 33931768
size = 504
isKeyFrame = true
presentationTimeUs = 28354
sample:
trackIndex = 0
dataHashCode = 800699278
size = 508
isKeyFrame = true
presentationTimeUs = 49687
sample:
trackIndex = 0
dataHashCode = 584185366
size = 519
isKeyFrame = true
presentationTimeUs = 71020
sample:
trackIndex = 0
dataHashCode = 1490843354
size = 528
isKeyFrame = true
presentationTimeUs = 92354
sample:
trackIndex = 0
dataHashCode = -720335181
size = 511
isKeyFrame = true
presentationTimeUs = 113687
sample:
trackIndex = 0
dataHashCode = 197135781
size = 523
isKeyFrame = true
presentationTimeUs = 135020
sample:
trackIndex = 0
dataHashCode = 294457020
size = 511
isKeyFrame = true
presentationTimeUs = 156354
sample:
trackIndex = 0
dataHashCode = 194307558
size = 503
isKeyFrame = true
presentationTimeUs = 177687
sample:
trackIndex = 0
dataHashCode = 1687202651
size = 507
isKeyFrame = true
presentationTimeUs = 199020
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 485634444 dataHashCode = 485634444
size = 2833 size = 2833
...@@ -154,6 +208,66 @@ sample: ...@@ -154,6 +208,66 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 316666 presentationTimeUs = 316666
sample: sample:
trackIndex = 0
dataHashCode = -1695580898
size = 517
isKeyFrame = true
presentationTimeUs = 220354
sample:
trackIndex = 0
dataHashCode = -1416688734
size = 510
isKeyFrame = true
presentationTimeUs = 241687
sample:
trackIndex = 0
dataHashCode = -239330254
size = 511
isKeyFrame = true
presentationTimeUs = 263020
sample:
trackIndex = 0
dataHashCode = 1449437418
size = 509
isKeyFrame = true
presentationTimeUs = 284354
sample:
trackIndex = 0
dataHashCode = -1480882788
size = 508
isKeyFrame = true
presentationTimeUs = 305687
sample:
trackIndex = 0
dataHashCode = -1628064098
size = 511
isKeyFrame = true
presentationTimeUs = 327020
sample:
trackIndex = 0
dataHashCode = 1717254647
size = 514
isKeyFrame = true
presentationTimeUs = 348354
sample:
trackIndex = 0
dataHashCode = -1317174771
size = 503
isKeyFrame = true
presentationTimeUs = 369687
sample:
trackIndex = 0
dataHashCode = 1001148219
size = 510
isKeyFrame = true
presentationTimeUs = 391020
sample:
trackIndex = 0
dataHashCode = 1259307086
size = 511
isKeyFrame = true
presentationTimeUs = 412354
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = -1686938678 dataHashCode = -1686938678
size = 2524 size = 2524
...@@ -214,185 +328,95 @@ sample: ...@@ -214,185 +328,95 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 483333 presentationTimeUs = 483333
sample: sample:
trackIndex = 1
dataHashCode = 1576638059
size = 2088
isKeyFrame = false
presentationTimeUs = 500000
sample:
trackIndex = 0
dataHashCode = 33931768
size = 504
isKeyFrame = true
presentationTimeUs = 28354
sample:
trackIndex = 1
dataHashCode = 1120133924
size = 151
isKeyFrame = false
presentationTimeUs = 516666
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 800699278 dataHashCode = -27251144
size = 508 size = 507
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 49687 presentationTimeUs = 433687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 584185366 dataHashCode = -129676969
size = 519 size = 509
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 71020 presentationTimeUs = 455020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1490843354 dataHashCode = 1228056327
size = 528 size = 523
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 92354 presentationTimeUs = 476354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -720335181 dataHashCode = -1301514722
size = 511 size = 501
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 113687 presentationTimeUs = 497687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 197135781 dataHashCode = 204329022
size = 523 size = 514
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 135020 presentationTimeUs = 519020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 294457020 dataHashCode = 204379389
size = 511 size = 504
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 156354 presentationTimeUs = 540354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 194307558 dataHashCode = 694913274
size = 503 size = 508
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 177687 presentationTimeUs = 561687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1687202651 dataHashCode = 289018778
size = 507 size = 513
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 199020 presentationTimeUs = 583020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1695580898 dataHashCode = -693167785
size = 517 size = 517
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 220354 presentationTimeUs = 604354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1416688734 dataHashCode = 253824480
size = 510 size = 510
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 241687 presentationTimeUs = 625687
sample:
trackIndex = 0
dataHashCode = -239330254
size = 511
isKeyFrame = true
presentationTimeUs = 263020
sample: sample:
trackIndex = 0 trackIndex = 1
dataHashCode = 1449437418 dataHashCode = 1576638059
size = 509 size = 2088
isKeyFrame = true isKeyFrame = false
presentationTimeUs = 284354 presentationTimeUs = 500000
sample: sample:
trackIndex = 0 trackIndex = 1
dataHashCode = -1480882788 dataHashCode = 1120133924
size = 508 size = 151
isKeyFrame = true isKeyFrame = false
presentationTimeUs = 305687 presentationTimeUs = 516666
sample: sample:
trackIndex = 0 trackIndex = 1
dataHashCode = -1628064098 dataHashCode = 264118578
size = 511 size = 2235
isKeyFrame = true isKeyFrame = false
presentationTimeUs = 327020 presentationTimeUs = 533333
sample: sample:
trackIndex = 0 trackIndex = 1
dataHashCode = 1717254647 dataHashCode = 64254117
size = 514 size = 164
isKeyFrame = true isKeyFrame = false
presentationTimeUs = 348354 presentationTimeUs = 550000
sample: sample:
trackIndex = 0 trackIndex = 1
dataHashCode = -1317174771 dataHashCode = -1000078879
size = 503 size = 2231
isKeyFrame = true isKeyFrame = false
presentationTimeUs = 369687 presentationTimeUs = 566666
sample:
trackIndex = 0
dataHashCode = 1001148219
size = 510
isKeyFrame = true
presentationTimeUs = 391020
sample:
trackIndex = 0
dataHashCode = 1259307086
size = 511
isKeyFrame = true
presentationTimeUs = 412354
sample:
trackIndex = 0
dataHashCode = -27251144
size = 507
isKeyFrame = true
presentationTimeUs = 433687
sample:
trackIndex = 0
dataHashCode = -129676969
size = 509
isKeyFrame = true
presentationTimeUs = 455020
sample:
trackIndex = 0
dataHashCode = 1228056327
size = 523
isKeyFrame = true
presentationTimeUs = 476354
sample:
trackIndex = 0
dataHashCode = -1301514722
size = 501
isKeyFrame = true
presentationTimeUs = 497687
sample:
trackIndex = 0
dataHashCode = 204329022
size = 514
isKeyFrame = true
presentationTimeUs = 519020
sample:
trackIndex = 1
dataHashCode = 264118578
size = 2235
isKeyFrame = false
presentationTimeUs = 533333
sample:
trackIndex = 0
dataHashCode = 204379389
size = 504
isKeyFrame = true
presentationTimeUs = 540354
sample:
trackIndex = 1
dataHashCode = 64254117
size = 164
isKeyFrame = false
presentationTimeUs = 550000
sample:
trackIndex = 1
dataHashCode = -1000078879
size = 2231
isKeyFrame = false
presentationTimeUs = 566666
sample: sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 286919946 dataHashCode = 286919946
...@@ -424,6 +448,66 @@ sample: ...@@ -424,6 +448,66 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 650000 presentationTimeUs = 650000
sample: sample:
trackIndex = 0
dataHashCode = -142385998
size = 516
isKeyFrame = true
presentationTimeUs = 647020
sample:
trackIndex = 0
dataHashCode = 917740295
size = 506
isKeyFrame = true
presentationTimeUs = 668354
sample:
trackIndex = 0
dataHashCode = -1795733204
size = 504
isKeyFrame = true
presentationTimeUs = 689687
sample:
trackIndex = 0
dataHashCode = 1282735099
size = 518
isKeyFrame = true
presentationTimeUs = 711020
sample:
trackIndex = 0
dataHashCode = -834522889
size = 512
isKeyFrame = true
presentationTimeUs = 732354
sample:
trackIndex = 0
dataHashCode = -1590936932
size = 506
isKeyFrame = true
presentationTimeUs = 753687
sample:
trackIndex = 0
dataHashCode = -697315454
size = 529
isKeyFrame = true
presentationTimeUs = 775020
sample:
trackIndex = 0
dataHashCode = -1563590541
size = 514
isKeyFrame = true
presentationTimeUs = 796354
sample:
trackIndex = 0
dataHashCode = -674722870
size = 509
isKeyFrame = true
presentationTimeUs = 817687
sample:
trackIndex = 0
dataHashCode = -272827525
size = 510
isKeyFrame = true
presentationTimeUs = 839020
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 979033489 dataHashCode = 979033489
size = 1924 size = 1924
...@@ -484,6 +568,66 @@ sample: ...@@ -484,6 +568,66 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 816666 presentationTimeUs = 816666
sample: sample:
trackIndex = 0
dataHashCode = 903683051
size = 524
isKeyFrame = true
presentationTimeUs = 860354
sample:
trackIndex = 0
dataHashCode = 57039157
size = 509
isKeyFrame = true
presentationTimeUs = 881687
sample:
trackIndex = 0
dataHashCode = 674330068
size = 514
isKeyFrame = true
presentationTimeUs = 903020
sample:
trackIndex = 0
dataHashCode = -1896569421
size = 514
isKeyFrame = true
presentationTimeUs = 924354
sample:
trackIndex = 0
dataHashCode = -837719592
size = 502
isKeyFrame = true
presentationTimeUs = 945687
sample:
trackIndex = 0
dataHashCode = 1269429850
size = 507
isKeyFrame = true
presentationTimeUs = 967020
sample:
trackIndex = 0
dataHashCode = -884799857
size = 497
isKeyFrame = true
presentationTimeUs = 988354
sample:
trackIndex = 0
dataHashCode = -1865947937
size = 512
isKeyFrame = true
presentationTimeUs = 1009687
sample:
trackIndex = 0
dataHashCode = 1197648682
size = 500
isKeyFrame = true
presentationTimeUs = 1031020
sample:
trackIndex = 0
dataHashCode = -320096195
size = 509
isKeyFrame = true
presentationTimeUs = 1052354
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 299686318 dataHashCode = 299686318
size = 2066 size = 2066
...@@ -544,173 +688,89 @@ sample: ...@@ -544,173 +688,89 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 983333 presentationTimeUs = 983333
sample: sample:
trackIndex = 1
dataHashCode = 1131230500
size = 2327
isKeyFrame = false
presentationTimeUs = 1000000
sample:
trackIndex = 1
dataHashCode = -393815961
size = 160
isKeyFrame = false
presentationTimeUs = 1016666
sample:
trackIndex = 1
dataHashCode = -242739025
size = 2136
isKeyFrame = false
presentationTimeUs = 1033333
sample:
trackIndex = 0
dataHashCode = 694913274
size = 508
isKeyFrame = true
presentationTimeUs = 561687
sample:
trackIndex = 1
dataHashCode = 65238903
size = 163
isKeyFrame = false
presentationTimeUs = 1050000
sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 289018778 dataHashCode = -744850549
size = 513 size = 511
isKeyFrame = true
presentationTimeUs = 583020
sample:
trackIndex = 0
dataHashCode = -693167785
size = 517
isKeyFrame = true
presentationTimeUs = 604354
sample:
trackIndex = 0
dataHashCode = 253824480
size = 510
isKeyFrame = true
presentationTimeUs = 625687
sample:
trackIndex = 0
dataHashCode = -142385998
size = 516
isKeyFrame = true
presentationTimeUs = 647020
sample:
trackIndex = 0
dataHashCode = 917740295
size = 506
isKeyFrame = true
presentationTimeUs = 668354
sample:
trackIndex = 0
dataHashCode = -1795733204
size = 504
isKeyFrame = true
presentationTimeUs = 689687
sample:
trackIndex = 0
dataHashCode = 1282735099
size = 518
isKeyFrame = true
presentationTimeUs = 711020
sample:
trackIndex = 0
dataHashCode = -834522889
size = 512
isKeyFrame = true
presentationTimeUs = 732354
sample:
trackIndex = 0
dataHashCode = -1590936932
size = 506
isKeyFrame = true
presentationTimeUs = 753687
sample:
trackIndex = 0
dataHashCode = -697315454
size = 529
isKeyFrame = true
presentationTimeUs = 775020
sample:
trackIndex = 0
dataHashCode = -1563590541
size = 514
isKeyFrame = true
presentationTimeUs = 796354
sample:
trackIndex = 0
dataHashCode = -674722870
size = 509
isKeyFrame = true
presentationTimeUs = 817687
sample:
trackIndex = 0
dataHashCode = -272827525
size = 510
isKeyFrame = true
presentationTimeUs = 839020
sample:
trackIndex = 0
dataHashCode = 903683051
size = 524
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 860354 presentationTimeUs = 1073687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 57039157 dataHashCode = 1457899387
size = 509 size = 505
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 881687 presentationTimeUs = 1095020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 674330068 dataHashCode = 168118808
size = 514 size = 519
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 903020 presentationTimeUs = 1116354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1896569421 dataHashCode = 896298799
size = 514 size = 506
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 924354 presentationTimeUs = 1137687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -837719592 dataHashCode = -1766408057
size = 502 size = 513
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 945687 presentationTimeUs = 1159020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1269429850 dataHashCode = 988509435
size = 507 size = 517
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 967020 presentationTimeUs = 1180354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -884799857 dataHashCode = 1031000863
size = 497 size = 529
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 988354 presentationTimeUs = 1201687
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -1865947937 dataHashCode = 63390943
size = 512 size = 517
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 1009687 presentationTimeUs = 1223020
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = 1197648682 dataHashCode = -747883422
size = 500 size = 517
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 1031020 presentationTimeUs = 1244354
sample: sample:
trackIndex = 0 trackIndex = 0
dataHashCode = -320096195 dataHashCode = -1574660470
size = 509 size = 526
isKeyFrame = true isKeyFrame = true
presentationTimeUs = 1052354 presentationTimeUs = 1265687
sample:
trackIndex = 1
dataHashCode = 1131230500
size = 2327
isKeyFrame = false
presentationTimeUs = 1000000
sample:
trackIndex = 1
dataHashCode = -393815961
size = 160
isKeyFrame = false
presentationTimeUs = 1016666
sample:
trackIndex = 1
dataHashCode = -242739025
size = 2136
isKeyFrame = false
presentationTimeUs = 1033333
sample:
trackIndex = 1
dataHashCode = 65238903
size = 163
isKeyFrame = false
presentationTimeUs = 1050000
sample: sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 1720840922 dataHashCode = 1720840922
...@@ -718,12 +778,6 @@ sample: ...@@ -718,12 +778,6 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 1066666 presentationTimeUs = 1066666
sample: sample:
trackIndex = 0
dataHashCode = -744850549
size = 511
isKeyFrame = true
presentationTimeUs = 1073687
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = -1006231050 dataHashCode = -1006231050
size = 178 size = 178
...@@ -754,6 +808,66 @@ sample: ...@@ -754,6 +808,66 @@ sample:
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 1150000 presentationTimeUs = 1150000
sample: sample:
trackIndex = 0
dataHashCode = 1371653176
size = 515
isKeyFrame = true
presentationTimeUs = 1287020
sample:
trackIndex = 0
dataHashCode = -873513581
size = 503
isKeyFrame = true
presentationTimeUs = 1308354
sample:
trackIndex = 0
dataHashCode = -1886763688
size = 514
isKeyFrame = true
presentationTimeUs = 1329687
sample:
trackIndex = 0
dataHashCode = 1308763541
size = 512
isKeyFrame = true
presentationTimeUs = 1351020
sample:
trackIndex = 0
dataHashCode = 490619935
size = 505
isKeyFrame = true
presentationTimeUs = 1372354
sample:
trackIndex = 0
dataHashCode = -671375789
size = 512
isKeyFrame = true
presentationTimeUs = 1393687
sample:
trackIndex = 0
dataHashCode = -1950105780
size = 521
isKeyFrame = true
presentationTimeUs = 1415020
sample:
trackIndex = 0
dataHashCode = -1430221498
size = 533
isKeyFrame = true
presentationTimeUs = 1436354
sample:
trackIndex = 0
dataHashCode = 529950036
size = 505
isKeyFrame = true
presentationTimeUs = 1457687
sample:
trackIndex = 0
dataHashCode = 1705899587
size = 497
isKeyFrame = true
presentationTimeUs = 1479020
sample:
trackIndex = 1 trackIndex = 1
dataHashCode = 825501977 dataHashCode = 825501977
size = 1816 size = 1816
...@@ -873,118 +987,4 @@ sample: ...@@ -873,118 +987,4 @@ sample:
size = 119 size = 119
isKeyFrame = false isKeyFrame = false
presentationTimeUs = 1483333 presentationTimeUs = 1483333
sample:
trackIndex = 0
dataHashCode = 1457899387
size = 505
isKeyFrame = true
presentationTimeUs = 1095020
sample:
trackIndex = 0
dataHashCode = 168118808
size = 519
isKeyFrame = true
presentationTimeUs = 1116354
sample:
trackIndex = 0
dataHashCode = 896298799
size = 506
isKeyFrame = true
presentationTimeUs = 1137687
sample:
trackIndex = 0
dataHashCode = -1766408057
size = 513
isKeyFrame = true
presentationTimeUs = 1159020
sample:
trackIndex = 0
dataHashCode = 988509435
size = 517
isKeyFrame = true
presentationTimeUs = 1180354
sample:
trackIndex = 0
dataHashCode = 1031000863
size = 529
isKeyFrame = true
presentationTimeUs = 1201687
sample:
trackIndex = 0
dataHashCode = 63390943
size = 517
isKeyFrame = true
presentationTimeUs = 1223020
sample:
trackIndex = 0
dataHashCode = -747883422
size = 517
isKeyFrame = true
presentationTimeUs = 1244354
sample:
trackIndex = 0
dataHashCode = -1574660470
size = 526
isKeyFrame = true
presentationTimeUs = 1265687
sample:
trackIndex = 0
dataHashCode = 1371653176
size = 515
isKeyFrame = true
presentationTimeUs = 1287020
sample:
trackIndex = 0
dataHashCode = -873513581
size = 503
isKeyFrame = true
presentationTimeUs = 1308354
sample:
trackIndex = 0
dataHashCode = -1886763688
size = 514
isKeyFrame = true
presentationTimeUs = 1329687
sample:
trackIndex = 0
dataHashCode = 1308763541
size = 512
isKeyFrame = true
presentationTimeUs = 1351020
sample:
trackIndex = 0
dataHashCode = 490619935
size = 505
isKeyFrame = true
presentationTimeUs = 1372354
sample:
trackIndex = 0
dataHashCode = -671375789
size = 512
isKeyFrame = true
presentationTimeUs = 1393687
sample:
trackIndex = 0
dataHashCode = -1950105780
size = 521
isKeyFrame = true
presentationTimeUs = 1415020
sample:
trackIndex = 0
dataHashCode = -1430221498
size = 533
isKeyFrame = true
presentationTimeUs = 1436354
sample:
trackIndex = 0
dataHashCode = 529950036
size = 505
isKeyFrame = true
presentationTimeUs = 1457687
sample:
trackIndex = 0
dataHashCode = 1705899587
size = 497
isKeyFrame = true
presentationTimeUs = 1479020
released = true released = true
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