Skip to content

Commit a105d03

Browse files
hmschmarcbaechinger
authored andcommitted
Check targetSdkVersion for frame dropping workaround.
Based on https://developer.android.com/reference/android/media/MediaCodec#using-an-output-surface, frame dropping behaviour depends on the target SDK version. After this change transformer will only use MediaFormat#KEY_ALLOW_FRAME_DROP if both the target and system SDK version are at least 29 and default to its pre 29 behaviour where each decoder output frame must be processed before a new one is rendered to prevent frame dropping otherwise. Also remove deprecated Transformer.Builder constructor without a context and the context setter. PiperOrigin-RevId: 453971097
1 parent cc1f32d commit a105d03

File tree

17 files changed

+104
-80
lines changed

17 files changed

+104
-80
lines changed

‎RELEASENOTES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@
191191
`DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT` otherwise.
192192
* Remove constructor `DefaultTrackSelector(ExoTrackSelection.Factory)`.
193193
Use `DefaultTrackSelector(Context, ExoTrackSelection.Factory)` instead.
194+
* Remove `Transformer.Builder.setContext`. The `Context` should be passed
195+
to the `Transformer.Builder` constructor instead.
194196

195197
### 1.0.0-alpha03 (2022-03-14)
196198

‎demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ private Transformer createTransformer(@Nullable Bundle bundle, String filePath)
260260
.setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO))
261261
.setEncoderFactory(
262262
new DefaultEncoderFactory(
263+
/* context= */ this,
263264
EncoderSelector.DEFAULT,
264265
/* enableFallback= */ bundle.getBoolean(ConfigurationActivity.ENABLE_FALLBACK)));
265266

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/AndroidTestUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ public static final class ForceEncodeEncoderFactory implements Codec.EncoderFact
224224
private final Codec.EncoderFactory encoderFactory;
225225

226226
/** Creates an instance that wraps {@link DefaultEncoderFactory}. */
227-
public ForceEncodeEncoderFactory() {
228-
encoderFactory = Codec.EncoderFactory.DEFAULT;
227+
public ForceEncodeEncoderFactory(Context context) {
228+
encoderFactory = new DefaultEncoderFactory(context);
229229
}
230230

231231
/**

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public void videoEditing_completesWithConsistentFrameCount() throws Exception {
4242
.setTransformationRequest(
4343
new TransformationRequest.Builder().setResolution(480).build())
4444
.setEncoderFactory(
45-
new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* enableFallback= */ false))
45+
new DefaultEncoderFactory(
46+
context, EncoderSelector.DEFAULT, /* enableFallback= */ false))
4647
.build();
4748
// Result of the following command:
4849
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4
@@ -67,7 +68,8 @@ public void videoOnly_completesWithConsistentDuration() throws Exception {
6768
.setTransformationRequest(
6869
new TransformationRequest.Builder().setResolution(480).build())
6970
.setEncoderFactory(
70-
new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* enableFallback= */ false))
71+
new DefaultEncoderFactory(
72+
context, EncoderSelector.DEFAULT, /* enableFallback= */ false))
7173
.build();
7274
long expectedDurationMs = 967;
7375

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTransformationTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void repeatedTranscode_givesConsistentLengthOutput() throws Exception {
4848
new Transformer.Builder(context)
4949
.setTransformationRequest(
5050
new TransformationRequest.Builder().setRotationDegrees(45).build())
51-
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory())
51+
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
5252
.build())
5353
.build();
5454

@@ -78,7 +78,7 @@ public void repeatedTranscodeNoAudio_givesConsistentLengthOutput() throws Except
7878
.setRemoveAudio(true)
7979
.setTransformationRequest(
8080
new TransformationRequest.Builder().setRotationDegrees(45).build())
81-
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory())
81+
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
8282
.build())
8383
.build();
8484

@@ -107,7 +107,7 @@ public void repeatedTranscodeNoVideo_givesConsistentLengthOutput() throws Except
107107
new Transformer.Builder(context)
108108
.setRemoveVideo(true)
109109
.setTransformationRequest(new TransformationRequest.Builder().build())
110-
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory())
110+
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
111111
.build())
112112
.build();
113113

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TranscodeQualityTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void transformWithDecodeEncode_ssimIsGreaterThan90Percent() throws Except
5252
new Transformer.Builder(context)
5353
.setTransformationRequest(
5454
new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build())
55-
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory())
55+
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
5656
.setRemoveAudio(true)
5757
.build();
5858

@@ -119,7 +119,7 @@ public void transcodeAvcToAvc320x240_ssimIsGreaterThan90Percent() throws Excepti
119119
new Transformer.Builder(context)
120120
.setTransformationRequest(
121121
new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build())
122-
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory())
122+
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
123123
.setRemoveAudio(true)
124124
.build();
125125

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ public void transform() throws Exception {
5252
String testId = TAG + "_transform";
5353
Context context = ApplicationProvider.getApplicationContext();
5454
Transformer transformer =
55-
new Transformer.Builder(context).setEncoderFactory(new ForceEncodeEncoderFactory()).build();
55+
new Transformer.Builder(context)
56+
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
57+
.build();
5658
new TransformerAndroidTestRunner.Builder(context, transformer)
5759
.setMaybeCalculateSsim(true)
5860
.build()
@@ -80,6 +82,7 @@ public void transformToSpecificBitrate() throws Exception {
8082
.setEncoderFactory(
8183
new ForceEncodeEncoderFactory(
8284
/* wrappedEncoderFactory= */ new DefaultEncoderFactory(
85+
context,
8386
EncoderSelector.DEFAULT,
8487
new VideoEncoderSettings.Builder().setBitrate(5_000_000).build(),
8588
/* enableFallback= */ true)))
@@ -104,7 +107,9 @@ public void transform4K60() throws Exception {
104107
}
105108

106109
Transformer transformer =
107-
new Transformer.Builder(context).setEncoderFactory(new ForceEncodeEncoderFactory()).build();
110+
new Transformer.Builder(context)
111+
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
112+
.build();
108113
new TransformerAndroidTestRunner.Builder(context, transformer)
109114
.setMaybeCalculateSsim(true)
110115
.setTimeoutSeconds(180)
@@ -125,7 +130,9 @@ public void transform8K24() throws Exception {
125130
return;
126131
}
127132
Transformer transformer =
128-
new Transformer.Builder(context).setEncoderFactory(new ForceEncodeEncoderFactory()).build();
133+
new Transformer.Builder(context)
134+
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
135+
.build();
129136
new TransformerAndroidTestRunner.Builder(context, transformer)
130137
.setMaybeCalculateSsim(true)
131138
.setTimeoutSeconds(180)
@@ -139,7 +146,7 @@ public void transformNoAudio() throws Exception {
139146
Context context = ApplicationProvider.getApplicationContext();
140147
Transformer transformer =
141148
new Transformer.Builder(context)
142-
.setEncoderFactory(new ForceEncodeEncoderFactory())
149+
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
143150
.setRemoveAudio(true)
144151
.build();
145152
new TransformerAndroidTestRunner.Builder(context, transformer)
@@ -154,7 +161,7 @@ public void transformNoVideo() throws Exception {
154161
Context context = ApplicationProvider.getApplicationContext();
155162
Transformer transformer =
156163
new Transformer.Builder(context)
157-
.setEncoderFactory(new ForceEncodeEncoderFactory())
164+
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
158165
.setRemoveVideo(true)
159166
.build();
160167
new TransformerAndroidTestRunner.Builder(context, transformer)

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/BitrateAnalysisTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ public void analyzeBitrate() throws Exception {
118118
.setEncoderFactory(
119119
new AndroidTestUtil.ForceEncodeEncoderFactory(
120120
/* wrappedEncoderFactory= */ new DefaultEncoderFactory(
121+
context,
121122
EncoderSelector.DEFAULT,
122123
new VideoEncoderSettings.Builder()
123124
.setBitrate(bitrate)

‎libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/EncoderPerformanceAnalysisTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ public void analyzeEncoderPerformance() throws Exception {
128128
.setEncoderFactory(
129129
new AndroidTestUtil.ForceEncodeEncoderFactory(
130130
/* wrappedEncoderFactory= */ new DefaultEncoderFactory(
131+
context,
131132
EncoderSelector.DEFAULT,
132133
new VideoEncoderSettings.Builder()
133134
.setEncoderPerformanceParameters(operatingRate, priority)

‎libraries/transformer/src/main/java/androidx/media3/transformer/Codec.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ public interface Codec {
4141
/** A factory for {@linkplain Codec decoder} instances. */
4242
interface DecoderFactory {
4343

44-
/** A default {@code DecoderFactory} implementation. */
45-
DecoderFactory DEFAULT = new DefaultDecoderFactory();
46-
4744
/**
4845
* Returns a {@link Codec} for audio decoding.
4946
*
@@ -72,9 +69,6 @@ Codec createForVideoDecoding(
7269
/** A factory for {@linkplain Codec encoder} instances. */
7370
interface EncoderFactory {
7471

75-
/** A default {@code EncoderFactory} implementation. */
76-
EncoderFactory DEFAULT = new DefaultEncoderFactory();
77-
7872
/**
7973
* Returns a {@link Codec} for audio encoding.
8074
*

0 commit comments

Comments
 (0)