Skip to content
This repository was archived by the owner on Feb 10, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.fishjamcloud.client.models.ReconnectConfig
import com.fishjamcloud.client.models.TrackBandwidthLimit
import com.fishjamcloud.client.models.TrackEncoding
import com.fishjamcloud.client.models.VideoParameters
import com.fishjamcloud.client.ui.VideoTextureViewRenderer
import com.fishjamcloud.client.ui.VideoSurfaceViewRenderer
import com.fishjamcloud.client.webrtc.PeerConnectionFactoryWrapper
import com.fishjamcloud.client.webrtc.PeerConnectionManager
import com.fishjamcloud.client.webrtc.RTCEngineCommunication
Expand Down Expand Up @@ -237,5 +237,5 @@ class FishjamClient(

fun getLocalEndpoint(): Peer = client.getLocalEndpoint()

fun createVideoViewRenderer(): VideoTextureViewRenderer = client.createVideoViewRenderer()
fun createVideoViewRenderer(): VideoSurfaceViewRenderer = client.createVideoViewRenderer()
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import com.fishjamcloud.client.models.SimulcastConfig
import com.fishjamcloud.client.models.TrackBandwidthLimit
import com.fishjamcloud.client.models.TrackEncoding
import com.fishjamcloud.client.models.VideoParameters
import com.fishjamcloud.client.ui.VideoTextureViewRenderer
import com.fishjamcloud.client.ui.VideoSurfaceViewRenderer
import com.fishjamcloud.client.utils.ClosableCoroutineScope
import com.fishjamcloud.client.utils.TimberDebugTree
import com.fishjamcloud.client.utils.serializeToMap
Expand Down Expand Up @@ -606,7 +606,7 @@ internal class FishjamClientInternal(

fun getLocalEndpoint(): Endpoint = localEndpoint

fun createVideoViewRenderer(): VideoTextureViewRenderer = peerConnectionFactoryWrapper.createVideoViewRenderer()
fun createVideoViewRenderer(): VideoSurfaceViewRenderer = peerConnectionFactoryWrapper.createVideoViewRenderer()

private fun sendEvent(peerMessage: PeerNotifications.PeerMessage) {
webSocket?.send(peerMessage.toByteArray().toByteString())
Expand Down Expand Up @@ -857,8 +857,10 @@ internal class FishjamClientInternal(
trackId: String,
status: Server.MediaEvent.VadNotification.Status
) {
// TODO FCE-2175: I'm not really sure why sometimes we get rtcEngineId and sometimes just trackId
// so let's check for both for now
val track =
getTrackWithRtcEngineId(trackId) as? RemoteAudioTrack ?: run {
getTrackWithRtcEngineId(trackId) as? RemoteAudioTrack ?: getTrack(trackId) as? RemoteAudioTrack ?: run {
Timber.e("Invalid track id = $trackId")
return
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.fishjamcloud.client.media

import com.fishjamcloud.client.models.Dimensions
import com.fishjamcloud.client.models.Metadata
import com.fishjamcloud.client.ui.VideoTextureViewRenderer
import com.fishjamcloud.client.ui.VideoTextureViewRendererListener
import com.fishjamcloud.client.ui.VideoSurfaceViewRenderer
import com.fishjamcloud.client.ui.VideoSurfaceViewRendererListener
import java.util.UUID

interface VideoTrackListener {
Expand All @@ -24,20 +24,20 @@ open class VideoTrack(
metadata,
id
),
VideoTextureViewRendererListener {
VideoSurfaceViewRendererListener {
private var dimensionsListener: VideoTrackListener? = null

var dimensions: Dimensions? = null
private set

fun addRenderer(renderer: VideoTextureViewRenderer) {
fun addRenderer(renderer: VideoSurfaceViewRenderer) {
videoTrack.addSink(renderer)
renderer.setDimensionsListener(this)
renderer.addDimensionsListener(this)
}

fun removeRenderer(renderer: VideoTextureViewRenderer) {
fun removeRenderer(renderer: VideoSurfaceViewRenderer) {
videoTrack.removeSink(renderer)
renderer.setDimensionsListener(this)
renderer.removeDimensionsListener(this)
}

fun shouldReceive(shouldReceive: Boolean) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.fishjamcloud.client.ui

import android.content.Context
import android.util.AttributeSet
import com.fishjamcloud.client.models.Dimensions
import org.webrtc.EglBase
import org.webrtc.RendererCommon
import org.webrtc.SurfaceViewRenderer
import java.util.concurrent.CopyOnWriteArrayList

interface VideoSurfaceViewRendererListener {
fun onDimensionsChanged(dimensions: Dimensions)
}

open class VideoSurfaceViewRenderer : SurfaceViewRenderer {
private val dimensionsListeners = CopyOnWriteArrayList<VideoSurfaceViewRendererListener>()
var rotatedFrameWidth = 0
var rotatedFrameHeight = 0

internal constructor(context: Context) : super(context)

internal constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

override fun init(
sharedContext: EglBase.Context?,
rendererEvents: RendererCommon.RendererEvents?
) {
val combinedEvents =
object : RendererCommon.RendererEvents {
override fun onFirstFrameRendered() {
rendererEvents?.onFirstFrameRendered()
}

override fun onFrameResolutionChanged(
videoWidth: Int,
videoHeight: Int,
rotation: Int
) {
rendererEvents?.onFrameResolutionChanged(videoWidth, videoHeight, rotation)

val rotatedWidth = if (rotation == 0 || rotation == 180) videoWidth else videoHeight
val rotatedHeight = if (rotation == 0 || rotation == 180) videoHeight else videoWidth

rotatedFrameWidth = rotatedWidth
rotatedFrameHeight = rotatedHeight

val dimensions = Dimensions(rotatedWidth, rotatedHeight)
for (listener in dimensionsListeners) {
listener.onDimensionsChanged(dimensions)
}
}
}

super.init(sharedContext, combinedEvents)
}

fun addDimensionsListener(listener: VideoSurfaceViewRendererListener) {
dimensionsListeners.add(listener)
}

fun removeDimensionsListener(listener: VideoSurfaceViewRendererListener) {
dimensionsListeners.remove(listener)
}
}
Loading
Loading