Small improvements

pull/559/head
Mattia Iavarone 6 years ago
parent 802b6915a8
commit 29ee5cc0fe
  1. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java
  2. 20
      cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java
  3. 18
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java
  4. 9
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/RendererFrameCallback.java
  5. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java
  6. 21
      cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/TextureMediaEncoder.java

@ -67,6 +67,8 @@ public class EglViewport {
} }
public void setFilter(@NonNull Filter filter) { public void setFilter(@NonNull Filter filter) {
// TODO see if this is needed. If setFilter is always called from the correct GL thread,
// we don't need to wait for a new draw call (which might not even happen).
mPendingFilter = filter; mPendingFilter = filter;
} }

@ -95,6 +95,12 @@ public class SnapshotGlPictureRecorder extends PictureRecorder {
SnapshotGlPictureRecorder.this.onRendererTextureCreated(textureId); SnapshotGlPictureRecorder.this.onRendererTextureCreated(textureId);
} }
@RendererThread
@Override
public void onRendererFilterChanged(@NonNull Filter filter) {
SnapshotGlPictureRecorder.this.onRendererFilterChanged(filter);
}
@RendererThread @RendererThread
@Override @Override
public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY) { public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY) {
@ -102,10 +108,6 @@ public class SnapshotGlPictureRecorder extends PictureRecorder {
SnapshotGlPictureRecorder.this.onRendererFrame(surfaceTexture, scaleX, scaleY); SnapshotGlPictureRecorder.this.onRendererFrame(surfaceTexture, scaleX, scaleY);
} }
@Override
public void onFilterChanged(@NonNull Filter filter) {
mViewport.setFilter(filter.copy());
}
}); });
} }
@ -125,6 +127,12 @@ public class SnapshotGlPictureRecorder extends PictureRecorder {
} }
} }
@RendererThread
@TargetApi(Build.VERSION_CODES.KITKAT)
private void onRendererFilterChanged(@NonNull Filter filter) {
mViewport.setFilter(filter.copy());
}
/** /**
* The tricky part here is the EGL surface creation. * The tricky part here is the EGL surface creation.
* *
@ -150,7 +158,9 @@ public class SnapshotGlPictureRecorder extends PictureRecorder {
*/ */
@RendererThread @RendererThread
@TargetApi(Build.VERSION_CODES.KITKAT) @TargetApi(Build.VERSION_CODES.KITKAT)
private void onRendererFrame(final @NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY) { private void onRendererFrame(@SuppressWarnings("unused") @NonNull SurfaceTexture surfaceTexture,
final float scaleX,
final float scaleY) {
// Get egl context from the RendererThread, which is the one in which we have created // Get egl context from the RendererThread, which is the one in which we have created
// the textureId and the overlayTextureId, managed by the GlSurfaceView. // the textureId and the overlayTextureId, managed by the GlSurfaceView.
// Next operations can then be performed on different threads using this handle. // Next operations can then be performed on different threads using this handle.

@ -141,7 +141,9 @@ public class GlCameraPreview extends FilterCameraPreview<GLSurfaceView, SurfaceT
@RendererThread @RendererThread
@Override @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) { public void onSurfaceCreated(GL10 gl, EGLConfig config) {
if (mCurrentFilter == null) mCurrentFilter = new NoFilter(); if (mCurrentFilter == null) {
mCurrentFilter = new NoFilter();
}
mOutputViewport = new EglViewport(mCurrentFilter); mOutputViewport = new EglViewport(mCurrentFilter);
mOutputTextureId = mOutputViewport.createTexture(); mOutputTextureId = mOutputViewport.createTexture();
mInputSurfaceTexture = new SurfaceTexture(mOutputTextureId); mInputSurfaceTexture = new SurfaceTexture(mOutputTextureId);
@ -282,7 +284,7 @@ public class GlCameraPreview extends FilterCameraPreview<GLSurfaceView, SurfaceT
public void run() { public void run() {
mRendererFrameCallbacks.add(callback); mRendererFrameCallbacks.add(callback);
if (mOutputTextureId != 0) callback.onRendererTextureCreated(mOutputTextureId); if (mOutputTextureId != 0) callback.onRendererTextureCreated(mOutputTextureId);
callback.onFilterChanged(mCurrentFilter); callback.onRendererFilterChanged(mCurrentFilter);
} }
}); });
} }
@ -325,11 +327,15 @@ public class GlCameraPreview extends FilterCameraPreview<GLSurfaceView, SurfaceT
} }
@Override @Override
public void setFilter(@NonNull Filter filter) { public void setFilter(final @NonNull Filter filter) {
mCurrentFilter = filter;
if (hasSurface()) { if (hasSurface()) {
filter.setSize(mOutputSurfaceWidth, mOutputSurfaceHeight); filter.setSize(mOutputSurfaceWidth, mOutputSurfaceHeight);
} }
mCurrentFilter = filter;
getView().queueEvent(new Runnable() {
@Override
public void run() {
if (mOutputViewport != null) { if (mOutputViewport != null) {
mOutputViewport.setFilter(filter); mOutputViewport.setFilter(filter);
} }
@ -337,8 +343,10 @@ public class GlCameraPreview extends FilterCameraPreview<GLSurfaceView, SurfaceT
// Need to synchronize when iterating the Collections.synchronizedSet // Need to synchronize when iterating the Collections.synchronizedSet
synchronized (mRendererFrameCallbacks) { synchronized (mRendererFrameCallbacks) {
for (RendererFrameCallback callback : mRendererFrameCallbacks) { for (RendererFrameCallback callback : mRendererFrameCallbacks) {
callback.onFilterChanged(filter); callback.onRendererFilterChanged(filter);
} }
} }
} }
});
}
} }

@ -33,10 +33,11 @@ public interface RendererFrameCallback {
void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, float scaleX, float scaleY); void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, float scaleX, float scaleY);
/** /**
* Called on the change of shader filter * Called when the renderer filter changes. This is guaranteed to be called at least once
* We should update the EglViewPort once you receives this event * before the first {@link #onRendererFrame(SurfaceTexture, float, float)}.
* *
* @param filter the new filter applied * @param filter the new filter
*/ */
void onFilterChanged(@NonNull Filter filter); @RendererThread
void onRendererFilterChanged(@NonNull Filter filter);
} }

@ -104,7 +104,7 @@ public class SnapshotVideoRecorder extends VideoRecorder implements RendererFram
} }
@Override @Override
public void onFilterChanged(@NonNull Filter filter) { public void onRendererFilterChanged(@NonNull Filter filter) {
mCurrentFilter = filter.copy(); mCurrentFilter = filter.copy();
if (mEncoderEngine != null) { if (mEncoderEngine != null) {
mCurrentFilter.setSize(mResult.size.getWidth(), mResult.size.getHeight()); mCurrentFilter.setSize(mResult.size.getWidth(), mResult.size.getHeight());

@ -134,15 +134,23 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureConfig> {
@EncoderThread @EncoderThread
@Override @Override
protected void onEvent(@NonNull String event, @Nullable Object data) { protected void onEvent(@NonNull String event, @Nullable Object data) {
switch (event) {
case FILTER_EVENT:
//noinspection ConstantConditions
onFilter((Filter) data);
break;
case FRAME_EVENT:
//noinspection ConstantConditions
onFrame((Frame) data);
break;
}
}
if (event.equals(FILTER_EVENT)) { private void onFilter(@NonNull Filter filter) {
Filter filter = (Filter) data;
mViewport.setFilter(filter); mViewport.setFilter(filter);
} else if (event.equals(FRAME_EVENT)) {
Frame frame = (Frame) data;
if (frame == null) {
throw new IllegalArgumentException("Got null frame for FRAME_EVENT.");
} }
private void onFrame(@NonNull Frame frame) {
if (!shouldRenderFrame(frame.timestampUs())) { if (!shouldRenderFrame(frame.timestampUs())) {
mFramePool.recycle(frame); mFramePool.recycle(frame);
return; return;
@ -213,7 +221,6 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureConfig> {
mWindow.swapBuffers(); mWindow.swapBuffers();
mFramePool.recycle(frame); mFramePool.recycle(frame);
} }
}
@Override @Override
protected void onStopped() { protected void onStopped() {

Loading…
Cancel
Save