-
Notifications
You must be signed in to change notification settings - Fork 667
Open
Description
How to use float[] values in shaders with BaseGlShaderProgram
If we use
glProgram.setFloatsUniform("wave", waveArray);
The app crashes with the error
playerFailed [eventTime=3.01, mediaPos=0.00, window=0, period=0, errorCode=ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED (Ask Gemini)
androidx.media3.exoplayer.ExoPlaybackException: MediaCodecVideoRenderer error, index=1, format=Format(1, null, video/mp4, video/avc, avc1.64001F, 1337884, en, [1280, 720, 29.97003, ColorInfo(Unset color space, Unset color range, Unset color transfer, false, 8bit Luma, 8bit Chroma)], [-1, -1]), format_supported=YES
at androidx.media3.exoplayer.BaseRenderer.createRendererException(BaseRenderer.java:558)
at androidx.media3.exoplayer.BaseRenderer.createRendererException(BaseRenderer.java:527)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.access$1600(MediaCodecVideoRenderer.java:132)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer$1.onError(MediaCodecVideoRenderer.java:933)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink.lambda$onError$1$androidx-media3-exoplayer-video-PlaybackVideoGraphWrapper$InputVideoSink(PlaybackVideoGraphWrapper.java:1136)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:31)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink.onError(PlaybackVideoGraphWrapper.java:1134)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper.onError(PlaybackVideoGraphWrapper.java:553)
at androidx.media3.effect.SingleInputVideoGraph$1.lambda$onError$3$androidx-media3-effect-SingleInputVideoGraph$1(SingleInputVideoGraph.java:181)
at androidx.media3.effect.SingleInputVideoGraph$1$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: androidx.media3.exoplayer.video.VideoSink$VideoSinkException: androidx.media3.common.VideoFrameProcessingException: @UNSET
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink.lambda$onError$1$androidx-media3-exoplayer-video-PlaybackVideoGraphWrapper$InputVideoSink(PlaybackVideoGraphWrapper.java:1138)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:31)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper$InputVideoSink.onError(PlaybackVideoGraphWrapper.java:1134)
at androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper.onError(PlaybackVideoGraphWrapper.java:553)
at androidx.media3.effect.SingleInputVideoGraph$1.lambda$onError$3$androidx-media3-effect-SingleInputVideoGraph$1(SingleInputVideoGraph.java:181)
at androidx.media3.effect.SingleInputVideoGraph$1$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: androidx.media3.common.VideoFrameProcessingException: @UNSET
at androidx.media3.effect.VideoFrameProcessingTaskExecutor.handleException(VideoFrameProcessingTaskExecutor.java:306)
at androidx.media3.effect.VideoFrameProcessingTaskExecutor.lambda$wrapTaskAndSubmitToExecutorService$3$androidx-media3-effect-VideoFrameProcessingTaskExecutor(VideoFrameProcessingTaskExecutor.java:292)
at androidx.media3.effect.VideoFrameProcessingTaskExecutor$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:524)
at java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:904)
at androidx.media3.common.util.GlProgram.setFloatsUniform(GlProgram.java:227)
at androidx.media3.demo.composition.effect.WaveDistortionShaderProgram.drawFrame(WaveDistortionShaderProgram.java:106)
at androidx.media3.effect.BaseGlShaderProgram.queueInputFrame(BaseGlShaderProgram.java:163)
at androidx.media3.effect.FrameConsumptionManager.lambda$queueInputFrame$1$androidx-media3-effect-FrameConsumptionManager(FrameConsumptionManager.java:93)
2025-11-12 09:50:04.907 20275-20275 CompositionPlayer-0 androidx.media3.demo.composition E at androidx.media3.effect.FrameConsumptionManager$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) (Ask Gemini)
at androidx.media3.effect.VideoFrameProcessingTaskExecutor.lambda$wrapTaskAndSubmitToExecutorService$3$androidx-media3-effect-VideoFrameProcessingTaskExecutor(VideoFrameProcessingTaskExecutor.java:290)
specially this part
Caused by: java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:904)
at androidx.media3.common.util.GlProgram.setFloatsUniform(GlProgram.java:227)
at androidx.media3.demo.composition.effect.WaveDistortionShaderProgram.drawFrame(WaveDistortionShaderProgram.java:106)
how ever instead of this when we use
if (programHandle > 0) { int waveLoc = GLES20.glGetUniformLocation(programHandle, "wave"); if (waveLoc >= 0) { GLES20.glUniform1fv(waveLoc, wave.length, wave, 0); } }
the code works fine
This seems to be a hack to use the code
There can be an easier solution
in GlProgram
| private final int programId; |
the programId can be made public and we can use it easily
or there seems to be a problem with
| public void setFloatsUniform(String name, float[] value) { |
and
| public void setFloatsUniformIfPresent(String name, float[] value) { |
You can easily try the code with composition demo