Simplify encoders Config

pull/506/head
Mattia Iavarone 6 years ago
parent 1d8b8d0ea2
commit 0ee63bebfb
  1. 31
      cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java
  2. 26
      cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/AudioMediaEncoder.java
  3. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/MediaEncoder.java
  4. 56
      cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/TextureMediaEncoder.java
  5. 30
      cameraview/src/main/java/com/otaliastudios/cameraview/video/encoding/VideoMediaEncoder.java

@ -118,22 +118,29 @@ public class SnapshotVideoRecorder extends VideoRecorder implements RendererFram
case DEVICE_DEFAULT: type = "video/avc"; break;
}
LOG.w("Creating frame encoder. Rotation:", mResult.rotation);
TextureMediaEncoder.Config config = new TextureMediaEncoder.Config(width, height,
mResult.videoBitRate,
mResult.videoFrameRate,
mResult.rotation,
type, mTextureId,
scaleX, scaleY,
EGL14.eglGetCurrentContext(),
mHasOverlay ? mOverlayTextureId : TextureMediaEncoder.NO_TEXTURE,
mOverlayRotation
);
TextureMediaEncoder videoEncoder = new TextureMediaEncoder(config);
TextureMediaEncoder.Config videoConfig = new TextureMediaEncoder.Config();
videoConfig.width = width;
videoConfig.height = height;
videoConfig.bitRate = mResult.videoBitRate;
videoConfig.frameRate = mResult.videoFrameRate;
videoConfig.rotation = mResult.rotation;
videoConfig.mimeType = type;
videoConfig.textureId = mTextureId;
videoConfig.scaleX = scaleX;
videoConfig.scaleY = scaleY;
videoConfig.eglContext = EGL14.eglGetCurrentContext();
if (mHasOverlay) {
videoConfig.overlayTextureId = mOverlayTextureId;
videoConfig.overlayRotation = mOverlayRotation;
}
TextureMediaEncoder videoEncoder = new TextureMediaEncoder(videoConfig);
// Audio
AudioMediaEncoder audioEncoder = null;
if (mResult.audio == Audio.ON) {
audioEncoder = new AudioMediaEncoder(new AudioMediaEncoder.Config(mResult.audioBitRate));
AudioMediaEncoder.Config audioConfig = new AudioMediaEncoder.Config();
audioConfig.bitRate = mResult.audioBitRate;
audioEncoder = new AudioMediaEncoder(audioConfig);
}
// Engine

@ -73,15 +73,19 @@ public class AudioMediaEncoder extends MediaEncoder {
private Config mConfig;
public static class Config {
int bitRate;
public Config(int bitRate) {
this.bitRate = bitRate;
public int bitRate;
@NonNull
private Config copy() {
Config config = new Config();
config.bitRate = this.bitRate;
return config;
}
}
public AudioMediaEncoder(@NonNull Config config) {
super("AudioEncoder");
mConfig = config;
mConfig = config.copy();
}
@EncoderThread
@ -111,10 +115,6 @@ public class AudioMediaEncoder extends MediaEncoder {
mRecorder.start();
}
@EncoderThread
@Override
void onEvent(@NonNull String event, @Nullable Object data) { }
@EncoderThread
@Override
void onStop() {
@ -138,7 +138,7 @@ public class AudioMediaEncoder extends MediaEncoder {
return mConfig.bitRate;
}
class AudioRecordingThread extends Thread {
private class AudioRecordingThread extends Thread {
private AudioRecord mAudioRecord;
private ByteBuffer mCurrentBuffer;
@ -287,9 +287,11 @@ public class AudioMediaEncoder extends MediaEncoder {
}
void sendInputBuffer(ByteBuffer buffer, long presentationTimeUs, boolean endOfStream) {
int presentation1 = (int) (presentationTimeUs >> 32);
int presentation2 = (int) (presentationTimeUs);
sendMessage(obtainMessage(endOfStream ? 1 : 0, presentation1, presentation2, buffer));
sendMessage(obtainMessage(
endOfStream ? 1 : 0,
(int) (presentationTimeUs >> 32),
(int) (presentationTimeUs),
buffer));
}
@Override

@ -256,7 +256,7 @@ abstract class MediaEncoder {
* @param data object
*/
@EncoderThread
abstract void onEvent(@NonNull String event, @Nullable Object data);
void onEvent(@NonNull String event, @Nullable Object data) {};
/**
* Stop recording. This involves signaling the end of stream and draining

@ -24,37 +24,31 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.C
private static final CameraLogger LOG = CameraLogger.create(TAG);
public final static String FRAME_EVENT = "frame";
public final static int NO_TEXTURE = Integer.MIN_VALUE;
private final static int NO_TEXTURE = Integer.MIN_VALUE;
public static class Config extends VideoMediaEncoder.Config {
int textureId;
int overlayTextureId;
float scaleX;
float scaleY;
EGLContext eglContext;
int transformRotation;
int overlayTransformRotation;
public Config(int width, int height,
int bitRate, int frameRate,
int rotation, @NonNull String mimeType,
int textureId,
float scaleX, float scaleY,
@NonNull EGLContext eglContext,
int overlayTextureId, int overlayRotation) {
// We rotate the texture using transformRotation. Pass rotation=0 to super so that
// no rotation metadata is written into the output file.
super(width, height, bitRate, frameRate, 0, mimeType);
this.transformRotation = rotation;
this.textureId = textureId;
this.scaleX = scaleX;
this.scaleY = scaleY;
this.eglContext = eglContext;
this.overlayTextureId = overlayTextureId;
this.overlayTransformRotation = overlayRotation;
public int textureId = NO_TEXTURE;
public int overlayTextureId = NO_TEXTURE;
public int overlayRotation;
public float scaleX;
public float scaleY;
public EGLContext eglContext;
@NonNull
private Config copy() {
Config copy = new Config();
copy(copy);
copy.textureId = this.textureId;
copy.overlayTextureId = this.overlayTextureId;
copy.overlayRotation = this.overlayRotation;
copy.scaleX = this.scaleX;
copy.scaleY = this.scaleY;
copy.eglContext = this.eglContext;
return copy;
}
}
private int mTransformRotation;
private EglCore mEglCore;
private EglWindowSurface mWindow;
private EglViewport mViewport;
@ -66,7 +60,7 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.C
});
public TextureMediaEncoder(@NonNull Config config) {
super(config);
super(config.copy());
}
public static class TextureFrame {
@ -92,6 +86,10 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.C
@EncoderThread
@Override
void onPrepare(@NonNull MediaEncoderEngine.Controller controller, long maxLengthMillis) {
// We rotate the texture using transformRotation. Pass rotation=0 to super so that
// no rotation metadata is written into the output file.
mTransformRotation = mConfig.rotation;
mConfig.rotation = 0;
super.onPrepare(controller, maxLengthMillis);
mEglCore = new EglCore(mConfig.eglContext, EglCore.FLAG_RECORDABLE);
mWindow = new EglWindowSurface(mEglCore, mSurface, true);
@ -132,13 +130,13 @@ public class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.C
// Rotation also takes place with respect to the origin (the Z axis), so we must
// translate to origin, rotate, then back to where we were.
Matrix.translateM(transform, 0, 0.5F, 0.5F, 0);
Matrix.rotateM(transform, 0, mConfig.transformRotation, 0, 0, 1);
Matrix.rotateM(transform, 0, mTransformRotation, 0, 0, 1);
Matrix.translateM(transform, 0, -0.5F, -0.5F, 0);
boolean hasOverlay = mConfig.overlayTextureId != NO_TEXTURE;
if (hasOverlay) {
Matrix.translateM(overlayTransform, 0, 0.5F, 0.5F, 0);
Matrix.rotateM(overlayTransform, 0, mConfig.overlayTransformRotation, 0, 0, 1);
Matrix.rotateM(overlayTransform, 0, mConfig.overlayRotation, 0, 0, 1);
Matrix.translateM(overlayTransform, 0, -0.5F, -0.5F, 0);
}

@ -43,21 +43,21 @@ abstract class VideoMediaEncoder<C extends VideoMediaEncoder.Config> extends Med
@SuppressWarnings("WeakerAccess")
protected int mFrameNum = -1;
static class Config {
int width;
int height;
int bitRate;
int frameRate;
int rotation;
String mimeType;
Config(int width, int height, int bitRate, int frameRate, int rotation, @NonNull String mimeType) {
this.width = width;
this.height = height;
this.bitRate = bitRate;
this.frameRate = frameRate;
this.rotation = rotation;
this.mimeType = mimeType;
protected static class Config {
public int width;
public int height;
public int bitRate;
public int frameRate;
public int rotation;
public String mimeType;
protected <C extends Config> void copy(@NonNull C output) {
output.width = this.width;
output.height = this.height;
output.bitRate = this.bitRate;
output.frameRate = this.frameRate;
output.rotation = this.rotation;
output.mimeType = this.mimeType;
}
}

Loading…
Cancel
Save