Fix rotation issue

pull/360/head
Mattia Iavarone 6 years ago
parent f7cf379966
commit f6759f6b9e
  1. 45
      cameraview/src/main/gles/com/otaliastudios/cameraview/VideoTextureEncoder.java

@ -329,49 +329,22 @@ class VideoTextureEncoder implements Runnable {
// We must scale this matrix like GLCameraPreview does, because it might have some cropping. // We must scale this matrix like GLCameraPreview does, because it might have some cropping.
// Scaling takes place with respect to the (0, 0, 0) point, so we must apply a Translation to compensate. // Scaling takes place with respect to the (0, 0, 0) point, so we must apply a Translation to compensate.
// We also must rotate this matrix. In GLCameraPreview it is not needed because it is a live
// stream, but the output video, must be correctly rotated based on the device rotation at the moment.
// Rotation also takes place with respect to the origin (the Z axis), so we must apply another Translation to compensate.
// The order of operations must be translate, rotate & scale.
float scaleX = encoder.mTransformationScaleX; float scaleX = encoder.mTransformationScaleX;
float scaleY = encoder.mTransformationScaleY; float scaleY = encoder.mTransformationScaleY;
int rotation = encoder.mTransformationRotation;
float W = scaleX;
float H = scaleY;
float scaleTranslX = (1F - scaleX) / 2F; float scaleTranslX = (1F - scaleX) / 2F;
float scaleTranslY = (1F - scaleY) / 2F; float scaleTranslY = (1F - scaleY) / 2F;
float rotationTranslX = 0F;
float rotationTranslY = 0F;
boolean flip = false;// rotation % 180 != 0;
Log.e("VideoTextureEncoder", "Rotation is " + rotation);
if (rotation == 90) {
rotationTranslX = W / 2F;
rotationTranslY = W / 2F;
} else if (rotation == 180) {
rotationTranslX = W / 2F;
rotationTranslY = H / 2F;
} else if (rotation == 270) {
rotationTranslX = H / 2F;
rotationTranslY = H / 2F;
Log.e("VideoTextureEncoder", "Rotation translY is" + rotationTranslY + ", h is " + H);
}
// Matrix.translateM(transform, 0, 0, 0, 0); // vedo il lato destro e alto
// Matrix.translateM(transform, 0, 0, 0.5F, 0); // same
// Matrix.translateM(transform, 0, 0, -0.5F, 0); // peggio
// Matrix.translateM(transform, 0, 0.5F, 0, 0); // peggio: vedo il pixel in alto a dx
// Matrix.translateM(transform, 0, -0.5F, 0, 0); // ho aggiustato la VERTICALE
// Matrix.translateM(transform, 0, -0.5F, -1, 0); // no changes
// Matrix.translateM(transform, 0, -0.5F, 1, 0); // ci siamo quasi
Matrix.translateM(transform, 0, -0.5F, 1.75F, 0); // ottimo! ma è scalato male!!
Matrix.rotateM(transform, 0, rotation, 0, 0, 1);
Matrix.translateM(transform, 0, rotationTranslX, rotationTranslY, 0);
Matrix.translateM(transform, 0, scaleTranslX, scaleTranslY, 0); Matrix.translateM(transform, 0, scaleTranslX, scaleTranslY, 0);
Matrix.scaleM(transform, 0, scaleX, scaleY, 1); Matrix.scaleM(transform, 0, scaleX, scaleY, 1);
// We also must rotate this matrix. In GLCameraPreview it is not needed because it is a live
// stream, but the output video, must be correctly rotated based on the device rotation at the moment.
// 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, encoder.mTransformationRotation, 0, 0, 1);
Matrix.translateM(transform, 0, -0.5F, -0.5F, 0);
encoder.mVideoEncoder.drainEncoder(false); encoder.mVideoEncoder.drainEncoder(false);
encoder.mFullScreen.drawFrame(encoder.mTextureId, transform); encoder.mFullScreen.drawFrame(encoder.mTextureId, transform);
encoder.mInputWindowSurface.setPresentationTime(timestamp); encoder.mInputWindowSurface.setPresentationTime(timestamp);

Loading…
Cancel
Save