mirror of
https://github.com/samsonjs/media.git
synced 2026-04-22 14:05:55 +00:00
Create queue of sync objects in FinalShaderProgramWrapper
PiperOrigin-RevId: 544683524
This commit is contained in:
parent
e8fdd83558
commit
d14122b029
3 changed files with 9 additions and 10 deletions
|
|
@ -85,6 +85,8 @@ public final class GlUtil {
|
|||
EGL14.EGL_NONE
|
||||
};
|
||||
|
||||
// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glFenceSync.xhtml
|
||||
private static final long GL_FENCE_SYNC_FAILED = 0;
|
||||
// https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_protected_content.txt
|
||||
private static final String EXTENSION_PROTECTED_CONTENT = "EGL_EXT_protected_content";
|
||||
// https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_surfaceless_context.txt
|
||||
|
|
@ -410,7 +412,7 @@ public final class GlUtil {
|
|||
* CPU, and only affects the current OpenGL context. Otherwise, this will block the CPU.
|
||||
*/
|
||||
public static void awaitSyncObject(long syncObject) throws GlException {
|
||||
if (syncObject == 0) {
|
||||
if (syncObject == GL_FENCE_SYNC_FAILED) {
|
||||
// Fallback to using glFinish for synchronization when fence creation failed.
|
||||
GLES20.glFinish();
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ import android.opengl.EGLDisplay;
|
|||
import android.opengl.EGLExt;
|
||||
import android.opengl.EGLSurface;
|
||||
import android.opengl.GLES20;
|
||||
import android.opengl.GLES30;
|
||||
import android.util.Pair;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceHolder;
|
||||
|
|
@ -94,6 +93,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
private final Queue<Pair<GlTextureInfo, Long>> availableFrames;
|
||||
private final TexturePool outputTexturePool;
|
||||
private final Queue<Long> outputTextureTimestamps; // Synchronized with outputTexturePool.
|
||||
private final Queue<Long> syncObjects;
|
||||
@Nullable private final DefaultVideoFrameProcessor.TextureOutputListener textureOutputListener;
|
||||
|
||||
private int inputWidth;
|
||||
|
|
@ -107,7 +107,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
@Nullable private SurfaceView debugSurfaceView;
|
||||
@Nullable private OnInputStreamProcessedListener onInputStreamProcessedListener;
|
||||
private boolean matrixTransformationsChanged;
|
||||
private long syncObject;
|
||||
|
||||
@GuardedBy("this")
|
||||
private boolean outputSurfaceInfoChanged;
|
||||
|
|
@ -154,6 +153,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
boolean useHighPrecisionColorComponents = ColorInfo.isTransferHdr(outputColorInfo);
|
||||
outputTexturePool = new TexturePool(useHighPrecisionColorComponents, textureOutputCapacity);
|
||||
outputTextureTimestamps = new ArrayDeque<>(textureOutputCapacity);
|
||||
syncObjects = new ArrayDeque<>(textureOutputCapacity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -238,11 +238,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
videoFrameProcessingTaskExecutor.submit(() -> releaseOutputFrameInternal(presentationTimeUs));
|
||||
}
|
||||
|
||||
private void releaseOutputFrameInternal(long presentationTimeUs) {
|
||||
private void releaseOutputFrameInternal(long presentationTimeUs) throws GlUtil.GlException {
|
||||
while (outputTexturePool.freeTextureCount() < outputTexturePool.capacity()
|
||||
&& checkNotNull(outputTextureTimestamps.peek()) <= presentationTimeUs) {
|
||||
outputTexturePool.freeTexture();
|
||||
outputTextureTimestamps.remove();
|
||||
GlUtil.deleteSyncObject(syncObjects.remove());
|
||||
maybeOnReadyToAcceptInputFrame();
|
||||
}
|
||||
}
|
||||
|
|
@ -266,7 +267,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
try {
|
||||
outputTexturePool.deleteAllTextures();
|
||||
GlUtil.destroyEglSurface(eglDisplay, outputEglSurface);
|
||||
GLES30.glDeleteSync(syncObject);
|
||||
GlUtil.checkGlError();
|
||||
} catch (GlUtil.GlException e) {
|
||||
throw new VideoFrameProcessingException(e);
|
||||
|
|
@ -385,7 +385,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||
outputTexture.getFboId(), outputTexture.getWidth(), outputTexture.getHeight());
|
||||
GlUtil.clearFocusedBuffers();
|
||||
checkNotNull(defaultShaderProgram).drawFrame(inputTexture.getTexId(), presentationTimeUs);
|
||||
syncObject = GlUtil.createGlSyncFence();
|
||||
long syncObject = GlUtil.createGlSyncFence();
|
||||
syncObjects.add(syncObject);
|
||||
checkNotNull(textureOutputListener)
|
||||
.onTextureRendered(outputTexture, presentationTimeUs, this::releaseOutputFrame, syncObject);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,10 +66,6 @@ import org.junit.runner.RunWith;
|
|||
// TODO(b/263395272): Move this test to effects/mh tests, and remove @TestOnly dependencies.
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
||||
|
||||
// Documentation reference:
|
||||
// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glFenceSync.xhtml
|
||||
private static final long GL_FENCE_SYNC_FAILED = 0;
|
||||
private static final String ORIGINAL_PNG_ASSET_PATH =
|
||||
"media/bitmap/sample_mp4_first_frame/electrical_colors/original.png";
|
||||
private static final String BITMAP_OVERLAY_PNG_ASSET_PATH =
|
||||
|
|
|
|||
Loading…
Reference in a new issue