Use video passthrough if clipping starts at key frame.

PiperOrigin-RevId: 451380267
This commit is contained in:
hschlueter 2022-05-27 13:22:03 +00:00 committed by Marc Baechinger
parent 3e8a2f104c
commit 9649411a4f
4 changed files with 1054 additions and 30 deletions

View File

@ -0,0 +1,991 @@
containerMimeType = video/mp4
format 0:
averageBitrate = 192181
peakBitrate = 192181
id = 2
sampleMimeType = audio/mp4a-latm
codecs = mp4a.40.2
maxInputSize = 643
channelCount = 2
sampleRate = 48000
language = en
metadata = entries=[TSSE: description=null: value=Lavf58.76.100]
initializationData:
data = length 2, hash 560
format 1:
id = 1
sampleMimeType = video/avc
codecs = avc1.42C015
maxInputSize = 14839
width = 320
height = 240
frameRate = 59.997425
colorInfo:
colorSpace = 2
colorRange = 1
colorTransfer = 3
hdrStaticInfo = length 0, hash 0
initializationData:
data = length 31, hash 4B108214
data = length 9, hash FBA158BB
sample:
trackIndex = 1
dataHashCode = 983000500
size = 13539
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 1
dataHashCode = -1834230781
size = 32
isKeyFrame = false
presentationTimeUs = 16666
sample:
trackIndex = 1
dataHashCode = 521720738
size = 1534
isKeyFrame = false
presentationTimeUs = 33333
sample:
trackIndex = 1
dataHashCode = 722836039
size = 123
isKeyFrame = false
presentationTimeUs = 50000
sample:
trackIndex = 1
dataHashCode = -1702585381
size = 2061
isKeyFrame = false
presentationTimeUs = 66666
sample:
trackIndex = 1
dataHashCode = -365856396
size = 147
isKeyFrame = false
presentationTimeUs = 83333
sample:
trackIndex = 1
dataHashCode = 1258185334
size = 2534
isKeyFrame = false
presentationTimeUs = 100000
sample:
trackIndex = 1
dataHashCode = -179623006
size = 87
isKeyFrame = false
presentationTimeUs = 116666
sample:
trackIndex = 1
dataHashCode = -541393824
size = 2762
isKeyFrame = false
presentationTimeUs = 133333
sample:
trackIndex = 1
dataHashCode = -1912932514
size = 57
isKeyFrame = false
presentationTimeUs = 150000
sample:
trackIndex = 1
dataHashCode = 485634444
size = 2833
isKeyFrame = false
presentationTimeUs = 166666
sample:
trackIndex = 1
dataHashCode = 570625802
size = 189
isKeyFrame = false
presentationTimeUs = 183333
sample:
trackIndex = 1
dataHashCode = 1819668957
size = 3153
isKeyFrame = false
presentationTimeUs = 200000
sample:
trackIndex = 1
dataHashCode = 1004398066
size = 104
isKeyFrame = false
presentationTimeUs = 216666
sample:
trackIndex = 1
dataHashCode = 2087741113
size = 2304
isKeyFrame = false
presentationTimeUs = 233333
sample:
trackIndex = 1
dataHashCode = -419782502
size = 222
isKeyFrame = false
presentationTimeUs = 250000
sample:
trackIndex = 1
dataHashCode = -1867110345
size = 2306
isKeyFrame = false
presentationTimeUs = 266666
sample:
trackIndex = 1
dataHashCode = 1908323737
size = 257
isKeyFrame = false
presentationTimeUs = 283333
sample:
trackIndex = 1
dataHashCode = 884063337
size = 2201
isKeyFrame = false
presentationTimeUs = 300000
sample:
trackIndex = 1
dataHashCode = -1308458590
size = 174
isKeyFrame = false
presentationTimeUs = 316666
sample:
trackIndex = 1
dataHashCode = -1686938678
size = 2524
isKeyFrame = false
presentationTimeUs = 333333
sample:
trackIndex = 1
dataHashCode = -1372845971
size = 171
isKeyFrame = false
presentationTimeUs = 350000
sample:
trackIndex = 1
dataHashCode = 1130876644
size = 2306
isKeyFrame = false
presentationTimeUs = 366666
sample:
trackIndex = 1
dataHashCode = 1707671352
size = 188
isKeyFrame = false
presentationTimeUs = 383333
sample:
trackIndex = 1
dataHashCode = 300233313
size = 2529
isKeyFrame = false
presentationTimeUs = 400000
sample:
trackIndex = 1
dataHashCode = -1284013406
size = 182
isKeyFrame = false
presentationTimeUs = 416666
sample:
trackIndex = 1
dataHashCode = -2088617828
size = 2047
isKeyFrame = false
presentationTimeUs = 433333
sample:
trackIndex = 1
dataHashCode = 2116374999
size = 259
isKeyFrame = false
presentationTimeUs = 450000
sample:
trackIndex = 1
dataHashCode = -2123019940
size = 2234
isKeyFrame = false
presentationTimeUs = 466666
sample:
trackIndex = 1
dataHashCode = 1901454757
size = 138
isKeyFrame = false
presentationTimeUs = 483333
sample:
trackIndex = 1
dataHashCode = 1576638059
size = 2088
isKeyFrame = false
presentationTimeUs = 500000
sample:
trackIndex = 1
dataHashCode = 1120133924
size = 151
isKeyFrame = false
presentationTimeUs = 516666
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 = 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 = 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 = 1
dataHashCode = 64254117
size = 164
isKeyFrame = false
presentationTimeUs = 550000
sample:
trackIndex = 1
dataHashCode = -1000078879
size = 2231
isKeyFrame = false
presentationTimeUs = 566666
sample:
trackIndex = 1
dataHashCode = 286919946
size = 123
isKeyFrame = false
presentationTimeUs = 583333
sample:
trackIndex = 1
dataHashCode = -320312658
size = 2303
isKeyFrame = false
presentationTimeUs = 600000
sample:
trackIndex = 1
dataHashCode = 1057750590
size = 175
isKeyFrame = false
presentationTimeUs = 616666
sample:
trackIndex = 1
dataHashCode = 1961415074
size = 2165
isKeyFrame = false
presentationTimeUs = 633333
sample:
trackIndex = 1
dataHashCode = 667267023
size = 260
isKeyFrame = false
presentationTimeUs = 650000
sample:
trackIndex = 1
dataHashCode = 979033489
size = 1924
isKeyFrame = false
presentationTimeUs = 666666
sample:
trackIndex = 1
dataHashCode = -1974473017
size = 286
isKeyFrame = false
presentationTimeUs = 683333
sample:
trackIndex = 1
dataHashCode = -962519103
size = 1992
isKeyFrame = false
presentationTimeUs = 700000
sample:
trackIndex = 1
dataHashCode = -1312094075
size = 204
isKeyFrame = false
presentationTimeUs = 716666
sample:
trackIndex = 1
dataHashCode = 2068151127
size = 1826
isKeyFrame = false
presentationTimeUs = 733333
sample:
trackIndex = 1
dataHashCode = -1531967506
size = 284
isKeyFrame = false
presentationTimeUs = 750000
sample:
trackIndex = 1
dataHashCode = -778066699
size = 1940
isKeyFrame = false
presentationTimeUs = 766666
sample:
trackIndex = 1
dataHashCode = -1219952117
size = 129
isKeyFrame = false
presentationTimeUs = 783333
sample:
trackIndex = 1
dataHashCode = -1218204223
size = 1947
isKeyFrame = false
presentationTimeUs = 800000
sample:
trackIndex = 1
dataHashCode = -1816247511
size = 147
isKeyFrame = false
presentationTimeUs = 816666
sample:
trackIndex = 1
dataHashCode = 299686318
size = 2066
isKeyFrame = false
presentationTimeUs = 833333
sample:
trackIndex = 1
dataHashCode = -1520242765
size = 185
isKeyFrame = false
presentationTimeUs = 850000
sample:
trackIndex = 1
dataHashCode = -1702498409
size = 2159
isKeyFrame = false
presentationTimeUs = 866666
sample:
trackIndex = 1
dataHashCode = 345202950
size = 189
isKeyFrame = false
presentationTimeUs = 883333
sample:
trackIndex = 1
dataHashCode = 220746796
size = 2098
isKeyFrame = false
presentationTimeUs = 900000
sample:
trackIndex = 1
dataHashCode = -32341189
size = 159
isKeyFrame = false
presentationTimeUs = 916666
sample:
trackIndex = 1
dataHashCode = -1838476361
size = 1914
isKeyFrame = false
presentationTimeUs = 933333
sample:
trackIndex = 1
dataHashCode = -1322093590
size = 99
isKeyFrame = false
presentationTimeUs = 950000
sample:
trackIndex = 1
dataHashCode = -1391064751
size = 2168
isKeyFrame = false
presentationTimeUs = 966666
sample:
trackIndex = 1
dataHashCode = 1479204931
size = 129
isKeyFrame = false
presentationTimeUs = 983333
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 = 204379389
size = 504
isKeyFrame = true
presentationTimeUs = 540354
sample:
trackIndex = 0
dataHashCode = 694913274
size = 508
isKeyFrame = true
presentationTimeUs = 561687
sample:
trackIndex = 0
dataHashCode = 289018778
size = 513
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
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 = 1
dataHashCode = 65238903
size = 163
isKeyFrame = false
presentationTimeUs = 1050000
sample:
trackIndex = 1
dataHashCode = 1720840922
size = 2043
isKeyFrame = false
presentationTimeUs = 1066666
sample:
trackIndex = 1
dataHashCode = -1006231050
size = 178
isKeyFrame = false
presentationTimeUs = 1083333
sample:
trackIndex = 1
dataHashCode = 1742965952
size = 2022
isKeyFrame = false
presentationTimeUs = 1100000
sample:
trackIndex = 1
dataHashCode = -971065365
size = 240
isKeyFrame = false
presentationTimeUs = 1116666
sample:
trackIndex = 1
dataHashCode = 1757434551
size = 1887
isKeyFrame = false
presentationTimeUs = 1133333
sample:
trackIndex = 1
dataHashCode = 1501849116
size = 252
isKeyFrame = false
presentationTimeUs = 1150000
sample:
trackIndex = 1
dataHashCode = 825501977
size = 1816
isKeyFrame = false
presentationTimeUs = 1166666
sample:
trackIndex = 1
dataHashCode = -1616223509
size = 246
isKeyFrame = false
presentationTimeUs = 1183333
sample:
trackIndex = 1
dataHashCode = 457119646
size = 1817
isKeyFrame = false
presentationTimeUs = 1200000
sample:
trackIndex = 1
dataHashCode = -1382929639
size = 146
isKeyFrame = false
presentationTimeUs = 1216666
sample:
trackIndex = 1
dataHashCode = -1580853131
size = 1929
isKeyFrame = false
presentationTimeUs = 1233333
sample:
trackIndex = 1
dataHashCode = 1758706551
size = 196
isKeyFrame = false
presentationTimeUs = 1250000
sample:
trackIndex = 1
dataHashCode = 207289556
size = 2154
isKeyFrame = false
presentationTimeUs = 1266666
sample:
trackIndex = 1
dataHashCode = -981284942
size = 182
isKeyFrame = false
presentationTimeUs = 1283333
sample:
trackIndex = 1
dataHashCode = 855103964
size = 2144
isKeyFrame = false
presentationTimeUs = 1300000
sample:
trackIndex = 1
dataHashCode = 380479426
size = 90
isKeyFrame = false
presentationTimeUs = 1316666
sample:
trackIndex = 1
dataHashCode = -1677996152
size = 2005
isKeyFrame = false
presentationTimeUs = 1333333
sample:
trackIndex = 1
dataHashCode = 1516852008
size = 156
isKeyFrame = false
presentationTimeUs = 1350000
sample:
trackIndex = 1
dataHashCode = -1602805193
size = 1772
isKeyFrame = false
presentationTimeUs = 1366666
sample:
trackIndex = 1
dataHashCode = -1720426556
size = 162
isKeyFrame = false
presentationTimeUs = 1383333
sample:
trackIndex = 1
dataHashCode = -1392260423
size = 1865
isKeyFrame = false
presentationTimeUs = 1400000
sample:
trackIndex = 1
dataHashCode = -1842432151
size = 151
isKeyFrame = false
presentationTimeUs = 1416666
sample:
trackIndex = 1
dataHashCode = -537063215
size = 1848
isKeyFrame = false
presentationTimeUs = 1433333
sample:
trackIndex = 1
dataHashCode = 2089388394
size = 206
isKeyFrame = false
presentationTimeUs = 1450000
sample:
trackIndex = 1
dataHashCode = -1761777019
size = 1934
isKeyFrame = false
presentationTimeUs = 1466666
sample:
trackIndex = 1
dataHashCode = 235471194
size = 119
isKeyFrame = false
presentationTimeUs = 1483333
sample:
trackIndex = 0
dataHashCode = -320096195
size = 509
isKeyFrame = true
presentationTimeUs = 1052354
sample:
trackIndex = 0
dataHashCode = -744850549
size = 511
isKeyFrame = true
presentationTimeUs = 1073687
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

View File

@ -758,6 +758,7 @@ public final class Transformer {
removeAudio,
removeVideo,
transformationRequest,
mediaItem.clippingConfiguration.startsAtKeyFrame,
videoFrameEffects,
encoderFactory,
decoderFactory,
@ -871,6 +872,7 @@ public final class Transformer {
private final boolean removeAudio;
private final boolean removeVideo;
private final TransformationRequest transformationRequest;
private final boolean clippingStartsAtKeyFrame;
private final ImmutableList<GlEffect> videoFrameEffects;
private final Codec.EncoderFactory encoderFactory;
private final Codec.DecoderFactory decoderFactory;
@ -884,6 +886,7 @@ public final class Transformer {
boolean removeAudio,
boolean removeVideo,
TransformationRequest transformationRequest,
boolean clippingStartsAtKeyFrame,
ImmutableList<GlEffect> videoFrameEffects,
Codec.EncoderFactory encoderFactory,
Codec.DecoderFactory decoderFactory,
@ -895,6 +898,7 @@ public final class Transformer {
this.removeAudio = removeAudio;
this.removeVideo = removeVideo;
this.transformationRequest = transformationRequest;
this.clippingStartsAtKeyFrame = clippingStartsAtKeyFrame;
this.videoFrameEffects = videoFrameEffects;
this.encoderFactory = encoderFactory;
this.decoderFactory = decoderFactory;
@ -932,6 +936,7 @@ public final class Transformer {
muxerWrapper,
mediaClock,
transformationRequest,
clippingStartsAtKeyFrame,
videoFrameEffects,
encoderFactory,
decoderFactory,

View File

@ -35,6 +35,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private static final String TAG = "TVideoRenderer";
private final Context context;
private final boolean clippingStartsAtKeyFrame;
private final ImmutableList<GlEffect> effects;
private final Codec.EncoderFactory encoderFactory;
private final Codec.DecoderFactory decoderFactory;
@ -49,6 +50,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
MuxerWrapper muxerWrapper,
TransformerMediaClock mediaClock,
TransformationRequest transformationRequest,
boolean clippingStartsAtKeyFrame,
ImmutableList<GlEffect> effects,
Codec.EncoderFactory encoderFactory,
Codec.DecoderFactory decoderFactory,
@ -57,6 +59,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
Transformer.DebugViewProvider debugViewProvider) {
super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformationRequest, fallbackListener);
this.context = context;
this.clippingStartsAtKeyFrame = clippingStartsAtKeyFrame;
this.effects = effects;
this.encoderFactory = encoderFactory;
this.decoderFactory = decoderFactory;
@ -110,8 +113,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
}
private boolean shouldPassthrough(Format inputFormat) {
// TODO(b/233988291): Use passthrough pipeline if the clipping start is a key-frame.
if (startPositionOffsetUs != 0) {
if (startPositionOffsetUs != 0 && !clippingStartsAtKeyFrame) {
return false;
}
if (encoderFactory.videoNeedsEncoding()) {

View File

@ -73,9 +73,11 @@ import org.robolectric.shadows.ShadowMediaCodecList;
@RunWith(AndroidJUnit4.class)
public final class TransformerEndToEndTest {
private static final String URI_PREFIX = "asset:///media/";
private static final String ASSET_URI_PREFIX = "asset:///media/";
private static final String FILE_VIDEO_ONLY = "mp4/sample_18byte_nclx_colr.mp4";
private static final String FILE_AUDIO_VIDEO = "mp4/sample.mp4";
private static final String FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S =
"mp4/sample_with_increasing_timestamps_320w_240h.mp4";
private static final String FILE_WITH_SUBTITLES = "mkv/sample_with_srt.mkv";
private static final String FILE_WITH_SEF_SLOW_MOTION = "mp4/sample_sef_slow_motion.mp4";
private static final String FILE_AUDIO_UNSUPPORTED_BY_DECODER = "amr/sample_wb.amr";
@ -109,7 +111,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_videoOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -121,7 +123,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_audioOnlyPassthrough_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -139,7 +141,7 @@ public final class TransformerEndToEndTest {
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -151,7 +153,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_audioAndVideo_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -159,6 +161,30 @@ public final class TransformerEndToEndTest {
DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO));
}
@Test
public void startTransformation_audioAndVideo_withClippingStartAtKeyFrame_completesSuccessfully()
throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem =
new MediaItem.Builder()
.setUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(12_500)
.setEndPositionMs(14_000)
.setStartsAtKeyFrame(true)
.build())
.build();
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
DumpFileAsserts.assertOutput(
context,
testMuxer,
getDumpFileName(FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S + ".clipped"));
}
@Test
public void startTransformation_withSubtitles_completesSuccessfully() throws Exception {
Transformer transformer =
@ -166,7 +192,7 @@ public final class TransformerEndToEndTest {
.setTransformationRequest(
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_WITH_SUBTITLES);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -178,7 +204,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_successiveTransformations_completesSuccessfully()
throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
// Transform first media item.
transformer.startTransformation(mediaItem, outputPath);
@ -195,7 +221,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_concurrentTransformations_throwsError() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(mediaItem, outputPath);
@ -207,7 +233,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_removeAudio_completesSuccessfully() throws Exception {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setRemoveAudio(true).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -220,7 +246,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_removeVideo_completesSuccessfully() throws Exception {
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setRemoveVideo(true).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -240,7 +266,7 @@ public final class TransformerEndToEndTest {
.addListener(mockListener2)
.addListener(mockListener3)
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -263,7 +289,7 @@ public final class TransformerEndToEndTest {
.setTransformationRequest( // Request transcoding so that decoder is used.
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception = TransformerTestRunner.runUntilError(transformer);
@ -288,7 +314,7 @@ public final class TransformerEndToEndTest {
.addListener(mockListener2)
.addListener(mockListener3)
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -314,7 +340,7 @@ public final class TransformerEndToEndTest {
.addListener(mockListener3)
.build();
Transformer transformer2 = transformer1.buildUpon().removeListener(mockListener2).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer2.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer2);
@ -331,7 +357,7 @@ public final class TransformerEndToEndTest {
.setTransformationRequest(
new TransformationRequest.Builder().setFlattenForSlowMotion(true).build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -352,7 +378,7 @@ public final class TransformerEndToEndTest {
};
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).addListener(listener).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -374,7 +400,7 @@ public final class TransformerEndToEndTest {
MimeTypes.AUDIO_AMR_NB) // unsupported by encoder, supported by muxer
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception = TransformerTestRunner.runUntilError(transformer);
@ -394,7 +420,7 @@ public final class TransformerEndToEndTest {
.setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer
.build())
.build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception = TransformerTestRunner.runUntilError(transformer);
@ -420,7 +446,7 @@ public final class TransformerEndToEndTest {
public void startTransformation_withAudioMuxerFormatUnsupported_completesWithError()
throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
transformer.startTransformation(mediaItem, outputPath);
TransformationException exception = TransformerTestRunner.runUntilError(transformer);
@ -441,7 +467,7 @@ public final class TransformerEndToEndTest {
new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build();
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ true).addListener(mockListener).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);
@ -455,7 +481,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_afterCancellation_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
transformer.startTransformation(mediaItem, outputPath);
transformer.cancel();
@ -475,7 +501,7 @@ public final class TransformerEndToEndTest {
Looper looper = anotherThread.getLooper();
Transformer transformer =
createTransformerBuilder(/* enableFallback= */ false).setLooper(looper).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
AtomicReference<Exception> exception = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -500,7 +526,7 @@ public final class TransformerEndToEndTest {
@Test
public void startTransformation_fromWrongThread_throwsError() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_AUDIO_VIDEO);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
HandlerThread anotherThread = new HandlerThread("AnotherThread");
AtomicReference<IllegalStateException> illegalStateException = new AtomicReference<>();
CountDownLatch countDownLatch = new CountDownLatch(1);
@ -527,7 +553,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_knownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -573,7 +599,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
List<Integer> progresses = new ArrayList<>();
Handler progressHandler =
new Handler(Looper.myLooper()) {
@ -608,7 +634,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_noCurrentTransformation_returnsNoTransformation() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
@Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder);
transformer.startTransformation(mediaItem, outputPath);
@ -622,7 +648,7 @@ public final class TransformerEndToEndTest {
@Test
public void getProgress_unknownDuration_returnsConsistentStates() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_UNKNOWN_DURATION);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION);
AtomicInteger previousProgressState =
new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY);
AtomicBoolean foundInconsistentState = new AtomicBoolean();
@ -689,7 +715,7 @@ public final class TransformerEndToEndTest {
@Test
public void cancel_afterCompletion_doesNotThrow() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(URI_PREFIX + FILE_VIDEO_ONLY);
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY);
transformer.startTransformation(mediaItem, outputPath);
TransformerTestRunner.runUntilCompleted(transformer);