这是indexloc提供的服务,不要输入任何密码
Skip to content

How to use float[] values in shaders with BaseGlShaderProgram #2889

@omkarquest

Description

@omkarquest

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

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions