Skip to content

Commit e6ee9b9

Browse files
committed
change getOrientationConfig in VideoSources
1 parent 2a8ddcf commit e6ee9b9

9 files changed

Lines changed: 48 additions & 14 deletions

File tree

app/src/main/java/com/pedro/streamer/screen/ScreenService.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class ScreenService: Service(), ConnectChecker {
6868
private val width = 640
6969
private val height = 480
7070
private val vBitrate = 1200 * 1000
71-
private var rotation = 0 //0 for landscape or 90 for portrait
71+
private var rotation = 90 //0 for landscape or 90 for portrait
7272
private val sampleRate = 32000
7373
private val isStereo = true
7474
private val aBitrate = 128 * 1000
@@ -162,13 +162,6 @@ class ScreenService: Service(), ConnectChecker {
162162
val screenSource = ScreenSource(applicationContext, mediaProjection)
163163
return try {
164164
genericStream.changeVideoSource(screenSource)
165-
//ScreenSource need use always setCameraOrientation(0) because the MediaProjection handle orientation.
166-
//You also need remove autoHandleOrientation if you are using it.
167-
//You need to call it after prepareVideo to override the default value.
168-
//Remember call is after changeVideoSource because that method call to setCameraOrientation and produce problems
169-
val isPortrait = rotation == 90 || rotation == 270
170-
genericStream.getGlInterface().setIsPortrait(isPortrait)
171-
genericStream.getGlInterface().setCameraOrientation(0)
172165
toggleAudioSource(selectedAudioSource)
173166
true
174167
} catch (ignored: IllegalArgumentException) {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.pedro.encoder.input.sources
2+
3+
data class OrientationConfig(
4+
val cameraOrientation: Int? = null,
5+
val isPortrait: Boolean? = null,
6+
val forced: OrientationForced = OrientationForced.NONE
7+
)

encoder/src/main/java/com/pedro/encoder/input/sources/video/ScreenSource.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import android.os.HandlerThread
2727
import android.view.Surface
2828
import androidx.annotation.RequiresApi
2929
import com.pedro.encoder.input.sources.MediaProjectionHandler
30+
import com.pedro.encoder.input.sources.OrientationConfig
31+
import com.pedro.encoder.input.sources.OrientationForced
3032

3133
/**
3234
* Created by pedro on 11/1/24.
@@ -92,6 +94,15 @@ class ScreenSource @JvmOverloads constructor(
9294

9395
override fun isRunning(): Boolean = virtualDisplay != null
9496

97+
override fun getOrientationConfig(): OrientationConfig {
98+
val isPortrait = rotation == 90 || rotation == 270
99+
return OrientationConfig(
100+
cameraOrientation = 0,
101+
isPortrait = isPortrait,
102+
forced = OrientationForced.NONE
103+
)
104+
}
105+
95106
private fun checkResolutionSupported(width: Int, height: Int): Boolean {
96107
if (width % 2 != 0 || height % 2 != 0) {
97108
throw IllegalArgumentException("width and height values must be divisible by 2")

encoder/src/main/java/com/pedro/encoder/input/sources/video/VideoFileSource.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.pedro.encoder.CodecErrorCallback
2424
import com.pedro.encoder.input.decoder.DecoderInterface
2525
import com.pedro.encoder.input.decoder.Extractor
2626
import com.pedro.encoder.input.decoder.VideoDecoder
27+
import com.pedro.encoder.input.sources.OrientationConfig
2728
import com.pedro.encoder.input.sources.OrientationForced
2829
import java.io.IOException
2930

@@ -78,7 +79,7 @@ class VideoFileSource(
7879

7980
override fun isRunning(): Boolean = running
8081

81-
override fun getOrientationConfig(): OrientationForced = OrientationForced.LANDSCAPE
82+
override fun getOrientationConfig() = OrientationConfig(forced = OrientationForced.LANDSCAPE)
8283

8384
fun moveTo(time: Double) {
8485
videoDecoder.moveTo(time)

encoder/src/main/java/com/pedro/encoder/input/sources/video/VideoSource.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.pedro.encoder.input.sources.video
1818

1919
import android.graphics.SurfaceTexture
20+
import com.pedro.encoder.input.sources.OrientationConfig
2021
import com.pedro.encoder.input.sources.OrientationForced
2122

2223
/**
@@ -45,5 +46,5 @@ abstract class VideoSource {
4546
abstract fun stop()
4647
abstract fun release()
4748
abstract fun isRunning(): Boolean
48-
open fun getOrientationConfig() = OrientationForced.NONE
49+
open fun getOrientationConfig() = OrientationConfig()
4950
}

extra-sources/src/main/java/com/pedro/extrasources/CameraUvcSource.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.hardware.usb.UsbDevice
2323
import android.view.Surface
2424
import com.herohan.uvcapp.CameraHelper
2525
import com.herohan.uvcapp.ICameraHelper
26+
import com.pedro.encoder.input.sources.OrientationConfig
2627
import com.pedro.encoder.input.sources.OrientationForced
2728
import com.pedro.encoder.input.sources.video.VideoSource
2829
import com.pedro.encoder.input.video.Camera2ResolutionCalculator
@@ -65,7 +66,7 @@ class CameraUvcSource: VideoSource() {
6566

6667
override fun isRunning(): Boolean = running
6768

68-
override fun getOrientationConfig(): OrientationForced = OrientationForced.LANDSCAPE
69+
override fun getOrientationConfig() = OrientationConfig(forced = OrientationForced.LANDSCAPE)
6970

7071
private val stateCallback: ICameraHelper.StateCallback = object : ICameraHelper.StateCallback {
7172
override fun onAttach(device: UsbDevice) {

extra-sources/src/main/java/com/pedro/extrasources/Media3VideoSource.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.media3.common.Player
1010
import androidx.media3.common.util.UnstableApi
1111
import androidx.media3.exoplayer.ExoPlayer
1212
import com.pedro.common.frame.MediaFrame
13+
import com.pedro.encoder.input.sources.OrientationConfig
1314
import com.pedro.encoder.input.sources.OrientationForced
1415
import com.pedro.encoder.input.sources.video.VideoSource
1516
import com.pedro.extrasources.extractor.Media3Extractor
@@ -60,7 +61,7 @@ class Media3VideoSource(
6061

6162
override fun isRunning(): Boolean = player?.isPlaying == true
6263

63-
override fun getOrientationConfig(): OrientationForced = OrientationForced.LANDSCAPE
64+
override fun getOrientationConfig() = OrientationConfig(forced = OrientationForced.LANDSCAPE)
6465

6566
fun getPlayer() = player
6667
}

library/src/main/java/com/pedro/library/base/StreamBase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ abstract class StreamBase(
140140
val isPortrait = rotation == 90 || rotation == 270
141141
glInterface.setIsPortrait(isPortrait)
142142
glInterface.setCameraOrientation(if (rotation == 0) 270 else rotation - 90)
143-
glInterface.forceOrientation(videoSource.getOrientationConfig())
143+
glInterface.setOrientationConfig(videoSource.getOrientationConfig())
144144
if (differentRecordResolution) {
145145
val result = videoEncoderRecord.prepareVideoEncoder(recordWidth, recordHeight, fps, recordBitrate, rotation,
146146
iFrameInterval, FormatVideoEncoder.SURFACE, profile, level)
@@ -383,7 +383,7 @@ abstract class StreamBase(
383383
videoSource.stop()
384384
videoSource.release()
385385
if (wasRunning) source.start(glInterface.surfaceTexture)
386-
glInterface.forceOrientation(source.getOrientationConfig())
386+
glInterface.setOrientationConfig(source.getOrientationConfig())
387387
videoSource = source
388388
}
389389

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.pedro.encoder.input.gl.SurfaceManager
3030
import com.pedro.encoder.input.gl.render.MainRender
3131
import com.pedro.encoder.input.gl.render.filters.BaseFilterRender
3232
import com.pedro.encoder.input.gl.render.filters.NoFilterRender
33+
import com.pedro.encoder.input.sources.OrientationConfig
3334
import com.pedro.encoder.input.sources.OrientationForced
3435
import com.pedro.encoder.input.video.CameraHelper
3536
import com.pedro.encoder.input.video.FpsLimiter
@@ -302,6 +303,24 @@ class GlStreamInterface(private val context: Context): OnFrameAvailableListener,
302303
}
303304
}
304305

306+
fun setOrientationConfig(orientationConfig: OrientationConfig) {
307+
when (orientationConfig.forced) {
308+
OrientationForced.PORTRAIT, OrientationForced.LANDSCAPE -> {
309+
forceOrientation(orientationConfig.forced)
310+
}
311+
OrientationForced.NONE -> {
312+
if (orientationConfig.isPortrait == null && orientationConfig.cameraOrientation == null) {
313+
forceOrientation(orientationConfig.forced)
314+
} else {
315+
orientationConfig.isPortrait?.let { setIsPortrait(it) }
316+
orientationConfig.cameraOrientation?.let { setCameraOrientation(it) }
317+
shouldHandleOrientation = false
318+
this.orientationForced = orientationConfig.forced
319+
}
320+
}
321+
}
322+
}
323+
305324
fun forceOrientation(forced: OrientationForced) {
306325
when (forced) {
307326
OrientationForced.PORTRAIT -> {

0 commit comments

Comments
 (0)