androidx / androidx/media

How to use float[] values in shaders with BaseGlShaderProgram

Open
#2,889 1 comment 0 reactions 1 assignee View on GitHub

@droid-girl is already working on this.

Since Nov 12, 2025.

bug editing question
Dominant language
Java
Stars
3k
Forks
955
Avg merge
12d 14h
Merged PRs (30d)
2

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 https://github.com/androidx/media/blob/bfe5930f7f29c6492d60e3d01a90abd3c138b615/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java#L44

the programId can be made public and we can use it easily

or there seems to be a problem with

https://github.com/androidx/media/blob/bfe5930f7f29c6492d60e3d01a90abd3c138b615/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java#L223

and

https://github.com/androidx/media/blob/bfe5930f7f29c6492d60e3d01a90abd3c138b615/libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java#L228

You can easily try the code with composition demo

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.