From 7a557ac8fd273373970443c2bf128a7830d4704f Mon Sep 17 00:00:00 2001 From: liuguijing <1440265357@qq.com> Date: Mon, 21 Apr 2025 17:31:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9F=AD=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E6=91=84=E5=83=8F=E5=A4=B4=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/cpp/PhoneDevice.cpp | 10 +---- .../mpapp/v2/Camera2VideoActivity.java | 1 + .../camerarecorder/GPUCameraRecorder.java | 7 +++- .../GPUCameraRecorderBuilder.java | 42 +++++++++++++++---- .../xypower/gpuv/egl/GlPreviewRenderer.java | 9 ++-- 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e3eddaaf..84b7bd81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,8 +65,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } externalNativeBuild { cmake { diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 6b31a8f7..e75f78ab 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -2498,15 +2498,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } //为修复宁夏短视频拍照翻转的bug 临时修改方法 -// int orientation = mPhotoInfo.orientation == 0 ? -1 : (mPhotoInfo.orientation - 1) * 90; - int orientation = -1; - if (mPhotoInfo.cameraId == 0) { - orientation = -1; - } else if (mPhotoInfo.cameraId == 1) { - orientation = 0; - } else if (mPhotoInfo.cameraId == 2) { - orientation =-3; - } + int orientation = mPhotoInfo.orientation == 0 ? -1 : (mPhotoInfo.orientation - 1); jboolean photoOrVideo = mPhotoInfo.mediaType == 0 ? JNI_TRUE : JNI_FALSE; env->CallVoidMethod(m_javaService, mStartRecordingMid, photoOrVideo, mPhotoInfo.cameraId, (uint64_t)mPhotoInfo.photoId, mPhotoInfo.duration, mPhotoInfo.width, mPhotoInfo.height, mPhotoInfo.duration, orientation, diff --git a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java index 8a071eff..681dff3d 100644 --- a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java +++ b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java @@ -812,6 +812,7 @@ public class Camera2VideoActivity extends AppCompatActivity { .cameraId(Integer.toString(mCameraId)) .mute(true) .duration(mDuration * 1000) + .rotation(mOrientation) .build(); Log.i("OSD", "mGPUCameraRecorder created"); diff --git a/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorder.java b/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorder.java index 59b33db3..de5b0208 100644 --- a/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorder.java +++ b/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorder.java @@ -41,6 +41,7 @@ public class GPUCameraRecorder { private final int degrees; private final boolean recordNoFilter; private final long duration; + private final boolean ismirror; private long startTime; @@ -59,7 +60,8 @@ public class GPUCameraRecorder { final boolean isLandscapeDevice, final int degrees, final boolean recordNoFilter, - final long duration + final long duration, + final boolean ismirror ) { @@ -81,6 +83,7 @@ public class GPUCameraRecorder { this.degrees = degrees; this.recordNoFilter = recordNoFilter; this.duration = duration; + this.ismirror = ismirror; // create preview Renderer if (null == glPreviewRenderer) { @@ -119,7 +122,7 @@ public class GPUCameraRecorder { public void run() { if (glPreviewRenderer != null) { glPreviewRenderer.setAngle(degrees); - glPreviewRenderer.onStartPreview(previewWidth, previewHeight, isLandscapeDevice); + glPreviewRenderer.onStartPreview(previewWidth, previewHeight, isLandscapeDevice,ismirror); } } }); diff --git a/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorderBuilder.java b/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorderBuilder.java index 1a39c4fd..1f585e7e 100644 --- a/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorderBuilder.java +++ b/gpuv/src/main/java/com/xypower/gpuv/camerarecorder/GPUCameraRecorderBuilder.java @@ -4,10 +4,12 @@ import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.Surface; + import com.xypower.gpuv.egl.filter.GlFilter; @@ -31,6 +33,10 @@ public class GPUCameraRecorderBuilder { private GlFilter glFilter; private long duration; private int rotation; + private Integer sensororientation; + private Integer facing; + private boolean ifmirror = false; + public GPUCameraRecorderBuilder(Activity activity, GLSurfaceView glSurfaceView) { this.activity = activity; this.glSurfaceView = glSurfaceView; @@ -88,6 +94,7 @@ public class GPUCameraRecorderBuilder { this.rotation = d; return this; } + public GPUCameraRecorderBuilder recordNoFilter(boolean recordNoFilter) { this.recordNoFilter = recordNoFilter; return this; @@ -101,15 +108,31 @@ public class GPUCameraRecorderBuilder { CameraManager cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); boolean isLandscapeDevice = resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + CameraCharacteristics cameraCharacteristics = null; + try { + cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); + } catch (Exception ex) { + ex.printStackTrace(); + } + if (cameraCharacteristics != null) { + facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); + sensororientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + } int degrees = 0; -// if (isLandscapeDevice) { -// int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); -// Log.d("GPUCameraRecorder", "Surface.ROTATION_90 = " + Surface.ROTATION_90 + " rotation = " + rotation); -// degrees = 90 * (rotation - 2); -// } - if (isLandscapeDevice) { - Log.d("GPUCameraRecorder", "测试测试rotation" + rotation); - degrees = rotation * 90; + if (facing == 1) { + if (rotation == -1) { + degrees = sensororientation; + } else { + degrees = sensororientation + (rotation - 1) * 90; + } + ifmirror = false; + } else { + if (rotation == -1) { + degrees = sensororientation + 180; + } else { + degrees = sensororientation + (rotation - 1) * 90 + 180; + } + ifmirror = true; } Log.d("GPUCameraRecorder", "测试测试" + degrees); @@ -129,7 +152,8 @@ public class GPUCameraRecorderBuilder { isLandscapeDevice, degrees, recordNoFilter, - duration + duration, + ifmirror ); GPUCameraRecorder.setFilter(glFilter); diff --git a/gpuv/src/main/java/com/xypower/gpuv/egl/GlPreviewRenderer.java b/gpuv/src/main/java/com/xypower/gpuv/egl/GlPreviewRenderer.java index e5689f02..047ecf59 100644 --- a/gpuv/src/main/java/com/xypower/gpuv/egl/GlPreviewRenderer.java +++ b/gpuv/src/main/java/com/xypower/gpuv/egl/GlPreviewRenderer.java @@ -7,6 +7,7 @@ import android.opengl.GLSurfaceView; import android.opengl.Matrix; import android.os.Handler; import android.util.Size; + import com.xypower.gpuv.camerarecorder.capture.MediaVideoEncoder; import com.xypower.gpuv.egl.filter.GlFilter; @@ -15,7 +16,6 @@ import javax.microedition.khronos.egl.EGLConfig; import static android.opengl.GLES20.*; - public class GlPreviewRenderer extends GlFrameBufferObjectRenderer implements SurfaceTexture.OnFrameAvailableListener { private final Handler handler = new Handler(); @@ -66,11 +66,14 @@ public class GlPreviewRenderer extends GlFrameBufferObjectRenderer implements Su Matrix.setIdentityM(STMatrix, 0); } - public void onStartPreview(float cameraPreviewWidth, float cameraPreviewHeight, boolean isLandscapeDevice) { + public void onStartPreview(float cameraPreviewWidth, float cameraPreviewHeight, boolean isLandscapeDevice, boolean ismirror) { Matrix.setIdentityM(MMatrix, 0); - Matrix.rotateM(MMatrix, 0, -angle, 0.0f, 0.0f, 1.0f); + Matrix.rotateM(MMatrix, 0, angle, 0.0f, 0.0f, 1.0f); + if (ismirror) { + Matrix.scaleM(MMatrix, 0, 1, -1, 1); + } // Log.d("GPUCameraRecorder ", "angle" + angle); // Log.d("GPUCameraRecorder ", "getMeasuredHeight " + glView.getMeasuredHeight()); // Log.d("GPUCameraRecorder ", "getMeasuredWidth " + glView.getMeasuredWidth());