PiperOrigin-RevId: 629382753
This commit is contained in:
sheenachhabra 2024-04-30 05:39:15 -07:00 committed by Copybara-Service
parent 28655d27a7
commit bc77cef403
18 changed files with 367 additions and 1403 deletions

View File

@ -45,23 +45,13 @@ import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class) @RunWith(Parameterized.class)
public class Mp4MuxerEndToEndAndroidTest { public class Mp4MuxerEndToEndAndroidTest {
private static final String H264_MP4 = "sample_no_bframes.mp4"; private static final String H264_MP4 = "sample_no_bframes.mp4";
private static final String H264_WITH_NON_REFERENCE_B_FRAMES_MP4 =
"bbb_800x640_768kbps_30fps_avc_non_reference_3b.mp4";
private static final String H264_WITH_PYRAMID_B_FRAMES_MP4 =
"bbb_800x640_768kbps_30fps_avc_pyramid_3b.mp4";
private static final String H265_HDR10_MP4 = "hdr10-720p.mp4"; private static final String H265_HDR10_MP4 = "hdr10-720p.mp4";
private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4"; private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4";
private static final String AV1_MP4 = "sample_av1.mp4"; private static final String AV1_MP4 = "sample_av1.mp4";
@Parameters(name = "{0}") @Parameters(name = "{0}")
public static ImmutableList<String> mediaSamples() { public static ImmutableList<String> mediaSamples() {
return ImmutableList.of( return ImmutableList.of(H264_MP4, H265_HDR10_MP4, H265_WITH_METADATA_TRACK_MP4, AV1_MP4);
H264_MP4,
H264_WITH_NON_REFERENCE_B_FRAMES_MP4,
H264_WITH_PYRAMID_B_FRAMES_MP4,
H265_HDR10_MP4,
H265_WITH_METADATA_TRACK_MP4,
AV1_MP4);
} }
@Parameter public @MonotonicNonNull String inputFile; @Parameter public @MonotonicNonNull String inputFile;

View File

@ -637,14 +637,14 @@ import java.util.Locale;
} }
boolean hasBframe = false; boolean hasBframe = false;
long lastSampleCompositionTimeUs = 0L; long lastSamplePresentationTimeUs = 0L;
for (int sampleId = 0; sampleId < samplesInfo.size(); sampleId++) { for (int sampleId = 0; sampleId < samplesInfo.size(); sampleId++) {
long currentSampleCompositionTimeUs = samplesInfo.get(sampleId).presentationTimeUs; long currentSamplePresentationTimeUs = samplesInfo.get(sampleId).presentationTimeUs;
presentationTimestampsUs.add(currentSampleCompositionTimeUs); presentationTimestampsUs.add(currentSamplePresentationTimeUs);
if (currentSampleCompositionTimeUs < lastSampleCompositionTimeUs) { if (currentSamplePresentationTimeUs < lastSamplePresentationTimeUs) {
hasBframe = true; hasBframe = true;
} }
lastSampleCompositionTimeUs = currentSampleCompositionTimeUs; lastSamplePresentationTimeUs = currentSamplePresentationTimeUs;
} }
if (hasBframe) { if (hasBframe) {
@ -713,96 +713,6 @@ import java.util.Locale;
return BoxUtils.wrapIntoBox("stts", contents); return BoxUtils.wrapIntoBox("stts", contents);
} }
/** Returns the ctts (composition time to sample) box. */
public static ByteBuffer ctts(
List<BufferInfo> samplesInfo, List<Long> durationVu, int videoUnitTimescale) {
// Generate the sample composition offsets list to create ctts box.
List<Integer> compositionOffsets =
Boxes.calculateSampleCompositionTimeOffsets(samplesInfo, durationVu, videoUnitTimescale);
if (compositionOffsets.isEmpty()) {
return ByteBuffer.allocate(0);
}
ByteBuffer contents =
ByteBuffer.allocate(
2 * BYTES_PER_INTEGER + 2 * compositionOffsets.size() * BYTES_PER_INTEGER);
contents.putInt(1); // version and flags.
// We will know total entry count only after processing all the composition offsets, so put in a
// placeholder for total entry count and store its index.
int totalEntryCountIndex = contents.position();
contents.putInt(0x0); // entry_count.
int totalEntryCount = 0;
int lastCompositionOffset = -1;
int lastSampleCountIndex = -1;
for (int i = 0; i < compositionOffsets.size(); i++) {
int currentCompositionOffset = compositionOffsets.get(i);
if (lastCompositionOffset != currentCompositionOffset) {
lastCompositionOffset = currentCompositionOffset;
lastSampleCountIndex = contents.position();
// sample_count; this will be updated instead of adding a new entry if the next sample has
// the same composition offset.
contents.putInt(1); // sample_count
contents.putInt(currentCompositionOffset); // sample_offset
totalEntryCount++;
} else {
contents.putInt(lastSampleCountIndex, contents.getInt(lastSampleCountIndex) + 1);
}
}
contents.putInt(totalEntryCountIndex, totalEntryCount);
contents.flip();
return BoxUtils.wrapIntoBox("ctts", contents);
}
/**
* Calculate sample composition time offsets (in timebase units).
*
* <p>The sample composition time offset gives offset between composition time (CT) and decoding
* time (DT), such that {@code CT(n) = DT(n) + sample_offset(n)}.
*
* @param samplesInfo A list of {@linkplain BufferInfo sample info}.
* @param durationVu A list of all the sample durations.
* @param videoUnitTimescale The timescale of the track.
* @return A list of all the sample composition time offsets.
*/
private static List<Integer> calculateSampleCompositionTimeOffsets(
List<BufferInfo> samplesInfo, List<Long> durationVu, int videoUnitTimescale) {
List<Integer> compositionOffsets = new ArrayList<>(samplesInfo.size());
if (samplesInfo.isEmpty()) {
return compositionOffsets;
}
long currentSampleDecodeTime = 0L;
boolean hasBframe = false;
long lastSampleCompositionTimeUs = 0L;
for (int sampleId = 0; sampleId < samplesInfo.size(); sampleId++) {
long currentSampleCompositionTimeUs = samplesInfo.get(sampleId).presentationTimeUs;
long currentCompositionOffsetVu =
vuFromUs(currentSampleCompositionTimeUs, videoUnitTimescale) - currentSampleDecodeTime;
checkState(currentCompositionOffsetVu <= Integer.MAX_VALUE, "Only 32-bit offset is allowed");
currentSampleDecodeTime += durationVu.get(sampleId); // DT(n+1) = DT(n) + STTS(n)
compositionOffsets.add((int) currentCompositionOffsetVu);
if (currentSampleCompositionTimeUs < lastSampleCompositionTimeUs) {
hasBframe = true;
}
lastSampleCompositionTimeUs = currentSampleCompositionTimeUs;
}
if (!hasBframe) {
compositionOffsets.clear();
}
return compositionOffsets;
}
/** Returns the stsz (sample size) box. */ /** Returns the stsz (sample size) box. */
public static ByteBuffer stsz(List<MediaCodec.BufferInfo> writtenSamples) { public static ByteBuffer stsz(List<MediaCodec.BufferInfo> writtenSamples) {
ByteBuffer contents = ByteBuffer.allocate(writtenSamples.size() * 4 + MAX_FIXED_LEAF_BOX_SIZE); ByteBuffer contents = ByteBuffer.allocate(writtenSamples.size() * 4 + MAX_FIXED_LEAF_BOX_SIZE);

View File

@ -29,7 +29,6 @@ import static java.lang.Math.min;
import android.media.MediaCodec; import android.media.MediaCodec;
import android.media.MediaCodec.BufferInfo; import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
@ -74,7 +73,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private boolean headerCreated; private boolean headerCreated;
private long minInputPresentationTimeUs; private long minInputPresentationTimeUs;
private long maxTrackDurationUs; private long maxTrackDurationUs;
private long lastSamplePresentationTimeUs;
/** /**
* Creates an instance. * Creates an instance.
@ -102,7 +100,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
this.fragmentDurationUs = fragmentDurationMs * 1_000; this.fragmentDurationUs = fragmentDurationMs * 1_000;
minInputPresentationTimeUs = Long.MAX_VALUE; minInputPresentationTimeUs = Long.MAX_VALUE;
currentFragmentSequenceNumber = 1; currentFragmentSequenceNumber = 1;
lastSamplePresentationTimeUs = C.TIME_UNSET;
} }
public TrackToken addTrack(int sortKey, Format format) { public TrackToken addTrack(int sortKey, Format format) {
@ -118,9 +115,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
TrackToken token, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) TrackToken token, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
throws IOException { throws IOException {
checkArgument(token instanceof Track); checkArgument(token instanceof Track);
checkArgument(
bufferInfo.presentationTimeUs > lastSamplePresentationTimeUs,
"Out of order B-frames are not supported");
if (!headerCreated) { if (!headerCreated) {
createHeader(); createHeader();
headerCreated = true; headerCreated = true;
@ -130,7 +124,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
createFragment(); createFragment();
} }
track.writeSampleData(byteBuffer, bufferInfo); track.writeSampleData(byteBuffer, bufferInfo);
lastSamplePresentationTimeUs = bufferInfo.presentationTimeUs;
BufferInfo firstPendingSample = checkNotNull(track.pendingSamplesBufferInfo.peekFirst()); BufferInfo firstPendingSample = checkNotNull(track.pendingSamplesBufferInfo.peekFirst());
BufferInfo lastPendingSample = checkNotNull(track.pendingSamplesBufferInfo.peekLast()); BufferInfo lastPendingSample = checkNotNull(track.pendingSamplesBufferInfo.peekLast());
minInputPresentationTimeUs = minInputPresentationTimeUs =

View File

@ -95,10 +95,6 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
@C.TrackType int trackType = MimeTypes.getTrackType(format.sampleMimeType); @C.TrackType int trackType = MimeTypes.getTrackType(format.sampleMimeType);
ByteBuffer stts = Boxes.stts(sampleDurationsVu); ByteBuffer stts = Boxes.stts(sampleDurationsVu);
ByteBuffer ctts =
MimeTypes.isVideo(format.sampleMimeType)
? Boxes.ctts(track.writtenSamples(), sampleDurationsVu, track.videoUnitTimebase())
: ByteBuffer.allocate(0);
ByteBuffer stsz = Boxes.stsz(track.writtenSamples()); ByteBuffer stsz = Boxes.stsz(track.writtenSamples());
ByteBuffer stsc = Boxes.stsc(track.writtenChunkSampleCounts()); ByteBuffer stsc = Boxes.stsc(track.writtenChunkSampleCounts());
ByteBuffer chunkOffsetBox = ByteBuffer chunkOffsetBox =
@ -122,13 +118,7 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
stsdBox = Boxes.stsd(sampleEntryBox); stsdBox = Boxes.stsd(sampleEntryBox);
stblBox = stblBox =
Boxes.stbl( Boxes.stbl(
stsdBox, stsdBox, stts, stsz, stsc, chunkOffsetBox, Boxes.stss(track.writtenSamples()));
stts,
ctts,
stsz,
stsc,
chunkOffsetBox,
Boxes.stss(track.writtenSamples()));
break; break;
case C.TRACK_TYPE_AUDIO: case C.TRACK_TYPE_AUDIO:
handlerType = "soun"; handlerType = "soun";

View File

@ -214,6 +214,8 @@ public final class Mp4Muxer implements Muxer {
* modified after calling this method. Otherwise, they are copied and it is safe to modify them * modified after calling this method. Otherwise, they are copied and it is safe to modify them
* after this method returns. * after this method returns.
* *
* <p>Note: Out of order B-frames are currently not supported.
*
* @param trackToken The {@link TrackToken} for which this sample is being written. * @param trackToken The {@link TrackToken} for which this sample is being written.
* @param byteBuffer The encoded sample. The muxer takes ownership of the buffer if {@link * @param byteBuffer The encoded sample. The muxer takes ownership of the buffer if {@link
* Builder#setSampleCopyEnabled(boolean) sample copying} is disabled. Otherwise, the position * Builder#setSampleCopyEnabled(boolean) sample copying} is disabled. Otherwise, the position

View File

@ -15,8 +15,11 @@
*/ */
package androidx.media3.muxer; package androidx.media3.muxer;
import static androidx.media3.common.util.Assertions.checkArgument;
import android.media.MediaCodec; import android.media.MediaCodec;
import android.media.MediaCodec.BufferInfo; import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.muxer.Muxer.TrackToken; import androidx.media3.muxer.Muxer.TrackToken;
@ -39,6 +42,7 @@ import java.util.List;
public boolean hadKeyframe; public boolean hadKeyframe;
private final boolean sampleCopyEnabled; private final boolean sampleCopyEnabled;
private long lastSamplePresentationTimeUs;
/** Creates an instance with {@code sortKey} set to 1. */ /** Creates an instance with {@code sortKey} set to 1. */
public Track(Format format, boolean sampleCopyEnabled) { public Track(Format format, boolean sampleCopyEnabled) {
@ -61,9 +65,13 @@ import java.util.List;
writtenChunkSampleCounts = new ArrayList<>(); writtenChunkSampleCounts = new ArrayList<>();
pendingSamplesBufferInfo = new ArrayDeque<>(); pendingSamplesBufferInfo = new ArrayDeque<>();
pendingSamplesByteBuffer = new ArrayDeque<>(); pendingSamplesByteBuffer = new ArrayDeque<>();
lastSamplePresentationTimeUs = C.TIME_UNSET;
} }
public void writeSampleData(ByteBuffer byteBuffer, BufferInfo bufferInfo) { public void writeSampleData(ByteBuffer byteBuffer, BufferInfo bufferInfo) {
checkArgument(
bufferInfo.presentationTimeUs > lastSamplePresentationTimeUs,
"Out of order B-frames are not supported");
// TODO: b/279931840 - Confirm whether muxer should throw when writing empty samples. // TODO: b/279931840 - Confirm whether muxer should throw when writing empty samples.
// Skip empty samples. // Skip empty samples.
if (bufferInfo.size == 0 || byteBuffer.remaining() == 0) { if (bufferInfo.size == 0 || byteBuffer.remaining() == 0) {
@ -98,6 +106,7 @@ import java.util.List;
pendingSamplesBufferInfo.addLast(bufferInfoToAdd); pendingSamplesBufferInfo.addLast(bufferInfoToAdd);
pendingSamplesByteBuffer.addLast(byteBufferToAdd); pendingSamplesByteBuffer.addLast(byteBufferToAdd);
lastSamplePresentationTimeUs = bufferInfoToAdd.presentationTimeUs;
} }
@Override @Override

View File

@ -517,60 +517,6 @@ public class BoxesTest {
MuxerTestUtil.getExpectedDumpFilePath("stts_box_few_same_sample_durations")); MuxerTestUtil.getExpectedDumpFilePath("stts_box_few_same_sample_durations"));
} }
@Test
public void createCttsBox_withSingleSampleTimestamp_returnsEmptyBox() {
List<MediaCodec.BufferInfo> sampleBufferInfos =
createBufferInfoListWithSamplePresentationTimestamps(400);
List<Long> durationsVu =
Boxes.convertPresentationTimestampsToDurationsVu(
sampleBufferInfos,
/* firstSamplePresentationTimeUs= */ 0L,
VU_TIMEBASE,
LAST_FRAME_DURATION_BEHAVIOR_INSERT_SHORT_FRAME);
ByteBuffer cttsBox = Boxes.ctts(sampleBufferInfos, durationsVu, VU_TIMEBASE);
// Create empty box in case of 1 sample.
assertThat(cttsBox.hasRemaining()).isFalse();
}
@Test
public void createCttsBox_withNoBframesSampleTimestamps_returnsEmptyBox() throws IOException {
List<MediaCodec.BufferInfo> sampleBufferInfos =
createBufferInfoListWithSamplePresentationTimestamps(0L, 1000L, 2000L);
List<Long> durationsVu =
Boxes.convertPresentationTimestampsToDurationsVu(
sampleBufferInfos,
/* firstSamplePresentationTimeUs= */ 0L,
VU_TIMEBASE,
LAST_FRAME_DURATION_BEHAVIOR_INSERT_SHORT_FRAME);
ByteBuffer cttsBox = Boxes.ctts(sampleBufferInfos, durationsVu, VU_TIMEBASE);
// Create empty ctts box in case samples does not contain B-frames.
assertThat(cttsBox.hasRemaining()).isFalse();
}
@Test
public void createCttsBox_withBFramesSampleTimestamps_matchesExpected() throws IOException {
List<MediaCodec.BufferInfo> sampleBufferInfos =
createBufferInfoListWithSamplePresentationTimestamps(
0, 400, 200, 100, 300, 800, 600, 500, 700);
List<Long> durationsVu =
Boxes.convertPresentationTimestampsToDurationsVu(
sampleBufferInfos,
/* firstSamplePresentationTimeUs= */ 0L,
VU_TIMEBASE,
LAST_FRAME_DURATION_BEHAVIOR_INSERT_SHORT_FRAME);
ByteBuffer cttsBox = Boxes.ctts(sampleBufferInfos, durationsVu, VU_TIMEBASE);
DumpableMp4Box dumpableBox = new DumpableMp4Box(cttsBox);
DumpFileAsserts.assertOutput(
context, dumpableBox, MuxerTestUtil.getExpectedDumpFilePath("ctts_box"));
}
@Test @Test
public void createStszBox_matchesExpected() throws IOException { public void createStszBox_matchesExpected() throws IOException {
List<MediaCodec.BufferInfo> sampleBufferInfos = List<MediaCodec.BufferInfo> sampleBufferInfos =

View File

@ -19,6 +19,7 @@ import static androidx.media3.muxer.MuxerTestUtil.FAKE_VIDEO_FORMAT;
import static androidx.media3.muxer.MuxerTestUtil.XMP_SAMPLE_DATA; import static androidx.media3.muxer.MuxerTestUtil.XMP_SAMPLE_DATA;
import static androidx.media3.muxer.MuxerTestUtil.getFakeSampleAndSampleInfo; import static androidx.media3.muxer.MuxerTestUtil.getFakeSampleAndSampleInfo;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.content.Context; import android.content.Context;
import android.media.MediaCodec.BufferInfo; import android.media.MediaCodec.BufferInfo;
@ -30,7 +31,6 @@ import androidx.media3.container.Mp4OrientationData;
import androidx.media3.container.Mp4TimestampData; import androidx.media3.container.Mp4TimestampData;
import androidx.media3.container.XmpData; import androidx.media3.container.XmpData;
import androidx.media3.extractor.mp4.Mp4Extractor; import androidx.media3.extractor.mp4.Mp4Extractor;
import androidx.media3.extractor.text.DefaultSubtitleParserFactory;
import androidx.media3.muxer.Muxer.TrackToken; import androidx.media3.muxer.Muxer.TrackToken;
import androidx.media3.test.utils.DumpFileAsserts; import androidx.media3.test.utils.DumpFileAsserts;
import androidx.media3.test.utils.DumpableMp4Box; import androidx.media3.test.utils.DumpableMp4Box;
@ -157,38 +157,26 @@ public class Mp4MuxerEndToEndTest {
} }
@Test @Test
public void createMp4File_withOutOfOrderBframes_matchesExpected() throws IOException { public void writeSampleData_withOutOfOrderSampleTimestamps_throws() throws IOException {
String outputFilePath = temporaryFolder.newFile().getPath(); String outputFilePath = temporaryFolder.newFile().getPath();
Mp4Muxer mp4Muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); Mp4Muxer mp4Muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build();
mp4Muxer.addMetadata(
new Mp4TimestampData(
/* creationTimestampSeconds= */ 100_000_000L,
/* modificationTimestampSeconds= */ 500_000_000L));
Pair<ByteBuffer, BufferInfo> track1Sample1 = Pair<ByteBuffer, BufferInfo> track1Sample1 =
getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 0L); getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 0L);
Pair<ByteBuffer, BufferInfo> track1Sample2 = Pair<ByteBuffer, BufferInfo> track1Sample2 =
getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 3000L); getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 2000L);
Pair<ByteBuffer, BufferInfo> track1Sample3 = Pair<ByteBuffer, BufferInfo> track1Sample3 =
getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 1000L); getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 1000L);
Pair<ByteBuffer, BufferInfo> track1Sample4 =
getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 2000L);
try { try {
TrackToken track1 = mp4Muxer.addTrack(/* sortKey= */ 0, FAKE_VIDEO_FORMAT); TrackToken track1 = mp4Muxer.addTrack(/* sortKey= */ 0, FAKE_VIDEO_FORMAT);
mp4Muxer.writeSampleData(track1, track1Sample1.first, track1Sample1.second); mp4Muxer.writeSampleData(track1, track1Sample1.first, track1Sample1.second);
mp4Muxer.writeSampleData(track1, track1Sample2.first, track1Sample2.second); mp4Muxer.writeSampleData(track1, track1Sample2.first, track1Sample2.second);
mp4Muxer.writeSampleData(track1, track1Sample3.first, track1Sample3.second);
mp4Muxer.writeSampleData(track1, track1Sample4.first, track1Sample4.second); assertThrows(
IllegalArgumentException.class,
() -> mp4Muxer.writeSampleData(track1, track1Sample3.first, track1Sample3.second));
} finally { } finally {
mp4Muxer.close(); mp4Muxer.close();
} }
FakeExtractorOutput fakeExtractorOutput =
TestUtil.extractAllSamplesFromFilePath(
new Mp4Extractor(new DefaultSubtitleParserFactory()), outputFilePath);
DumpFileAsserts.assertOutput(
context,
fakeExtractorOutput,
MuxerTestUtil.getExpectedDumpFilePath("mp4_with_b_frame.mp4"));
} }
@Test @Test

View File

@ -1,507 +0,0 @@
seekMap:
isSeekable = true
duration = 3966600
getPosition(0) = [[timeUs=0, position=44]]
getPosition(1) = [[timeUs=0, position=44], [timeUs=1000000, position=152546]]
getPosition(1983300) = [[timeUs=1000000, position=152546], [timeUs=2000000, position=238309]]
getPosition(3966600) = [[timeUs=3000000, position=353603]]
numberOfTracks = 1
track 0:
total output bytes = 416333
sample count = 120
format 0:
id = 1
sampleMimeType = video/avc
codecs = avc1.64001F
maxInputSize = 74696
width = 800
height = 640
frameRate = 30.25261
colorInfo:
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
initializationData:
data = length 33, hash 800C8D16
data = length 9, hash FBAE9B2D
sample 0:
time = 0
flags = 1
data = length 74666, hash D583C47C
sample 1:
time = 133322
flags = 0
data = length 3689, hash C17F9AAD
sample 2:
time = 33322
flags = 0
data = length 573, hash AE0E0278
sample 3:
time = 66655
flags = 0
data = length 1219, hash D94D73C6
sample 4:
time = 100000
flags = 0
data = length 1575, hash 84E86A1D
sample 5:
time = 266655
flags = 0
data = length 23470, hash F5757CD0
sample 6:
time = 166655
flags = 0
data = length 974, hash E45D44A4
sample 7:
time = 200000
flags = 0
data = length 129, hash 21B833C0
sample 8:
time = 233322
flags = 0
data = length 109, hash 1DBB1436
sample 9:
time = 400000
flags = 0
data = length 716, hash 75873FC1
sample 10:
time = 300000
flags = 0
data = length 226, hash 289041D3
sample 11:
time = 333322
flags = 0
data = length 237, hash 4C108F08
sample 12:
time = 366655
flags = 0
data = length 131, hash 8F6A446D
sample 13:
time = 533322
flags = 0
data = length 2303, hash 54F5847D
sample 14:
time = 433322
flags = 0
data = length 185, hash 5109747F
sample 15:
time = 466655
flags = 0
data = length 262, hash 24BD065A
sample 16:
time = 500000
flags = 0
data = length 421, hash F9F1FE52
sample 17:
time = 666655
flags = 0
data = length 4384, hash 62A87795
sample 18:
time = 566655
flags = 0
data = length 2370, hash F0A5ED86
sample 19:
time = 600000
flags = 0
data = length 2204, hash B7522E5E
sample 20:
time = 633322
flags = 0
data = length 1780, hash 4C8582ED
sample 21:
time = 800000
flags = 0
data = length 5879, hash FE4332DA
sample 22:
time = 700000
flags = 0
data = length 2204, hash 9AB285B2
sample 23:
time = 733322
flags = 0
data = length 2877, hash 139BF1F4
sample 24:
time = 766655
flags = 0
data = length 2982, hash E9ADDDFA
sample 25:
time = 933322
flags = 0
data = length 7925, hash 177E51B5
sample 26:
time = 833322
flags = 0
data = length 3139, hash 10486834
sample 27:
time = 866655
flags = 0
data = length 2843, hash 78AF658C
sample 28:
time = 900000
flags = 0
data = length 1252, hash 5933C8B8
sample 29:
time = 966655
flags = 0
data = length 1778, hash 4B8CF7CE
sample 30:
time = 1000000
flags = 1
data = length 29827, hash A8B8D740
sample 31:
time = 1133322
flags = 0
data = length 2572, hash 7D158CDD
sample 32:
time = 1033322
flags = 0
data = length 713, hash F3649370
sample 33:
time = 1066655
flags = 0
data = length 789, hash DFDC8672
sample 34:
time = 1100000
flags = 0
data = length 587, hash A095E207
sample 35:
time = 1266655
flags = 0
data = length 9906, hash A8997416
sample 36:
time = 1166655
flags = 0
data = length 703, hash 653E1AAF
sample 37:
time = 1200000
flags = 0
data = length 1925, hash AC147859
sample 38:
time = 1233322
flags = 0
data = length 1128, hash 39EB8BCE
sample 39:
time = 1400000
flags = 0
data = length 3082, hash E011B328
sample 40:
time = 1300000
flags = 0
data = length 775, hash 67AE4345
sample 41:
time = 1333322
flags = 0
data = length 702, hash AF1F22E6
sample 42:
time = 1366655
flags = 0
data = length 392, hash FE873AA
sample 43:
time = 1533322
flags = 0
data = length 3293, hash 7DA83640
sample 44:
time = 1433322
flags = 0
data = length 721, hash 896D4F13
sample 45:
time = 1466655
flags = 0
data = length 725, hash 95CBF946
sample 46:
time = 1500000
flags = 0
data = length 776, hash 5EB11334
sample 47:
time = 1666655
flags = 0
data = length 1956, hash 80B2B533
sample 48:
time = 1566655
flags = 0
data = length 592, hash 7C7832BF
sample 49:
time = 1600000
flags = 0
data = length 731, hash 92AA1FD2
sample 50:
time = 1633322
flags = 0
data = length 518, hash 18E84AFC
sample 51:
time = 1800000
flags = 0
data = length 5411, hash DF6B9A19
sample 52:
time = 1700000
flags = 0
data = length 565, hash A18215E
sample 53:
time = 1733322
flags = 0
data = length 916, hash 4F4089C8
sample 54:
time = 1766655
flags = 0
data = length 1651, hash 893D58B4
sample 55:
time = 1933322
flags = 0
data = length 5170, hash 3D0964F5
sample 56:
time = 1833322
flags = 0
data = length 1448, hash 3978CED5
sample 57:
time = 1866655
flags = 0
data = length 1797, hash BB343C33
sample 58:
time = 1900000
flags = 0
data = length 1650, hash BDB93BB
sample 59:
time = 1966655
flags = 0
data = length 4742, hash C905018E
sample 60:
time = 2000000
flags = 1
data = length 30426, hash 12B69F22
sample 61:
time = 2133322
flags = 0
data = length 7531, hash 1768FC1C
sample 62:
time = 2033322
flags = 0
data = length 2405, hash 82938115
sample 63:
time = 2066655
flags = 0
data = length 2377, hash 5677E8DB
sample 64:
time = 2100000
flags = 0
data = length 2135, hash B0F9E72D
sample 65:
time = 2266655
flags = 0
data = length 12031, hash 4F954746
sample 66:
time = 2166655
flags = 0
data = length 1790, hash 517CF8F5
sample 67:
time = 2200000
flags = 0
data = length 2014, hash CC430DAF
sample 68:
time = 2233322
flags = 0
data = length 1192, hash 343BF233
sample 69:
time = 2400000
flags = 0
data = length 5118, hash A4CA24FB
sample 70:
time = 2300000
flags = 0
data = length 1060, hash 4116AF37
sample 71:
time = 2333322
flags = 0
data = length 1345, hash E94F739C
sample 72:
time = 2366655
flags = 0
data = length 1558, hash 2FB36B5A
sample 73:
time = 2533322
flags = 0
data = length 8004, hash 79ACB806
sample 74:
time = 2433322
flags = 0
data = length 2858, hash EBE6B4A4
sample 75:
time = 2466655
flags = 0
data = length 4289, hash FEBF0899
sample 76:
time = 2500000
flags = 0
data = length 4678, hash 758EE78D
sample 77:
time = 2666655
flags = 0
data = length 6554, hash 6717D949
sample 78:
time = 2566655
flags = 0
data = length 2376, hash F768DB52
sample 79:
time = 2600000
flags = 0
data = length 1532, hash E205FE8A
sample 80:
time = 2633322
flags = 0
data = length 1366, hash 4202F62D
sample 81:
time = 2800000
flags = 0
data = length 3253, hash F406909B
sample 82:
time = 2700000
flags = 0
data = length 749, hash 68F6F14C
sample 83:
time = 2733322
flags = 0
data = length 946, hash 43364529
sample 84:
time = 2766655
flags = 0
data = length 593, hash 6E23A558
sample 85:
time = 2933322
flags = 0
data = length 2917, hash 1789092B
sample 86:
time = 2833322
flags = 0
data = length 644, hash 6C511C36
sample 87:
time = 2866655
flags = 0
data = length 719, hash 6E2C34E3
sample 88:
time = 2900000
flags = 0
data = length 594, hash F4C056C4
sample 89:
time = 2966655
flags = 0
data = length 2240, hash D24BA33
sample 90:
time = 3000000
flags = 1
data = length 33075, hash 16D07BC4
sample 91:
time = 3133322
flags = 0
data = length 3349, hash C1D93B2C
sample 92:
time = 3033322
flags = 0
data = length 863, hash EC21EA13
sample 93:
time = 3066655
flags = 0
data = length 807, hash C5533997
sample 94:
time = 3100000
flags = 0
data = length 430, hash 918D1401
sample 95:
time = 3266655
flags = 0
data = length 4883, hash 342581AD
sample 96:
time = 3166655
flags = 0
data = length 431, hash 84FF1E7C
sample 97:
time = 3200000
flags = 0
data = length 1272, hash C7833EE5
sample 98:
time = 3233322
flags = 0
data = length 821, hash 2F5B3EC3
sample 99:
time = 3400000
flags = 0
data = length 2214, hash 1F4632E2
sample 100:
time = 3300000
flags = 0
data = length 530, hash AF4AC2BE
sample 101:
time = 3333322
flags = 0
data = length 681, hash 557F3F5F
sample 102:
time = 3366655
flags = 0
data = length 447, hash 8A6157D2
sample 103:
time = 3533322
flags = 0
data = length 2523, hash 4D9C62B1
sample 104:
time = 3433322
flags = 0
data = length 559, hash 7E751737
sample 105:
time = 3466655
flags = 0
data = length 650, hash 66286CB2
sample 106:
time = 3500000
flags = 0
data = length 603, hash 9948D320
sample 107:
time = 3666655
flags = 0
data = length 1203, hash BEDA938F
sample 108:
time = 3566655
flags = 0
data = length 287, hash 97219C89
sample 109:
time = 3600000
flags = 0
data = length 401, hash 524D4D75
sample 110:
time = 3633322
flags = 0
data = length 403, hash C138F2A
sample 111:
time = 3800000
flags = 0
data = length 1328, hash F1B32991
sample 112:
time = 3700000
flags = 0
data = length 453, hash 1FCC9636
sample 113:
time = 3733322
flags = 0
data = length 422, hash 19573075
sample 114:
time = 3766655
flags = 0
data = length 322, hash 6752D2AB
sample 115:
time = 3933322
flags = 0
data = length 1128, hash 3B04FE26
sample 116:
time = 3833322
flags = 0
data = length 404, hash F0BF973E
sample 117:
time = 3866655
flags = 0
data = length 511, hash FB98417B
sample 118:
time = 3900000
flags = 0
data = length 458, hash 2440801E
sample 119:
time = 3966655
flags = 536870912
data = length 1316, hash 7DDE435E
tracksEnded = true

View File

@ -1,507 +0,0 @@
seekMap:
isSeekable = true
duration = 3966600
getPosition(0) = [[timeUs=0, position=44]]
getPosition(1) = [[timeUs=0, position=44], [timeUs=1000000, position=147439]]
getPosition(1983300) = [[timeUs=1000000, position=147439], [timeUs=2000000, position=231666]]
getPosition(3966600) = [[timeUs=3000000, position=343992]]
numberOfTracks = 1
track 0:
total output bytes = 406132
sample count = 120
format 0:
id = 1
sampleMimeType = video/avc
codecs = avc1.64001F
maxInputSize = 74696
width = 800
height = 640
frameRate = 30.25261
colorInfo:
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
initializationData:
data = length 33, hash A51E6AF9
data = length 9, hash FBAE9B2D
sample 0:
time = 0
flags = 1
data = length 74666, hash 9AF2BE5A
sample 1:
time = 133322
flags = 0
data = length 3689, hash 23BF8CA2
sample 2:
time = 66655
flags = 0
data = length 1319, hash 7E6541DB
sample 3:
time = 33322
flags = 0
data = length 466, hash ECD93C68
sample 4:
time = 100000
flags = 0
data = length 785, hash 3E824588
sample 5:
time = 266655
flags = 0
data = length 23472, hash 4A790E9B
sample 6:
time = 200000
flags = 0
data = length 169, hash B408CF0C
sample 7:
time = 166655
flags = 0
data = length 1008, hash 558016DF
sample 8:
time = 233322
flags = 0
data = length 60, hash A5220F0F
sample 9:
time = 400000
flags = 0
data = length 718, hash 56CA9233
sample 10:
time = 333322
flags = 0
data = length 277, hash F27B77B0
sample 11:
time = 300000
flags = 0
data = length 204, hash 451A7EF8
sample 12:
time = 366655
flags = 0
data = length 100, hash 72CCF451
sample 13:
time = 533322
flags = 0
data = length 2305, hash EE8EAD07
sample 14:
time = 466655
flags = 0
data = length 313, hash 23FD6C99
sample 15:
time = 433322
flags = 0
data = length 161, hash F9082751
sample 16:
time = 500000
flags = 0
data = length 512, hash F0317F7B
sample 17:
time = 666655
flags = 0
data = length 4386, hash 536E4530
sample 18:
time = 600000
flags = 0
data = length 2418, hash 3CA55886
sample 19:
time = 566655
flags = 0
data = length 818, hash CF732FE9
sample 20:
time = 633322
flags = 0
data = length 931, hash 9307BF9B
sample 21:
time = 800000
flags = 0
data = length 5881, hash 95D65FB
sample 22:
time = 733322
flags = 0
data = length 3241, hash C3722BD2
sample 23:
time = 700000
flags = 0
data = length 1957, hash 54FE72A0
sample 24:
time = 766655
flags = 0
data = length 943, hash 467A1DB1
sample 25:
time = 933322
flags = 0
data = length 7927, hash 20EB2632
sample 26:
time = 866655
flags = 0
data = length 3313, hash B854BF3E
sample 27:
time = 833322
flags = 0
data = length 2729, hash FC827FEE
sample 28:
time = 900000
flags = 0
data = length 847, hash 739EFD75
sample 29:
time = 966655
flags = 0
data = length 1780, hash 8C1AF0B1
sample 30:
time = 1000000
flags = 1
data = length 29827, hash B287A700
sample 31:
time = 1133322
flags = 0
data = length 2572, hash AB201EC8
sample 32:
time = 1066655
flags = 0
data = length 980, hash BD0ADFF1
sample 33:
time = 1033322
flags = 0
data = length 343, hash 645A3973
sample 34:
time = 1100000
flags = 0
data = length 476, hash 89BF903C
sample 35:
time = 1266655
flags = 0
data = length 9908, hash BDFEA8A4
sample 36:
time = 1200000
flags = 0
data = length 2422, hash 863FCD89
sample 37:
time = 1166655
flags = 0
data = length 718, hash E21DB793
sample 38:
time = 1233322
flags = 0
data = length 475, hash 6E2B14C6
sample 39:
time = 1400000
flags = 0
data = length 3084, hash 92862A1A
sample 40:
time = 1333322
flags = 0
data = length 825, hash 978654C8
sample 41:
time = 1300000
flags = 0
data = length 705, hash 28D04FCA
sample 42:
time = 1366655
flags = 0
data = length 335, hash D736EAC1
sample 43:
time = 1533322
flags = 0
data = length 3295, hash 2FCFA14A
sample 44:
time = 1466655
flags = 0
data = length 897, hash 6C76AFF1
sample 45:
time = 1433322
flags = 0
data = length 499, hash DDBE39E
sample 46:
time = 1500000
flags = 0
data = length 565, hash D269272C
sample 47:
time = 1666655
flags = 0
data = length 1958, hash 4A334D4E
sample 48:
time = 1600000
flags = 0
data = length 871, hash 21A0191A
sample 49:
time = 1566655
flags = 0
data = length 363, hash 376C3CBE
sample 50:
time = 1633322
flags = 0
data = length 398, hash BA958C19
sample 51:
time = 1800000
flags = 0
data = length 5413, hash 83EA9FBA
sample 52:
time = 1733322
flags = 0
data = length 1124, hash D7ADA732
sample 53:
time = 1700000
flags = 0
data = length 579, hash B6D6A34F
sample 54:
time = 1766655
flags = 0
data = length 1206, hash 1C5174A3
sample 55:
time = 1933322
flags = 0
data = length 5172, hash C4EBB198
sample 56:
time = 1866655
flags = 0
data = length 2045, hash 81261E50
sample 57:
time = 1833322
flags = 0
data = length 915, hash FFEDB29E
sample 58:
time = 1900000
flags = 0
data = length 1513, hash C03809BF
sample 59:
time = 1966655
flags = 0
data = length 4744, hash D0E55AF1
sample 60:
time = 2000000
flags = 1
data = length 30426, hash E5A29561
sample 61:
time = 2133322
flags = 0
data = length 7531, hash 756AE4D1
sample 62:
time = 2066655
flags = 0
data = length 2740, hash 669E4DF1
sample 63:
time = 2033322
flags = 0
data = length 1829, hash 66A7C400
sample 64:
time = 2100000
flags = 0
data = length 1423, hash DD6288B3
sample 65:
time = 2266655
flags = 0
data = length 12033, hash 244DD978
sample 66:
time = 2200000
flags = 0
data = length 2481, hash 9302A030
sample 67:
time = 2166655
flags = 0
data = length 1770, hash 86E54271
sample 68:
time = 2233322
flags = 0
data = length 636, hash B0BB7A9D
sample 69:
time = 2400000
flags = 0
data = length 5120, hash 8381F6ED
sample 70:
time = 2333322
flags = 0
data = length 1610, hash E9A0711D
sample 71:
time = 2300000
flags = 0
data = length 961, hash 494E3770
sample 72:
time = 2366655
flags = 0
data = length 1402, hash 3D40A6D1
sample 73:
time = 2533322
flags = 0
data = length 8006, hash A8C425BC
sample 74:
time = 2466655
flags = 0
data = length 4620, hash 18719317
sample 75:
time = 2433322
flags = 0
data = length 2507, hash 104771A0
sample 76:
time = 2500000
flags = 0
data = length 3970, hash B52DD9E
sample 77:
time = 2666655
flags = 0
data = length 6556, hash 173F0724
sample 78:
time = 2600000
flags = 0
data = length 1824, hash 8BB687AC
sample 79:
time = 2566655
flags = 0
data = length 1851, hash 29CD7E58
sample 80:
time = 2633322
flags = 0
data = length 731, hash 4E6BD69C
sample 81:
time = 2800000
flags = 0
data = length 3255, hash FCDDDFFC
sample 82:
time = 2733322
flags = 0
data = length 1118, hash 77E855CA
sample 83:
time = 2700000
flags = 0
data = length 413, hash E83C433F
sample 84:
time = 2766655
flags = 0
data = length 514, hash 9ED8EF4B
sample 85:
time = 2933322
flags = 0
data = length 2919, hash 93BC27A8
sample 86:
time = 2866655
flags = 0
data = length 833, hash 213B7EAB
sample 87:
time = 2833322
flags = 0
data = length 574, hash 554020E9
sample 88:
time = 2900000
flags = 0
data = length 431, hash 6C3E69F6
sample 89:
time = 2966655
flags = 0
data = length 2242, hash 8EC9C1D6
sample 90:
time = 3000000
flags = 1
data = length 33075, hash C0FCCB84
sample 91:
time = 3133322
flags = 0
data = length 3349, hash ADE2C1A1
sample 92:
time = 3066655
flags = 0
data = length 890, hash C384FE6A
sample 93:
time = 3033322
flags = 0
data = length 822, hash 2897A348
sample 94:
time = 3100000
flags = 0
data = length 347, hash 968D3ED1
sample 95:
time = 3266655
flags = 0
data = length 4885, hash 57E006DF
sample 96:
time = 3200000
flags = 0
data = length 1714, hash 10B49A30
sample 97:
time = 3166655
flags = 0
data = length 502, hash B0FDBCA
sample 98:
time = 3233322
flags = 0
data = length 378, hash AFCB47B5
sample 99:
time = 3400000
flags = 0
data = length 2216, hash 102B8AD4
sample 100:
time = 3333322
flags = 0
data = length 785, hash 10C1C847
sample 101:
time = 3300000
flags = 0
data = length 499, hash F11DD54
sample 102:
time = 3366655
flags = 0
data = length 352, hash 32BD14FA
sample 103:
time = 3533322
flags = 0
data = length 2525, hash F426C83B
sample 104:
time = 3466655
flags = 0
data = length 732, hash 6BD8DF40
sample 105:
time = 3433322
flags = 0
data = length 466, hash F2253523
sample 106:
time = 3500000
flags = 0
data = length 519, hash 457EB20F
sample 107:
time = 3666655
flags = 0
data = length 1205, hash A8894214
sample 108:
time = 3600000
flags = 0
data = length 483, hash 3C3E6CBA
sample 109:
time = 3566655
flags = 0
data = length 157, hash E3D5E025
sample 110:
time = 3633322
flags = 0
data = length 237, hash A7217EC5
sample 111:
time = 3800000
flags = 0
data = length 1330, hash 6CDE1190
sample 112:
time = 3733322
flags = 0
data = length 475, hash B9925752
sample 113:
time = 3700000
flags = 0
data = length 392, hash 2709B2E0
sample 114:
time = 3766655
flags = 0
data = length 258, hash 900651AF
sample 115:
time = 3933322
flags = 0
data = length 1130, hash 9C8E9289
sample 116:
time = 3866655
flags = 0
data = length 581, hash 79FAD374
sample 117:
time = 3833322
flags = 0
data = length 285, hash B460CF8A
sample 118:
time = 3900000
flags = 0
data = length 277, hash A40F948C
sample 119:
time = 3966655
flags = 536870912
data = length 1318, hash 9A6E5D81
tracksEnded = true

View File

@ -1,2 +0,0 @@
ctts (88 bytes):
Data = length 80, hash FC850C18

View File

@ -1,44 +0,0 @@
seekMap:
isSeekable = true
duration = 3000
getPosition(0) = [[timeUs=0, position=44]]
getPosition(1) = [[timeUs=0, position=44], [timeUs=3000, position=100]]
getPosition(1500) = [[timeUs=0, position=44], [timeUs=3000, position=100]]
getPosition(3000) = [[timeUs=3000, position=100]]
numberOfTracks = 1
track 0:
total output bytes = 224
sample count = 4
format 0:
id = 1
sampleMimeType = video/avc
codecs = avc1.F4000A
maxInputSize = 86
width = 12
height = 10
frameRate = 1333.3334
colorInfo:
colorRange = 1
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
initializationData:
data = length 28, hash 410B510
data = length 9, hash FBADD682
sample 0:
time = 0
flags = 1
data = length 56, hash C4551A2E
sample 1:
time = 3000
flags = 1
data = length 56, hash C4551A2E
sample 2:
time = 1000
flags = 1
data = length 56, hash C4551A2E
sample 3:
time = 2000
flags = 536870913
data = length 56, hash C4551A2E
tracksEnded = true

View File

@ -1,144 +0,0 @@
seekMap:
isSeekable = true
duration = 933300
getPosition(0) = [[timeUs=66655, position=44]]
getPosition(1) = [[timeUs=66655, position=44]]
getPosition(466650) = [[timeUs=400000, position=16035], [timeUs=733322, position=28785]]
getPosition(933300) = [[timeUs=733322, position=28785]]
numberOfTracks = 1
track 0:
total output bytes = 41412
sample count = 29
format 0:
id = 1
sampleMimeType = video/avc
codecs = avc1.64001F
maxInputSize = 11267
width = 854
height = 480
frameRate = 31.072538
colorInfo:
colorRange = 2
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[Mp4Timestamp: creation time=3000000000, modification time=4000000000, timescale=10000]
initializationData:
data = length 30, hash B65D1A82
data = length 10, hash 7A0D0F2B
sample 0:
time = 66655
flags = 1
data = length 859, hash 202E188E
sample 1:
time = 100000
flags = 0
data = length 3331, hash 88D7E46A
sample 2:
time = 166655
flags = 0
data = length 6850, hash FAE2363A
sample 3:
time = 133322
flags = 0
data = length 795, hash EE994ED1
sample 4:
time = 233322
flags = 0
data = length 1875, hash C1B4CECB
sample 5:
time = 200000
flags = 0
data = length 1210, hash 8FA2B5B1
sample 6:
time = 366655
flags = 0
data = length 477, hash 555E99C
sample 7:
time = 300000
flags = 0
data = length 326, hash 8FAE3F64
sample 8:
time = 266655
flags = 0
data = length 90, hash 84A60B02
sample 9:
time = 333322
flags = 0
data = length 178, hash A0B30D59
sample 10:
time = 400000
flags = 1
data = length 11056, hash 52E2FD8B
sample 11:
time = 533322
flags = 0
data = length 303, hash 10D3A3FA
sample 12:
time = 466655
flags = 0
data = length 303, hash 5242D82E
sample 13:
time = 433322
flags = 0
data = length 97, hash 2410F3D6
sample 14:
time = 500000
flags = 0
data = length 199, hash F354477
sample 15:
time = 666655
flags = 0
data = length 304, hash 9A3B0F38
sample 16:
time = 600000
flags = 0
data = length 169, hash 6B89B7E8
sample 17:
time = 566655
flags = 0
data = length 99, hash D4764152
sample 18:
time = 633322
flags = 0
data = length 109, hash AED6C216
sample 19:
time = 700000
flags = 0
data = length 111, hash A17F272F
sample 20:
time = 733322
flags = 1
data = length 11237, hash 2914241B
sample 21:
time = 866655
flags = 0
data = length 359, hash 2A03C082
sample 22:
time = 800000
flags = 0
data = length 337, hash 1BA612F7
sample 23:
time = 766655
flags = 0
data = length 106, hash F4FD66B4
sample 24:
time = 833322
flags = 0
data = length 107, hash 64941FF0
sample 25:
time = 1000000
flags = 0
data = length 236, hash 8ECD7B9F
sample 26:
time = 933322
flags = 0
data = length 110, hash 77532841
sample 27:
time = 900000
flags = 0
data = length 85, hash E29A31D2
sample 28:
time = 966655
flags = 536870912
data = length 94, hash F3C32DE
tracksEnded = true

View File

@ -0,0 +1,340 @@
seekMap:
isSeekable = true
duration = 1065600
getPosition(0) = [[timeUs=0, position=44]]
getPosition(1) = [[timeUs=0, position=44]]
getPosition(532800) = [[timeUs=0, position=44]]
getPosition(1065600) = [[timeUs=0, position=44]]
numberOfTracks = 2
track 0:
total output bytes = 287190
sample count = 29
format 0:
id = 1
sampleMimeType = video/avc
codecs = avc1.640034
maxInputSize = 22910
width = 1080
height = 720
frameRate = 31.042604
colorInfo:
colorSpace = 1
colorRange = 2
colorTransfer = 3
lumaBitdepth = 8
chromaBitdepth = 8
metadata = entries=[Mp4Timestamp: creation time=3000000000, modification time=4000000000, timescale=10000]
initializationData:
data = length 24, hash 489E4AD2
data = length 9, hash FBAFBC0C
sample 0:
time = 0
flags = 1
data = length 7773, hash 97BEE8E7
sample 1:
time = 33355
flags = 0
data = length 1175, hash 875A0AD8
sample 2:
time = 66722
flags = 0
data = length 961, hash 39E26608
sample 3:
time = 100100
flags = 0
data = length 979, hash 9843943C
sample 4:
time = 133455
flags = 0
data = length 1367, hash C795AD6F
sample 5:
time = 166822
flags = 0
data = length 2295, hash 90C61830
sample 6:
time = 200200
flags = 0
data = length 3856, hash E5178FCE
sample 7:
time = 233555
flags = 0
data = length 4055, hash DC2E0B64
sample 8:
time = 266922
flags = 0
data = length 6143, hash 6C8C0E1B
sample 9:
time = 300300
flags = 0
data = length 7639, hash 40ABA1B0
sample 10:
time = 333655
flags = 0
data = length 9795, hash 824B4D8D
sample 11:
time = 367022
flags = 0
data = length 14496, hash D3EEBA42
sample 12:
time = 400400
flags = 0
data = length 17658, hash 12A7A1A6
sample 13:
time = 433755
flags = 0
data = length 5709, hash ACD2349
sample 14:
time = 467122
flags = 0
data = length 9772, hash B00DF832
sample 15:
time = 500500
flags = 0
data = length 17710, hash 366FC3DC
sample 16:
time = 533855
flags = 0
data = length 11442, hash 9B226194
sample 17:
time = 567222
flags = 0
data = length 8546, hash D86DF08E
sample 18:
time = 600600
flags = 0
data = length 19900, hash C6748B4C
sample 19:
time = 633955
flags = 0
data = length 14348, hash D91E9EAB
sample 20:
time = 667322
flags = 0
data = length 9561, hash 819E9692
sample 21:
time = 700700
flags = 0
data = length 12195, hash 895ADC1E
sample 22:
time = 734055
flags = 0
data = length 22880, hash A618D42
sample 23:
time = 767422
flags = 0
data = length 16827, hash 4E6A74F5
sample 24:
time = 800800
flags = 0
data = length 5120, hash 3EF0149C
sample 25:
time = 834155
flags = 0
data = length 9890, hash 32BAC346
sample 26:
time = 867522
flags = 0
data = length 17017, hash 2D24A3B8
sample 27:
time = 900900
flags = 0
data = length 20866, hash 219DA8C0
sample 28:
time = 934255
flags = 536870912
data = length 7215, hash A853B1A9
track 1:
total output bytes = 9529
sample count = 45
format 0:
id = 2
sampleMimeType = audio/mp4a-latm
codecs = mp4a.40.2
maxInputSize = 294
channelCount = 1
sampleRate = 44100
language = und
metadata = entries=[Mp4Timestamp: creation time=3000000000, modification time=4000000000, timescale=10000]
initializationData:
data = length 2, hash 5F7
sample 0:
time = 0
flags = 1
data = length 23, hash 47DE9131
sample 1:
time = 67187
flags = 1
data = length 6, hash 31EC5206
sample 2:
time = 90416
flags = 1
data = length 148, hash 894A176B
sample 3:
time = 113625
flags = 1
data = length 189, hash CEF235A1
sample 4:
time = 136854
flags = 1
data = length 205, hash BBF5F7B0
sample 5:
time = 160062
flags = 1
data = length 210, hash F278B193
sample 6:
time = 183291
flags = 1
data = length 210, hash 82DA1589
sample 7:
time = 206520
flags = 1
data = length 207, hash 5BE231DF
sample 8:
time = 229729
flags = 1
data = length 225, hash 18819EE1
sample 9:
time = 252958
flags = 1
data = length 215, hash CA7FA67B
sample 10:
time = 276166
flags = 1
data = length 211, hash 581A1C18
sample 11:
time = 299395
flags = 1
data = length 216, hash ADB88187
sample 12:
time = 322604
flags = 1
data = length 229, hash 2E8BA4DC
sample 13:
time = 345833
flags = 1
data = length 232, hash 22F0C510
sample 14:
time = 369041
flags = 1
data = length 235, hash 867AD0DC
sample 15:
time = 392270
flags = 1
data = length 231, hash 84E823A8
sample 16:
time = 415500
flags = 1
data = length 226, hash 1BEF3A95
sample 17:
time = 438708
flags = 1
data = length 216, hash EAA345AE
sample 18:
time = 461937
flags = 1
data = length 229, hash 6957411F
sample 19:
time = 485145
flags = 1
data = length 219, hash 41275022
sample 20:
time = 508375
flags = 1
data = length 241, hash 6495DF96
sample 21:
time = 531583
flags = 1
data = length 228, hash 63D95906
sample 22:
time = 554812
flags = 1
data = length 238, hash 34F676F9
sample 23:
time = 578020
flags = 1
data = length 234, hash E5CBC045
sample 24:
time = 601250
flags = 1
data = length 231, hash 5FC43661
sample 25:
time = 624458
flags = 1
data = length 217, hash 682708ED
sample 26:
time = 647687
flags = 1
data = length 239, hash D43780FC
sample 27:
time = 670916
flags = 1
data = length 243, hash C5E17980
sample 28:
time = 694145
flags = 1
data = length 231, hash AC5837BA
sample 29:
time = 717354
flags = 1
data = length 230, hash 169EE895
sample 30:
time = 740583
flags = 1
data = length 238, hash C48FF3F1
sample 31:
time = 763791
flags = 1
data = length 225, hash 531E4599
sample 32:
time = 787020
flags = 1
data = length 232, hash CB3C6B8D
sample 33:
time = 810229
flags = 1
data = length 243, hash F8C94C7
sample 34:
time = 833458
flags = 1
data = length 232, hash A646A7D0
sample 35:
time = 856666
flags = 1
data = length 237, hash E8B787A5
sample 36:
time = 879895
flags = 1
data = length 228, hash 3FA7A29F
sample 37:
time = 903104
flags = 1
data = length 235, hash B9B33B0A
sample 38:
time = 926333
flags = 1
data = length 264, hash 71A4869E
sample 39:
time = 949562
flags = 1
data = length 257, hash D049B54C
sample 40:
time = 972770
flags = 1
data = length 227, hash 66757231
sample 41:
time = 996000
flags = 1
data = length 227, hash BD374F1B
sample 42:
time = 1019208
flags = 1
data = length 235, hash 999477F6
sample 43:
time = 1042437
flags = 1
data = length 229, hash FFF98DF0
sample 44:
time = 1065645
flags = 536870913
data = length 6, hash 31B22286
tracksEnded = true

View File

@ -99,8 +99,8 @@ public class TransformerWithInAppMuxerEndToEndTest {
@Test @Test
public void transmux_tsFileHavingThreeByteNalStartCode_outputMatchesExpected() throws Exception { public void transmux_tsFileHavingThreeByteNalStartCode_outputMatchesExpected() throws Exception {
String tsFilePath = "asset:///media/ts/sample_h264.ts"; String tsFilePath = "asset:///media/ts/sample_no_bframes.ts";
String tsFileName = "ts/sample_h264.ts"; String tsFileName = "ts/sample_no_bframes.ts";
Muxer.Factory inAppMuxerFactory = Muxer.Factory inAppMuxerFactory =
new InAppMuxer.Factory.Builder() new InAppMuxer.Factory.Builder()
.setMetadataProvider( .setMetadataProvider(