mirror of
https://github.com/samsonjs/media.git
synced 2026-04-01 10:35:48 +00:00
Add FMP4 extractor test with sideloaded track
#exofixit PiperOrigin-RevId: 344052500
This commit is contained in:
parent
a8365c2cca
commit
7a7d3d1b07
6 changed files with 348 additions and 1 deletions
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright 2020 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.google.android.exoplayer2.extractor.mp4;
|
||||
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.testutil.ExtractorAsserts;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
import java.util.List;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.ParameterizedRobolectricTestRunner;
|
||||
import org.robolectric.ParameterizedRobolectricTestRunner.Parameter;
|
||||
import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
|
||||
|
||||
/**
|
||||
* Tests for {@link FragmentedMp4Extractor} that test behaviours where sniffing must not be tested.
|
||||
*/
|
||||
@RunWith(ParameterizedRobolectricTestRunner.class)
|
||||
public class FragmentedMp4ExtractorNoSniffingTest {
|
||||
|
||||
@Parameters(name = "{0}")
|
||||
public static List<Object[]> params() {
|
||||
return ExtractorAsserts.configsNoSniffing();
|
||||
}
|
||||
|
||||
@Parameter public ExtractorAsserts.SimulationConfig simulationConfig;
|
||||
|
||||
@Test
|
||||
public void sampleWithSideLoadedTrack() throws Exception {
|
||||
// Sideloaded tracks are generally used in Smooth Streaming, where the MP4 files do not contain
|
||||
// any ftyp box and are not sniffed.
|
||||
Track sideloadedTrack =
|
||||
new Track(
|
||||
/* id= */ 1,
|
||||
/* type= */ C.TRACK_TYPE_VIDEO,
|
||||
/* timescale= */ 30_000,
|
||||
/* movieTimescale= */ 1000,
|
||||
/* durationUs= */ C.TIME_UNSET,
|
||||
new Format.Builder().setSampleMimeType(MimeTypes.VIDEO_H264).build(),
|
||||
/* sampleTransformation= */ Track.TRANSFORMATION_NONE,
|
||||
/* sampleDescriptionEncryptionBoxes= */ null,
|
||||
/* nalUnitLengthFieldLength= */ 4,
|
||||
/* editListDurations= */ null,
|
||||
/* editListMediaTimes= */ null);
|
||||
ExtractorAsserts.assertBehavior(
|
||||
() ->
|
||||
new FragmentedMp4Extractor(
|
||||
/* flags= */ 0, /* timestampAdjuster= */ null, sideloadedTrack),
|
||||
"media/mp4/sample_fragmented_sideloaded_track.mp4",
|
||||
simulationConfig);
|
||||
}
|
||||
}
|
||||
|
|
@ -28,7 +28,7 @@ import org.robolectric.ParameterizedRobolectricTestRunner;
|
|||
import org.robolectric.ParameterizedRobolectricTestRunner.Parameter;
|
||||
import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
|
||||
|
||||
/** Unit test for {@link FragmentedMp4Extractor}. */
|
||||
/** Tests for {@link FragmentedMp4Extractor} that test behaviours where sniffing must be tested. */
|
||||
@RunWith(ParameterizedRobolectricTestRunner.class)
|
||||
public final class FragmentedMp4ExtractorTest {
|
||||
|
||||
|
|
|
|||
131
testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump
vendored
Normal file
131
testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump
vendored
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
seekMap:
|
||||
isSeekable = false
|
||||
duration = UNSET TIME
|
||||
getPosition(0) = [[timeUs=0, position=0]]
|
||||
numberOfTracks = 1
|
||||
track 0:
|
||||
total output bytes = 85933
|
||||
sample count = 30
|
||||
format 0:
|
||||
sampleMimeType = video/avc
|
||||
sample 0:
|
||||
time = 66733
|
||||
flags = 1
|
||||
data = length 38070, hash B58E1AEE
|
||||
sample 1:
|
||||
time = 200199
|
||||
flags = 0
|
||||
data = length 8340, hash 8AC449FF
|
||||
sample 2:
|
||||
time = 133466
|
||||
flags = 0
|
||||
data = length 1295, hash C0DA5090
|
||||
sample 3:
|
||||
time = 100100
|
||||
flags = 0
|
||||
data = length 469, hash D6E0A200
|
||||
sample 4:
|
||||
time = 166832
|
||||
flags = 0
|
||||
data = length 564, hash E5F56C5B
|
||||
sample 5:
|
||||
time = 333666
|
||||
flags = 0
|
||||
data = length 6075, hash 8756E49E
|
||||
sample 6:
|
||||
time = 266933
|
||||
flags = 0
|
||||
data = length 847, hash DCC2B618
|
||||
sample 7:
|
||||
time = 233566
|
||||
flags = 0
|
||||
data = length 455, hash B9CCE047
|
||||
sample 8:
|
||||
time = 300299
|
||||
flags = 0
|
||||
data = length 467, hash 69806D94
|
||||
sample 9:
|
||||
time = 467133
|
||||
flags = 0
|
||||
data = length 4549, hash 3944F501
|
||||
sample 10:
|
||||
time = 400399
|
||||
flags = 0
|
||||
data = length 1087, hash 491BF106
|
||||
sample 11:
|
||||
time = 367033
|
||||
flags = 0
|
||||
data = length 380, hash 5FED016A
|
||||
sample 12:
|
||||
time = 433766
|
||||
flags = 0
|
||||
data = length 455, hash 8A0610
|
||||
sample 13:
|
||||
time = 600599
|
||||
flags = 0
|
||||
data = length 5190, hash B9031D8
|
||||
sample 14:
|
||||
time = 533866
|
||||
flags = 0
|
||||
data = length 1071, hash 684E7DC8
|
||||
sample 15:
|
||||
time = 500500
|
||||
flags = 0
|
||||
data = length 653, hash 8494F326
|
||||
sample 16:
|
||||
time = 567232
|
||||
flags = 0
|
||||
data = length 485, hash 2CCC85F4
|
||||
sample 17:
|
||||
time = 734066
|
||||
flags = 0
|
||||
data = length 4884, hash D16B6A96
|
||||
sample 18:
|
||||
time = 667333
|
||||
flags = 0
|
||||
data = length 997, hash 164FF210
|
||||
sample 19:
|
||||
time = 633966
|
||||
flags = 0
|
||||
data = length 640, hash F664125B
|
||||
sample 20:
|
||||
time = 700699
|
||||
flags = 0
|
||||
data = length 491, hash B5930C7C
|
||||
sample 21:
|
||||
time = 867533
|
||||
flags = 0
|
||||
data = length 2989, hash 92CF4FCF
|
||||
sample 22:
|
||||
time = 800799
|
||||
flags = 0
|
||||
data = length 838, hash 294A3451
|
||||
sample 23:
|
||||
time = 767433
|
||||
flags = 0
|
||||
data = length 544, hash FCCE2DE6
|
||||
sample 24:
|
||||
time = 834166
|
||||
flags = 0
|
||||
data = length 329, hash A654FFA1
|
||||
sample 25:
|
||||
time = 1000999
|
||||
flags = 0
|
||||
data = length 1517, hash 5F7EBF8B
|
||||
sample 26:
|
||||
time = 934266
|
||||
flags = 0
|
||||
data = length 803, hash 7A5C4C1D
|
||||
sample 27:
|
||||
time = 900900
|
||||
flags = 0
|
||||
data = length 415, hash B31BBC3B
|
||||
sample 28:
|
||||
time = 967632
|
||||
flags = 0
|
||||
data = length 415, hash 850DFEA3
|
||||
sample 29:
|
||||
time = 1034366
|
||||
flags = 0
|
||||
data = length 619, hash AB5E56CA
|
||||
tracksEnded = true
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
seekMap:
|
||||
isSeekable = false
|
||||
duration = UNSET TIME
|
||||
getPosition(0) = [[timeUs=0, position=0]]
|
||||
numberOfTracks = 1
|
||||
track 0:
|
||||
total output bytes = 85933
|
||||
sample count = 30
|
||||
format 0:
|
||||
sampleMimeType = video/avc
|
||||
sample 0:
|
||||
time = 66733
|
||||
flags = 1
|
||||
data = length 38070, hash B58E1AEE
|
||||
sample 1:
|
||||
time = 200199
|
||||
flags = 0
|
||||
data = length 8340, hash 8AC449FF
|
||||
sample 2:
|
||||
time = 133466
|
||||
flags = 0
|
||||
data = length 1295, hash C0DA5090
|
||||
sample 3:
|
||||
time = 100100
|
||||
flags = 0
|
||||
data = length 469, hash D6E0A200
|
||||
sample 4:
|
||||
time = 166832
|
||||
flags = 0
|
||||
data = length 564, hash E5F56C5B
|
||||
sample 5:
|
||||
time = 333666
|
||||
flags = 0
|
||||
data = length 6075, hash 8756E49E
|
||||
sample 6:
|
||||
time = 266933
|
||||
flags = 0
|
||||
data = length 847, hash DCC2B618
|
||||
sample 7:
|
||||
time = 233566
|
||||
flags = 0
|
||||
data = length 455, hash B9CCE047
|
||||
sample 8:
|
||||
time = 300299
|
||||
flags = 0
|
||||
data = length 467, hash 69806D94
|
||||
sample 9:
|
||||
time = 467133
|
||||
flags = 0
|
||||
data = length 4549, hash 3944F501
|
||||
sample 10:
|
||||
time = 400399
|
||||
flags = 0
|
||||
data = length 1087, hash 491BF106
|
||||
sample 11:
|
||||
time = 367033
|
||||
flags = 0
|
||||
data = length 380, hash 5FED016A
|
||||
sample 12:
|
||||
time = 433766
|
||||
flags = 0
|
||||
data = length 455, hash 8A0610
|
||||
sample 13:
|
||||
time = 600599
|
||||
flags = 0
|
||||
data = length 5190, hash B9031D8
|
||||
sample 14:
|
||||
time = 533866
|
||||
flags = 0
|
||||
data = length 1071, hash 684E7DC8
|
||||
sample 15:
|
||||
time = 500500
|
||||
flags = 0
|
||||
data = length 653, hash 8494F326
|
||||
sample 16:
|
||||
time = 567232
|
||||
flags = 0
|
||||
data = length 485, hash 2CCC85F4
|
||||
sample 17:
|
||||
time = 734066
|
||||
flags = 0
|
||||
data = length 4884, hash D16B6A96
|
||||
sample 18:
|
||||
time = 667333
|
||||
flags = 0
|
||||
data = length 997, hash 164FF210
|
||||
sample 19:
|
||||
time = 633966
|
||||
flags = 0
|
||||
data = length 640, hash F664125B
|
||||
sample 20:
|
||||
time = 700699
|
||||
flags = 0
|
||||
data = length 491, hash B5930C7C
|
||||
sample 21:
|
||||
time = 867533
|
||||
flags = 0
|
||||
data = length 2989, hash 92CF4FCF
|
||||
sample 22:
|
||||
time = 800799
|
||||
flags = 0
|
||||
data = length 838, hash 294A3451
|
||||
sample 23:
|
||||
time = 767433
|
||||
flags = 0
|
||||
data = length 544, hash FCCE2DE6
|
||||
sample 24:
|
||||
time = 834166
|
||||
flags = 0
|
||||
data = length 329, hash A654FFA1
|
||||
sample 25:
|
||||
time = 1000999
|
||||
flags = 0
|
||||
data = length 1517, hash 5F7EBF8B
|
||||
sample 26:
|
||||
time = 934266
|
||||
flags = 0
|
||||
data = length 803, hash 7A5C4C1D
|
||||
sample 27:
|
||||
time = 900900
|
||||
flags = 0
|
||||
data = length 415, hash B31BBC3B
|
||||
sample 28:
|
||||
time = 967632
|
||||
flags = 0
|
||||
data = length 415, hash 850DFEA3
|
||||
sample 29:
|
||||
time = 1034366
|
||||
flags = 0
|
||||
data = length 619, hash AB5E56CA
|
||||
tracksEnded = true
|
||||
BIN
testdata/src/test/assets/media/mp4/sample_fragmented_sideloaded_track.mp4
vendored
Normal file
BIN
testdata/src/test/assets/media/mp4/sample_fragmented_sideloaded_track.mp4
vendored
Normal file
Binary file not shown.
|
|
@ -61,6 +61,25 @@ public final class ExtractorAsserts {
|
|||
new Object[] {new SimulationConfig(false, false, false, false)});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of arrays containing {@link SimulationConfig} objects to exercise different
|
||||
* extractor paths in which the input is not sniffed.
|
||||
*
|
||||
* <p>This is intended to be used from tests using {@code ParameterizedRobolectricTestRunner} or
|
||||
* {@code org.junit.runners.Parameterized}.
|
||||
*/
|
||||
public static List<Object[]> configsNoSniffing() {
|
||||
return Arrays.asList(
|
||||
new Object[] {new SimulationConfig(false, false, false, false)},
|
||||
new Object[] {new SimulationConfig(false, false, false, true)},
|
||||
new Object[] {new SimulationConfig(false, false, true, false)},
|
||||
new Object[] {new SimulationConfig(false, false, true, true)},
|
||||
new Object[] {new SimulationConfig(false, true, false, false)},
|
||||
new Object[] {new SimulationConfig(false, true, false, true)},
|
||||
new Object[] {new SimulationConfig(false, true, true, false)},
|
||||
new Object[] {new SimulationConfig(false, true, true, true)});
|
||||
}
|
||||
|
||||
/** A config of different environments to simulate and extractor behaviours to test. */
|
||||
public static class SimulationConfig {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue