58
58
import androidx .media3 .common .PlaybackException ;
59
59
import androidx .media3 .common .Player ;
60
60
import androidx .media3 .common .VideoFrameProcessingException ;
61
+ import androidx .media3 .common .VideoGraph ;
61
62
import androidx .media3 .common .util .ConditionVariable ;
62
63
import androidx .media3 .common .util .GlProgram ;
63
64
import androidx .media3 .common .util .GlUtil ;
64
65
import androidx .media3 .common .util .NullableType ;
65
66
import androidx .media3 .common .util .UnstableApi ;
66
67
import androidx .media3 .common .util .Util ;
68
+ import androidx .media3 .effect .DefaultGlObjectsProvider ;
69
+ import androidx .media3 .effect .DefaultVideoFrameProcessor ;
67
70
import androidx .media3 .effect .GlEffect ;
68
71
import androidx .media3 .effect .GlShaderProgram ;
69
72
import androidx .media3 .effect .MatrixTransformation ;
70
73
import androidx .media3 .effect .PassthroughShaderProgram ;
71
74
import androidx .media3 .effect .RgbMatrix ;
72
75
import androidx .media3 .effect .ScaleAndRotateTransformation ;
76
+ import androidx .media3 .effect .SingleInputVideoGraph ;
73
77
import androidx .media3 .exoplayer .DecoderCounters ;
74
78
import androidx .media3 .exoplayer .DecoderReuseEvaluation ;
75
79
import androidx .media3 .exoplayer .ExoPlaybackException ;
83
87
import androidx .media3 .exoplayer .source .DefaultMediaSourceFactory ;
84
88
import androidx .media3 .exoplayer .source .MediaSource ;
85
89
import androidx .media3 .exoplayer .video .MediaCodecVideoRenderer ;
90
+ import androidx .media3 .exoplayer .video .PlaybackVideoGraphWrapper ;
91
+ import androidx .media3 .exoplayer .video .VideoFrameReleaseControl ;
86
92
import androidx .media3 .exoplayer .video .VideoRendererEventListener ;
87
93
import androidx .media3 .extractor .DefaultExtractorsFactory ;
88
94
import com .google .common .collect .ImmutableList ;
@@ -135,6 +141,7 @@ public static final class Builder {
135
141
private SeekParameters seekParameters ;
136
142
private MediaCodecSelector mediaCodecSelector ;
137
143
private boolean extractHdrFrames ;
144
+ @ Nullable private GlObjectsProvider glObjectsProvider ;
138
145
139
146
/** Creates a new instance with default values. */
140
147
public Builder () {
@@ -196,9 +203,24 @@ public Builder setExtractHdrFrames(boolean extractHdrFrames) {
196
203
return this ;
197
204
}
198
205
206
+ /**
207
+ * Sets the {@link GlObjectsProvider} to be used by the effect processing pipeline.
208
+ *
209
+ * <p>By default, a {@link DefaultGlObjectsProvider} is used.
210
+ *
211
+ * @param glObjectsProvider The {@link GlObjectsProvider}.
212
+ * @return This builder.
213
+ */
214
+ @ CanIgnoreReturnValue
215
+ public Builder setGlObjectsProvider (GlObjectsProvider glObjectsProvider ) {
216
+ this .glObjectsProvider = glObjectsProvider ;
217
+ return this ;
218
+ }
219
+
199
220
/** Builds a new {@link Configuration} instance. */
200
221
public Configuration build () {
201
- return new Configuration (seekParameters , mediaCodecSelector , extractHdrFrames );
222
+ return new Configuration (
223
+ seekParameters , mediaCodecSelector , extractHdrFrames , glObjectsProvider );
202
224
}
203
225
}
204
226
@@ -211,13 +233,18 @@ public Configuration build() {
211
233
/** Whether extracting HDR frames is requested. */
212
234
public final boolean extractHdrFrames ;
213
235
236
+ /** The {@link GlObjectsProvider}. */
237
+ @ Nullable public final GlObjectsProvider glObjectsProvider ;
238
+
214
239
private Configuration (
215
240
SeekParameters seekParameters ,
216
241
MediaCodecSelector mediaCodecSelector ,
217
- boolean extractHdrFrames ) {
242
+ boolean extractHdrFrames ,
243
+ @ Nullable GlObjectsProvider glObjectsProvider ) {
218
244
this .seekParameters = seekParameters ;
219
245
this .mediaCodecSelector = mediaCodecSelector ;
220
246
this .extractHdrFrames = extractHdrFrames ;
247
+ this .glObjectsProvider = glObjectsProvider ;
221
248
}
222
249
}
223
250
@@ -294,7 +321,8 @@ public ExperimentalFrameExtractor(Context context, Configuration configuration)
294
321
context ,
295
322
configuration .mediaCodecSelector ,
296
323
videoRendererEventListener ,
297
- /* toneMapHdrToSdr= */ !configuration .extractHdrFrames )
324
+ /* toneMapHdrToSdr= */ !configuration .extractHdrFrames ,
325
+ configuration .glObjectsProvider )
298
326
},
299
327
mediaSourceFactory )
300
328
.setSeekParameters (configuration .seekParameters )
@@ -650,6 +678,7 @@ private void ensureConfigured(GlObjectsProvider glObjectsProvider, int width, in
650
678
/** A custom MediaCodecVideoRenderer that renders only one frame per position reset. */
651
679
private final class FrameExtractorRenderer extends MediaCodecVideoRenderer {
652
680
private final boolean toneMapHdrToSdr ;
681
+ @ Nullable private final GlObjectsProvider glObjectsProvider ;
653
682
654
683
private boolean frameRenderedSinceLastPositionReset ;
655
684
private List <Effect > effectsFromPlayer ;
@@ -659,7 +688,8 @@ public FrameExtractorRenderer(
659
688
Context context ,
660
689
MediaCodecSelector mediaCodecSelector ,
661
690
VideoRendererEventListener videoRendererEventListener ,
662
- boolean toneMapHdrToSdr ) {
691
+ boolean toneMapHdrToSdr ,
692
+ @ Nullable GlObjectsProvider glObjectsProvider ) {
663
693
super (
664
694
new Builder (context )
665
695
.setMediaCodecSelector (mediaCodecSelector )
@@ -668,9 +698,27 @@ public FrameExtractorRenderer(
668
698
.setEventListener (videoRendererEventListener )
669
699
.setMaxDroppedFramesToNotify (0 ));
670
700
this .toneMapHdrToSdr = toneMapHdrToSdr ;
701
+ this .glObjectsProvider = glObjectsProvider ;
671
702
effectsFromPlayer = ImmutableList .of ();
672
703
}
673
704
705
+ @ Override
706
+ protected PlaybackVideoGraphWrapper createPlaybackVideoGraphWrapper (
707
+ Context context , VideoFrameReleaseControl videoFrameReleaseControl ) {
708
+ if (glObjectsProvider == null ) {
709
+ return super .createPlaybackVideoGraphWrapper (context , videoFrameReleaseControl );
710
+ }
711
+ DefaultVideoFrameProcessor .Factory .Builder videoFrameProcessorFactoryBuilder =
712
+ new DefaultVideoFrameProcessor .Factory .Builder ().setGlObjectsProvider (glObjectsProvider );
713
+ VideoGraph .Factory videoGraphFactory =
714
+ new SingleInputVideoGraph .Factory (videoFrameProcessorFactoryBuilder .build ());
715
+ return new PlaybackVideoGraphWrapper .Builder (context , videoFrameReleaseControl )
716
+ .setEnablePlaylistMode (true )
717
+ .setClock (getClock ())
718
+ .setVideoGraphFactory (videoGraphFactory )
719
+ .build ();
720
+ }
721
+
674
722
@ Override
675
723
protected void onStreamChanged (
676
724
Format [] formats ,
0 commit comments