diff --git a/app/src/main/java/com/pedro/rtpstreamer/openglexample/OpenGlRtmpActivity.java b/app/src/main/java/com/pedro/rtpstreamer/openglexample/OpenGlRtmpActivity.java
index cd5edac3d..7e36b2910 100644
--- a/app/src/main/java/com/pedro/rtpstreamer/openglexample/OpenGlRtmpActivity.java
+++ b/app/src/main/java/com/pedro/rtpstreamer/openglexample/OpenGlRtmpActivity.java
@@ -107,6 +107,8 @@ protected void onCreate(Bundle savedInstanceState) {
bRecord.setOnClickListener(this);
Button switchCamera = findViewById(R.id.switch_camera);
switchCamera.setOnClickListener(this);
+ findViewById(R.id.b_pause_stream).setOnClickListener(this);
+ findViewById(R.id.b_resume_stream).setOnClickListener(this);
etUrl = findViewById(R.id.et_rtp_url);
etUrl.setHint(R.string.hint_rtmp);
rtmpCamera1 = new RtmpCamera1(openGlView, this);
@@ -405,6 +407,18 @@ public void onClick(View view) {
rtmpCamera1.switchCamera();
} catch (CameraOpenException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
+ } finally {
+ rtmpCamera1.setIsStreamFlipHorizontal(rtmpCamera1.isFrontCamera());
+ }
+ break;
+ case R.id.b_pause_stream:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ rtmpCamera1.pauseStream();
+ }
+ break;
+ case R.id.b_resume_stream:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ rtmpCamera1.resumeStream();
}
break;
case R.id.b_record:
diff --git a/app/src/main/res/layout/activity_open_gl.xml b/app/src/main/res/layout/activity_open_gl.xml
index faab5af8f..32f77c6c1 100644
--- a/app/src/main/res/layout/activity_open_gl.xml
+++ b/app/src/main/res/layout/activity_open_gl.xml
@@ -13,8 +13,6 @@
app:aspectRatioMode="adjust"
app:AAEnabled="false"
app:numFilters="1"
- app:isFlipHorizontal="false"
- app:isFlipVertical="false"
/>
+
+
+
+
+
+
+
+ Select file
Start record
Stop record
+ Pause stream
+ Resume stream
ReSync file
Microphone
diff --git a/encoder/build.gradle b/encoder/build.gradle
index 22d09ee41..1aa5a4ad5 100644
--- a/encoder/build.gradle
+++ b/encoder/build.gradle
@@ -1,6 +1,6 @@
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
-group = 'com.github.pedroSG94'
+group='com.github.marcin-adamczewski'
android {
compileSdkVersion 29
diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
index e3b9ad6b4..71db474cd 100644
--- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
+++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java
@@ -62,8 +62,9 @@ public void drawOffScreen() {
}
public void drawScreen(int width, int height, boolean keepAspectRatio, int mode, int rotation,
- boolean isPreview) {
- screenRender.draw(width, height, keepAspectRatio, mode, rotation, isPreview);
+ boolean isPreview, boolean flipStreamHorizontal, boolean flipStreamVertical) {
+ screenRender.draw(width, height, keepAspectRatio, mode, rotation,
+ isPreview, flipStreamHorizontal, flipStreamVertical);
}
public void release() {
diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
index 7027795e6..b1d4fc3cc 100644
--- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
+++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java
@@ -78,12 +78,11 @@ public void initGl(Context context) {
}
public void draw(int width, int height, boolean keepAspectRatio, int mode, int rotation,
- boolean isPreview) {
+ boolean isPreview, boolean flipStreamHorizontal, boolean flipStreamVertical) {
GlUtil.checkGlError("drawScreen start");
- if (mode == 2 || mode == 3) { //stream rotation is enabled
- SizeCalculator.updateMatrix(rotation, width, height, isPreview, isPortrait, MVPMatrix);
- }
+ SizeCalculator.updateMatrix(rotation, width, height, isPreview,
+ isPortrait, flipStreamHorizontal, flipStreamVertical, MVPMatrix);
SizeCalculator.calculateViewPort(keepAspectRatio, mode, width, height, streamWidth,
streamHeight);
diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
index 7893ef932..3ae7248d7 100644
--- a/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
+++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java
@@ -90,8 +90,9 @@ public void drawFrame(int width, int height, boolean keepAspectRatio, int mode,
GlUtil.checkGlError("drawFrame start");
surfaceTexture.getTransformMatrix(STMatrix);
- if (mode == 2 || mode == 3) { //stream rotation is enabled
- SizeCalculator.updateMatrix(rotation, width, height, isPreview, isPortrait, MVPMatrix);
+ if(mode == 2 || mode == 3) {
+ SizeCalculator.updateMatrix(rotation, width, height, isPreview,
+ isPortrait, false, false, MVPMatrix);
}
SizeCalculator.calculateViewPort(keepAspectRatio, mode, width, height, streamWidth,
streamHeight);
diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java b/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
index 03d511884..453c999a9 100644
--- a/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
+++ b/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java
@@ -11,6 +11,8 @@
import android.view.SurfaceView;
import android.view.TextureView;
+import androidx.annotation.Nullable;
+
import com.pedro.encoder.Frame;
import java.io.IOException;
import java.util.Iterator;
diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java
index daf3d901e..9cae15e9e 100644
--- a/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java
+++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java
@@ -36,12 +36,16 @@ public static void calculateViewPort(boolean keepAspectRatio, int mode, int prev
}
public static void updateMatrix(int rotation, int width, int height, boolean isPreview,
- boolean isPortrait, float[] MVPMatrix) {
+ boolean isPortrait, boolean flipStreamHorizontal,
+ boolean flipStreamVertical, float[] MVPMatrix) {
Matrix.setIdentityM(MVPMatrix, 0);
PointF scale = getScale(rotation, width, height, isPortrait, isPreview);
Matrix.scaleM(MVPMatrix, 0, scale.x, scale.y, 1f);
if (!isPreview && !isPortrait) rotation += 90;
Matrix.rotateM(MVPMatrix, 0, rotation, 0f, 0f, -1f);
+ if (!isPreview) {
+ Matrix.scaleM(MVPMatrix, 0, flipStreamHorizontal ? -1 : 1, flipStreamVertical ? -1 : 1, 1f);
+ }
}
private static PointF getScale(int rotation, int width, int height, boolean isPortrait,
diff --git a/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java b/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java
index 8330ad48c..1472df357 100644
--- a/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java
+++ b/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java
@@ -176,6 +176,20 @@ public void run() {
Log.i(TAG, "started");
}
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void pause() {
+ Bundle params = new Bundle();
+ params.putInt(MediaCodec.PARAMETER_KEY_SUSPEND, 1);
+ codec.setParameters(params);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void resume() {
+ Bundle params = new Bundle();
+ params.putInt(MediaCodec.PARAMETER_KEY_SUSPEND, 0);
+ codec.setParameters(params);
+ }
+
@Override
protected void stopImp() {
if (handlerThread != null) {
diff --git a/rtmp/build.gradle b/rtmp/build.gradle
index 75cb42666..3b568440d 100644
--- a/rtmp/build.gradle
+++ b/rtmp/build.gradle
@@ -1,6 +1,6 @@
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
-group = 'com.github.pedroSG94'
+group='com.github.marcin-adamczewski'
android {
compileSdkVersion 29
diff --git a/rtplibrary/build.gradle b/rtplibrary/build.gradle
index 9337a0261..8a9ed33e6 100644
--- a/rtplibrary/build.gradle
+++ b/rtplibrary/build.gradle
@@ -1,6 +1,6 @@
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
-group = 'com.github.pedroSG94'
+group='com.github.marcin-adamczewski'
android {
compileSdkVersion 29
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
index 18dbdcf70..d88ab76bd 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java
@@ -459,6 +459,40 @@ public void startStream(String url) {
onPreview = true;
}
+ /**
+ * Pauses only video part of a stream keeping preview on.
+ */
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void pauseStreamVideo() {
+ videoEncoder.pause();
+ }
+
+ /**
+ * Resumes video part of a stream.
+ */
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void resumeStreamVideo() {
+ videoEncoder.resume();
+ }
+
+ /**
+ * Pauses both video and audio part of a stream keeping preview on.
+ */
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void pauseStream() {
+ pauseStreamVideo();
+ disableAudio();
+ }
+
+ /**
+ * Resumes both video and audio part of a stream.
+ */
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public void resumeStream() {
+ resumeStreamVideo();
+ enableAudio();
+ }
+
private void startEncoders() {
videoEncoder.start();
audioEncoder.start();
@@ -656,6 +690,14 @@ public void switchCamera() throws CameraOpenException {
}
}
+ public void setIsStreamFlipVertical(boolean isStreamFlipVertical) {
+ glInterface.setIsFlipStreamVertical(isStreamFlipVertical);
+ }
+
+ public void setIsStreamFlipHorizontal(boolean isStreamFlipHorizontal) {
+ glInterface.setIsFlipStreamHorizontal(isStreamFlipHorizontal);
+ }
+
public GlInterface getGlInterface() {
if (glInterface != null) {
return glInterface;
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
index 75b80b34d..df63e53fa 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java
@@ -432,6 +432,36 @@ public void startStream(String url) {
onPreview = true;
}
+ /**
+ * Pauses only video part of a stream keeping preview on.
+ */
+ public void pauseStreamVideo() {
+ videoEncoder.pause();
+ }
+
+ /**
+ * Resumes video part of a stream.
+ */
+ public void resumeStreamVideo() {
+ videoEncoder.resume();
+ }
+
+ /**
+ * Pauses both video and audio part of a stream keeping preview on.
+ */
+ public void pauseStream() {
+ pauseStreamVideo();
+ disableAudio();
+ }
+
+ /**
+ * Resumes both video and audio part of a stream.
+ */
+ public void resumeStream() {
+ resumeStreamVideo();
+ enableAudio();
+ }
+
private void startEncoders() {
videoEncoder.start();
audioEncoder.start();
@@ -686,12 +716,21 @@ public int getStreamHeight() {
*
* @throws CameraOpenException If the other camera doesn't support same resolution.
*/
+
public void switchCamera() throws CameraOpenException {
if (isStreaming() || onPreview) {
cameraManager.switchCamera();
}
}
+ public void setIsStreamFlipVertical(boolean isStreamFlipVertical) {
+ glInterface.setIsFlipStreamVertical(isStreamFlipVertical);
+ }
+
+ public void setIsStreamFlipHorizontal(boolean isStreamFlipHorizontal) {
+ glInterface.setIsFlipStreamHorizontal(isStreamFlipHorizontal);
+ }
+
public GlInterface getGlInterface() {
if (glInterface != null) {
return glInterface;
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
index 4daa95bc0..6ec88e6f1 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java
@@ -100,4 +100,8 @@ public interface GlInterface {
void stop();
void setFps(int fps);
+
+ void setIsFlipStreamHorizontal(boolean isStreamFlipHorizontal);
+
+ void setIsFlipStreamVertical(boolean isStreamFlipVertical);
}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
index e81272b00..fdd16d391 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java
@@ -133,6 +133,16 @@ public void enableAA(boolean AAEnabled) {
}
+ @Override
+ public void setIsFlipStreamHorizontal(boolean isStreamFlipHorizontal) {
+
+ }
+
+ @Override
+ public void setIsFlipStreamVertical(boolean isStreamFlipVertical) {
+
+ }
+
@Override
public void setRotation(int rotation) {
simpleCameraRender.setRotation(rotation);
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
index 25d64da81..656bfab27 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java
@@ -39,7 +39,8 @@ public class OffScreenGlThread
private int encoderWidth, encoderHeight;
private boolean loadAA = false;
private int streamRotation;
-
+ private boolean isStreamFlipHorizontal = false;
+ private boolean isStreamFlipVertical = false;
private boolean AAEnabled = false;
private FpsLimiter fpsLimiter = new FpsLimiter();
//used with camera
@@ -178,7 +179,8 @@ public void run() {
surfaceManager.makeCurrent();
textureManager.updateFrame();
textureManager.drawOffScreen();
- textureManager.drawScreen(encoderWidth, encoderHeight, false, 0, 0, true);
+ textureManager.drawScreen(encoderWidth, encoderHeight, false, 0, 0,
+ true, isStreamFlipHorizontal, isStreamFlipVertical);
if (takePhotoCallback != null) {
takePhotoCallback.onTakePhoto(
GlUtil.getBitmap(encoderWidth, encoderHeight, encoderWidth, encoderHeight));
@@ -190,7 +192,7 @@ public void run() {
if (surfaceManagerEncoder != null && !fpsLimiter.limitFPS()) {
surfaceManagerEncoder.makeCurrent();
textureManager.drawScreen(encoderWidth, encoderHeight, false, 0, streamRotation,
- false);
+ false, isStreamFlipHorizontal, isStreamFlipVertical);
surfaceManagerEncoder.swapBuffer();
}
}
@@ -218,4 +220,14 @@ public void onFrameAvailable(SurfaceTexture surfaceTexture) {
sync.notifyAll();
}
}
+
+ @Override
+ public void setIsFlipStreamHorizontal(boolean isStreamFlipHorizontal) {
+ this.isStreamFlipHorizontal = isStreamFlipHorizontal;
+ }
+
+ @Override
+ public void setIsFlipStreamVertical(boolean isStreamFlipVertical) {
+ this.isStreamFlipVertical = isStreamFlipVertical;
+ }
}
diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
index e7264767d..a03e3d679 100644
--- a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
+++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java
@@ -8,7 +8,9 @@
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
+
import androidx.annotation.RequiresApi;
+
import com.pedro.encoder.input.gl.SurfaceManager;
import com.pedro.encoder.input.gl.render.ManagerRender;
import com.pedro.encoder.input.gl.render.filters.BaseFilterRender;
@@ -29,6 +31,7 @@ public class OpenGlView extends OpenGlViewBase {
private boolean keepAspectRatio = false;
private int aspectRatioMode = 0;
private boolean isFlipHorizontal = false, isFlipVertical = false;
+ private boolean isStreamFlipHorizontal = false, isStreamFlipVertical = false;
public OpenGlView(Context context) {
super(context);
@@ -44,6 +47,8 @@ public OpenGlView(Context context, AttributeSet attrs) {
ManagerRender.numFilters = typedArray.getInt(R.styleable.OpenGlView_numFilters, 1);
isFlipHorizontal = typedArray.getBoolean(R.styleable.OpenGlView_isFlipHorizontal, false);
isFlipVertical = typedArray.getBoolean(R.styleable.OpenGlView_isFlipVertical, false);
+ isStreamFlipHorizontal = typedArray.getBoolean(R.styleable.OpenGlView_isStreamFlipHorizontal, false);
+ isStreamFlipVertical = typedArray.getBoolean(R.styleable.OpenGlView_isStreamFlipVertical, false);
} finally {
typedArray.recycle();
}
@@ -112,6 +117,16 @@ public void surfaceChanged(SurfaceHolder holder, int format, int width, int heig
if (managerRender != null) managerRender.setPreviewSize(previewWidth, previewHeight);
}
+ @Override
+ public void setIsFlipStreamHorizontal(boolean isStreamFlipHorizontal) {
+ this.isStreamFlipHorizontal = isStreamFlipHorizontal;
+ }
+
+ @Override
+ public void setIsFlipStreamVertical(boolean isStreamFlipVertical) {
+ this.isStreamFlipVertical = isStreamFlipVertical;
+ }
+
@Override
public void run() {
releaseSurfaceManager();
@@ -127,8 +142,8 @@ public void run() {
surfaceManager.makeCurrent();
managerRender.updateFrame();
managerRender.drawOffScreen();
- managerRender.drawScreen(previewWidth, previewHeight, keepAspectRatio, aspectRatioMode, 0,
- true);
+ managerRender.drawScreen(previewWidth, previewHeight, keepAspectRatio, aspectRatioMode,
+ 0, true, isStreamFlipHorizontal, isStreamFlipVertical);
if (takePhotoCallback != null) {
takePhotoCallback.onTakePhoto(
GlUtil.getBitmap(previewWidth, previewHeight, encoderWidth, encoderHeight));
@@ -140,7 +155,7 @@ public void run() {
if (surfaceManagerEncoder != null && !fpsLimiter.limitFPS()) {
surfaceManagerEncoder.makeCurrent();
managerRender.drawScreen(encoderWidth, encoderHeight, false, aspectRatioMode,
- streamRotation, false);
+ streamRotation, false, isStreamFlipHorizontal, isStreamFlipVertical);
surfaceManagerEncoder.swapBuffer();
}
}
diff --git a/rtplibrary/src/main/res/values/attrs.xml b/rtplibrary/src/main/res/values/attrs.xml
index d2c08add9..bd6dd861e 100644
--- a/rtplibrary/src/main/res/values/attrs.xml
+++ b/rtplibrary/src/main/res/values/attrs.xml
@@ -23,6 +23,8 @@
+
+
diff --git a/rtsp/build.gradle b/rtsp/build.gradle
index a9c57b01c..07a8f9028 100644
--- a/rtsp/build.gradle
+++ b/rtsp/build.gradle
@@ -1,6 +1,6 @@
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
-group = 'com.github.pedroSG94'
+group='com.github.marcin-adamczewski'
android {
compileSdkVersion 29