Skip to content

Commit 4a01f0e

Browse files
authored
Merge pull request #1745 from pedroSG94/feature/rotate-stream
allow rotate only stream (all or camera only)
2 parents 20c3de5 + 797f838 commit 4a01f0e

File tree

4 files changed

+66
-11
lines changed

4 files changed

+66
-11
lines changed

encoder/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public class CameraRender extends BaseRenderOffScreen {
4242

4343
private int[] textureID = new int[1];
4444
private float[] rotationMatrix = new float[16];
45+
private float[] MVPMatrixPreview = new float[16];
46+
private float[] rotationPreviewMatrix = new float[16];
4547
private float[] scaleMatrix = new float[16];
4648

4749
private int program = -1;
@@ -52,9 +54,11 @@ public class CameraRender extends BaseRenderOffScreen {
5254

5355
private SurfaceTexture surfaceTexture;
5456
private Surface surface;
57+
private boolean previewMode = false;
5558

5659
public CameraRender() {
5760
Matrix.setIdentityM(MVPMatrix, 0);
61+
Matrix.setIdentityM(MVPMatrixPreview, 0);
5862
Matrix.setIdentityM(STMatrix, 0);
5963
float[] vertex = CameraHelper.getVerticesData();
6064
squareVertex = ByteBuffer.allocateDirect(vertex.length * FLOAT_SIZE_BYTES)
@@ -111,7 +115,7 @@ public void draw() {
111115
SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex);
112116
GLES20.glEnableVertexAttribArray(aTextureCameraHandle);
113117

114-
GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
118+
GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, previewMode ? MVPMatrixPreview : MVPMatrix, 0);
115119
GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0);
116120
//camera
117121
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
@@ -144,11 +148,22 @@ public Surface getSurface() {
144148
}
145149

146150
public void setRotation(int rotation) {
151+
setRotationStream(rotation);
152+
setRotationPreview(rotation);
153+
}
154+
155+
public void setRotationStream(int rotation) {
147156
Matrix.setIdentityM(rotationMatrix, 0);
148157
Matrix.rotateM(rotationMatrix, 0, rotation, 0f, 0f, -1f);
149158
update();
150159
}
151160

161+
public void setRotationPreview(int rotation) {
162+
Matrix.setIdentityM(rotationPreviewMatrix, 0);
163+
Matrix.rotateM(rotationPreviewMatrix, 0, rotation, 0f, 0f, -1f);
164+
update();
165+
}
166+
152167
public void setFlip(boolean isFlipHorizontal, boolean isFlipVertical) {
153168
Matrix.setIdentityM(scaleMatrix, 0);
154169
Matrix.scaleM(scaleMatrix, 0, isFlipHorizontal ? -1f : 1f, isFlipVertical ? -1f : 1f, 1f);
@@ -159,5 +174,13 @@ private void update() {
159174
Matrix.setIdentityM(MVPMatrix, 0);
160175
Matrix.multiplyMM(MVPMatrix, 0, scaleMatrix, 0, MVPMatrix, 0);
161176
Matrix.multiplyMM(MVPMatrix, 0, rotationMatrix, 0, MVPMatrix, 0);
177+
178+
Matrix.setIdentityM(MVPMatrixPreview, 0);
179+
Matrix.multiplyMM(MVPMatrixPreview, 0, scaleMatrix, 0, MVPMatrixPreview, 0);
180+
Matrix.multiplyMM(MVPMatrixPreview, 0, rotationPreviewMatrix, 0, MVPMatrixPreview, 0);
181+
}
182+
183+
public void setMode(boolean previewMode) {
184+
this.previewMode = previewMode;
162185
}
163186
}

encoder/src/main/java/com/pedro/encoder/input/gl/render/MainRender.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ class MainRender {
5656

5757
fun isReady(): Boolean = running.get()
5858

59-
fun drawOffScreen() {
59+
fun drawOffScreen(isPreview: Boolean) {
60+
cameraRender.setMode(isPreview)
6061
cameraRender.draw()
6162
for (baseFilterRender in filterRenders) baseFilterRender.draw()
6263
}
@@ -184,6 +185,14 @@ class MainRender {
184185
cameraRender.setRotation(rotation)
185186
}
186187

188+
fun setCameraRotationStream(rotation: Int) {
189+
cameraRender.setRotationStream(rotation)
190+
}
191+
192+
fun setCameraRotationPreview(rotation: Int) {
193+
cameraRender.setRotationPreview(rotation)
194+
}
195+
187196
fun setCameraFlip(isFlipHorizontal: Boolean, isFlipVertical: Boolean) {
188197
cameraRender.setFlip(isFlipHorizontal, isFlipVertical)
189198
}

library/src/main/java/com/pedro/library/view/GlStreamInterface.kt

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
6464
private var streamOrientation = 0
6565
private var previewWidth = 0
6666
private var previewHeight = 0
67-
private var previewOrientation = 0
6867
private var isPortrait = false
68+
private var isPortraitPreview = false
6969
private var orientationForced = OrientationForced.NONE
7070
private val filterQueue: BlockingQueue<Filter> = LinkedBlockingQueue()
7171
private val threadQueue = LinkedBlockingQueue<Runnable>()
@@ -85,7 +85,7 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
8585
private val sensorRotationManager = SensorRotationManager(context, true, true) { orientation, isPortrait ->
8686
if (autoHandleOrientation && shouldHandleOrientation) {
8787
setCameraOrientation(orientation)
88-
this.isPortrait = isPortrait
88+
setIsPortrait(isPortrait)
8989
}
9090
}
9191

@@ -220,7 +220,7 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
220220
if (surfaceManager.isReady && mainRender.isReady()) {
221221
surfaceManager.makeCurrent()
222222
mainRender.updateFrame()
223-
mainRender.drawOffScreen()
223+
mainRender.drawOffScreen(false)
224224
surfaceManager.swapBuffer()
225225
}
226226

@@ -239,6 +239,11 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
239239
OrientationForced.LANDSCAPE -> false
240240
OrientationForced.NONE -> isPortrait
241241
}
242+
val orientationPreview = when (orientationForced) {
243+
OrientationForced.PORTRAIT -> true
244+
OrientationForced.LANDSCAPE -> false
245+
OrientationForced.NONE -> isPortraitPreview
246+
}
242247
// render VideoEncoder (stream and record)
243248
if (surfaceManagerEncoder.isReady && mainRender.isReady() && !limitFps) {
244249
val w = if (muteVideo) 0 else encoderWidth
@@ -270,8 +275,13 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
270275
if (surfaceManagerPreview.isReady && mainRender.isReady() && !limitFps) {
271276
val w = if (previewWidth == 0) encoderWidth else previewWidth
272277
val h = if (previewHeight == 0) encoderHeight else previewHeight
278+
if (surfaceManager.isReady && mainRender.isReady()) {
279+
surfaceManager.makeCurrent()
280+
mainRender.drawOffScreen(true)
281+
surfaceManager.swapBuffer()
282+
}
273283
surfaceManagerPreview.makeCurrent()
274-
mainRender.drawScreenPreview(w, h, orientation, aspectRatioMode, previewOrientation,
284+
mainRender.drawScreenPreview(w, h, orientationPreview, aspectRatioMode, 0,
275285
isPreviewVerticalFlip, isPreviewHorizontalFlip)
276286
surfaceManagerPreview.swapBuffer()
277287
}
@@ -332,17 +342,30 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
332342
}
333343

334344
fun setIsPortrait(isPortrait: Boolean) {
335-
this.isPortrait = isPortrait
345+
setPreviewIsPortrait(isPortrait)
346+
setStreamIsPortrait(isPortrait)
347+
}
348+
349+
fun setPreviewIsPortrait(isPortrait: Boolean) {
350+
this.isPortraitPreview = isPortrait
336351
}
337352

338-
fun setPreviewRotation(orientation: Int) {
339-
this.previewOrientation = orientation
353+
fun setStreamIsPortrait(isPortrait: Boolean) {
354+
this.isPortrait = isPortrait
340355
}
341356

342357
fun setCameraOrientation(orientation: Int) {
343358
mainRender.setCameraRotation(orientation)
344359
}
345360

361+
fun setCameraPreviewOrientation(orientation: Int) {
362+
mainRender.setCameraRotationPreview(orientation)
363+
}
364+
365+
fun setCameraStreamOrientation(orientation: Int) {
366+
mainRender.setCameraRotationStream(orientation)
367+
}
368+
346369
override fun setFilter(filterPosition: Int, baseFilterRender: BaseFilterRender) {
347370
filterQueue.add(Filter(FilterAction.SET_INDEX, filterPosition, baseFilterRender))
348371
}
@@ -372,7 +395,7 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
372395
}
373396

374397
override fun setRotation(rotation: Int) {
375-
mainRender.setCameraRotation(rotation)
398+
setCameraOrientation(rotation)
376399
}
377400

378401
override fun forceFpsLimit(fps: Int) {

library/src/main/java/com/pedro/library/view/OpenGlView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ private void draw(boolean forced) {
256256
if (surfaceManager.isReady() && mainRender.isReady()) {
257257
surfaceManager.makeCurrent();
258258
mainRender.updateFrame();
259-
mainRender.drawOffScreen();
259+
mainRender.drawOffScreen(false);
260260
if (!limitFps) {
261261
mainRender.drawScreen(previewWidth, previewHeight, aspectRatioMode, 0,
262262
isPreviewVerticalFlip, isPreviewHorizontalFlip);

0 commit comments

Comments
 (0)