David Zhao

Support for video dimensions

@@ -3,6 +3,7 @@ package io.livekit.android.room @@ -3,6 +3,7 @@ package io.livekit.android.room
3 import com.github.ajalt.timberkt.Timber 3 import com.github.ajalt.timberkt.Timber
4 import io.livekit.android.ConnectOptions 4 import io.livekit.android.ConnectOptions
5 import io.livekit.android.dagger.InjectionNames 5 import io.livekit.android.dagger.InjectionNames
  6 +import io.livekit.android.room.track.Track
6 import io.livekit.android.room.track.TrackException 7 import io.livekit.android.room.track.TrackException
7 import io.livekit.android.room.util.* 8 import io.livekit.android.room.util.*
8 import io.livekit.android.util.CloseableCoroutineScope 9 import io.livekit.android.util.CloseableCoroutineScope
@@ -81,14 +82,14 @@ constructor( @@ -81,14 +82,14 @@ constructor(
81 client.join(url, token, options) 82 client.join(url, token, options)
82 } 83 }
83 84
84 - suspend fun addTrack(cid: String, name: String, kind: LivekitModels.TrackType): LivekitModels.TrackInfo { 85 + suspend fun addTrack(cid: String, name: String, kind: LivekitModels.TrackType, dimensions: Track.Dimensions? = null): LivekitModels.TrackInfo {
85 if (pendingTrackResolvers[cid] != null) { 86 if (pendingTrackResolvers[cid] != null) {
86 throw TrackException.DuplicateTrackException("Track with same ID $cid has already been published!") 87 throw TrackException.DuplicateTrackException("Track with same ID $cid has already been published!")
87 } 88 }
88 89
89 return suspendCoroutine { cont -> 90 return suspendCoroutine { cont ->
90 pendingTrackResolvers[cid] = cont 91 pendingTrackResolvers[cid] = cont
91 - client.sendAddTrack(cid, name, kind) 92 + client.sendAddTrack(cid, name, kind, dimensions)
92 } 93 }
93 } 94 }
94 95
@@ -4,6 +4,7 @@ import com.github.ajalt.timberkt.Timber @@ -4,6 +4,7 @@ import com.github.ajalt.timberkt.Timber
4 import com.google.protobuf.util.JsonFormat 4 import com.google.protobuf.util.JsonFormat
5 import io.livekit.android.ConnectOptions 5 import io.livekit.android.ConnectOptions
6 import io.livekit.android.dagger.InjectionNames 6 import io.livekit.android.dagger.InjectionNames
  7 +import io.livekit.android.room.track.Track
7 import io.livekit.android.util.safe 8 import io.livekit.android.util.safe
8 import kotlinx.serialization.decodeFromString 9 import kotlinx.serialization.decodeFromString
9 import kotlinx.serialization.encodeToString 10 import kotlinx.serialization.encodeToString
@@ -193,12 +194,15 @@ constructor( @@ -193,12 +194,15 @@ constructor(
193 sendRequest(request) 194 sendRequest(request)
194 } 195 }
195 196
196 - fun sendAddTrack(cid: String, name: String, type: LivekitModels.TrackType) { 197 + fun sendAddTrack(cid: String, name: String, type: LivekitModels.TrackType, dimensions: Track.Dimensions? = null) {
197 val addTrackRequest = LivekitRtc.AddTrackRequest.newBuilder() 198 val addTrackRequest = LivekitRtc.AddTrackRequest.newBuilder()
198 .setCid(cid) 199 .setCid(cid)
199 .setName(name) 200 .setName(name)
200 .setType(type) 201 .setType(type)
201 - .build() 202 + if (dimensions != null) {
  203 + addTrackRequest.width = dimensions.width
  204 + addTrackRequest.height = dimensions.height
  205 + }
202 206
203 val request = LivekitRtc.SignalRequest.newBuilder() 207 val request = LivekitRtc.SignalRequest.newBuilder()
204 .setAddTrack(addTrackRequest) 208 .setAddTrack(addTrackRequest)
@@ -102,7 +102,7 @@ internal constructor( @@ -102,7 +102,7 @@ internal constructor(
102 102
103 val cid = track.rtcTrack.id() 103 val cid = track.rtcTrack.id()
104 val trackInfo = 104 val trackInfo =
105 - engine.addTrack(cid = cid, name = track.name, kind = LivekitModels.TrackType.VIDEO) 105 + engine.addTrack(cid = cid, name = track.name, kind = LivekitModels.TrackType.VIDEO, dimensions = track.dimensions)
106 val transInit = RtpTransceiver.RtpTransceiverInit( 106 val transInit = RtpTransceiver.RtpTransceiverInit(
107 RtpTransceiver.RtpTransceiverDirection.SEND_ONLY, 107 RtpTransceiver.RtpTransceiverDirection.SEND_ONLY,
108 listOf(this.sid) 108 listOf(this.sid)
@@ -17,6 +17,12 @@ class LocalVideoTrack( @@ -17,6 +17,12 @@ class LocalVideoTrack(
17 private val options: LocalVideoTrackOptions, 17 private val options: LocalVideoTrackOptions,
18 rtcTrack: org.webrtc.VideoTrack 18 rtcTrack: org.webrtc.VideoTrack
19 ) : VideoTrack(name, rtcTrack) { 19 ) : VideoTrack(name, rtcTrack) {
  20 + val dimensions: Dimensions
  21 +
  22 + init {
  23 + dimensions = Dimensions(options.captureParams.width, options.captureParams.height)
  24 + }
  25 +
20 fun startCapture() { 26 fun startCapture() {
21 capturer.startCapture(options.captureParams.width, options.captureParams.height, options.captureParams.maxFps) 27 capturer.startCapture(options.captureParams.width, options.captureParams.height, options.captureParams.maxFps)
22 } 28 }
@@ -45,6 +45,8 @@ open class Track( @@ -45,6 +45,8 @@ open class Track(
45 } 45 }
46 } 46 }
47 47
  48 + class Dimensions(var width: Int, var height: Int)
  49 +
48 open fun stop() { 50 open fun stop() {
49 rtcTrack.setEnabled(false) 51 rtcTrack.setEnabled(false)
50 rtcTrack.dispose() 52 rtcTrack.dispose()
@@ -23,6 +23,11 @@ open class TrackPublication( @@ -23,6 +23,11 @@ open class TrackPublication(
23 get() { 23 get() {
24 return track != null 24 return track != null
25 } 25 }
  26 + var simulcasted: Boolean? = null
  27 + internal set
  28 + var dimensions: Track.Dimensions? = null
  29 + internal set
  30 +
26 31
27 var participant: WeakReference<Participant> 32 var participant: WeakReference<Participant>
28 33
@@ -31,7 +36,7 @@ open class TrackPublication( @@ -31,7 +36,7 @@ open class TrackPublication(
31 name = info.name 36 name = info.name
32 kind = Track.Kind.fromProto(info.type) 37 kind = Track.Kind.fromProto(info.type)
33 this.participant = WeakReference(participant) 38 this.participant = WeakReference(participant)
34 - muted = info.muted 39 + updateFromInfo(info)
35 } 40 }
36 41
37 fun updateFromInfo(info: LivekitModels.TrackInfo) { 42 fun updateFromInfo(info: LivekitModels.TrackInfo) {
@@ -39,5 +44,9 @@ open class TrackPublication( @@ -39,5 +44,9 @@ open class TrackPublication(
39 name = info.name 44 name = info.name
40 kind = Track.Kind.fromProto(info.type) 45 kind = Track.Kind.fromProto(info.type)
41 muted = info.muted 46 muted = info.muted
  47 + if (kind == Track.Kind.VIDEO) {
  48 + simulcasted = info.simulcast
  49 + dimensions = Track.Dimensions(info.width, info.height)
  50 + }
42 } 51 }
43 } 52 }