Skip to content

Commit bf2129a

Browse files
authored
VideoRenderer protocol related fixes (#411)
* Remove unnecessary code. * Always invoke both `render(frame:)` and `render(frame:captureDevice:captureOptions:)`.
1 parent c741edc commit bf2129a

File tree

5 files changed

+37
-50
lines changed

5 files changed

+37
-50
lines changed

Sources/LiveKit/Protocols/VideoRenderer.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,20 @@ public protocol VideoRenderer {
3737
@objc optional
3838
func set(size: CGSize)
3939

40+
/// A ``VideoFrame`` is ready and should be processed.
4041
@objc optional
4142
func render(frame: VideoFrame)
4243

43-
// Only invoked for local tracks, provides additional capture time options
44+
/// In addition to ``VideoFrame``, provide capture-time information if available.
4445
@objc optional
4546
func render(frame: VideoFrame, captureDevice: AVCaptureDevice?, captureOptions: VideoCaptureOptions?)
4647
}
4748

4849
class VideoRendererAdapter: NSObject, LKRTCVideoRenderer {
4950
private weak var target: VideoRenderer?
50-
private weak var localVideoTrack: LocalVideoTrack?
5151

52-
init(target: VideoRenderer, localVideoTrack: LocalVideoTrack?) {
52+
init(target: VideoRenderer) {
5353
self.target = target
54-
self.localVideoTrack = localVideoTrack
5554
}
5655

5756
func setSize(_ size: CGSize) {
@@ -61,9 +60,7 @@ class VideoRendererAdapter: NSObject, LKRTCVideoRenderer {
6160
func renderFrame(_ frame: LKRTCVideoFrame?) {
6261
guard let frame = frame?.toLKType() else { return }
6362
target?.render?(frame: frame)
64-
65-
let cameraCapturer = localVideoTrack?.capturer as? CameraCapturer
66-
target?.render?(frame: frame, captureDevice: cameraCapturer?.device, captureOptions: cameraCapturer?.options)
63+
target?.render?(frame: frame, captureDevice: nil, captureOptions: nil)
6764
}
6865

6966
// Proxy the equality operators

Sources/LiveKit/Track/Capturers/VideoCapturer.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ extension VideoCapturer {
231231
if rendererDelegates.isDelegatesNotEmpty {
232232
if let lkVideoFrame = frame.toLKType() {
233233
rendererDelegates.notify { renderer in
234+
renderer.render?(frame: lkVideoFrame)
234235
renderer.render?(frame: lkVideoFrame, captureDevice: device, captureOptions: options)
235236
}
236237
}

Sources/LiveKit/Track/Local/LocalVideoTrack.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ internal import LiveKitWebRTC
2323
#endif
2424

2525
@objc
26-
public class LocalVideoTrack: Track, LocalTrack, VideoTrack {
26+
public class LocalVideoTrack: Track, LocalTrack {
2727
@objc
2828
public internal(set) var capturer: VideoCapturer
2929

@@ -67,12 +67,14 @@ public class LocalVideoTrack: Track, LocalTrack, VideoTrack {
6767
}
6868
}
6969

70-
public extension LocalVideoTrack {
71-
func add(videoRenderer: VideoRenderer) {
70+
// MARK: - VideoTrack Protocol
71+
72+
extension LocalVideoTrack: VideoTrack {
73+
public func add(videoRenderer: VideoRenderer) {
7274
capturer.rendererDelegates.add(delegate: videoRenderer)
7375
}
7476

75-
func remove(videoRenderer: VideoRenderer) {
77+
public func remove(videoRenderer: VideoRenderer) {
7678
capturer.rendererDelegates.remove(delegate: videoRenderer)
7779
}
7880
}

Sources/LiveKit/Track/Remote/RemoteVideoTrack.swift

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ internal import LiveKitWebRTC
2121
#endif
2222

2323
@objc
24-
public class RemoteVideoTrack: Track, RemoteTrack, VideoTrack {
24+
public class RemoteVideoTrack: Track, RemoteTrack {
2525
init(name: String,
2626
source: Track.Source,
2727
track: LKRTCMediaStreamTrack,
@@ -35,12 +35,32 @@ public class RemoteVideoTrack: Track, RemoteTrack, VideoTrack {
3535
}
3636
}
3737

38-
public extension RemoteVideoTrack {
39-
func add(videoRenderer: VideoRenderer) {
40-
super._add(videoRenderer: videoRenderer)
38+
// MARK: - VideoTrack Protocol
39+
40+
extension RemoteVideoTrack: VideoTrack {
41+
public func add(videoRenderer: VideoRenderer) {
42+
guard let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
43+
log("mediaTrack is not a RTCVideoTrack", .error)
44+
return
45+
}
46+
47+
_state.mutate {
48+
$0.videoRenderers.add(videoRenderer)
49+
}
50+
51+
rtcVideoTrack.add(VideoRendererAdapter(target: videoRenderer))
4152
}
4253

43-
func remove(videoRenderer: VideoRenderer) {
44-
super._remove(videoRenderer: videoRenderer)
54+
public func remove(videoRenderer: VideoRenderer) {
55+
guard let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
56+
log("mediaTrack is not a RTCVideoTrack", .error)
57+
return
58+
}
59+
60+
_state.mutate {
61+
$0.videoRenderers.remove(videoRenderer)
62+
}
63+
64+
rtcVideoTrack.remove(VideoRendererAdapter(target: videoRenderer))
4565
}
4666
}

Sources/LiveKit/Track/Track.swift

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -357,39 +357,6 @@ extension Track {
357357
}
358358
}
359359

360-
// MARK: - VideoTrack
361-
362-
// workaround for error:
363-
// @objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
364-
//
365-
extension Track {
366-
func _add(videoRenderer: VideoRenderer) {
367-
guard self is VideoTrack, let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
368-
log("mediaTrack is not a RTCVideoTrack", .error)
369-
return
370-
}
371-
372-
_state.mutate {
373-
$0.videoRenderers.add(videoRenderer)
374-
}
375-
376-
rtcVideoTrack.add(VideoRendererAdapter(target: videoRenderer, localVideoTrack: self as? LocalVideoTrack))
377-
}
378-
379-
func _remove(videoRenderer: VideoRenderer) {
380-
guard self is VideoTrack, let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
381-
log("mediaTrack is not a RTCVideoTrack", .error)
382-
return
383-
}
384-
385-
_state.mutate {
386-
$0.videoRenderers.remove(videoRenderer)
387-
}
388-
389-
rtcVideoTrack.remove(VideoRendererAdapter(target: videoRenderer, localVideoTrack: self as? LocalVideoTrack))
390-
}
391-
}
392-
393360
// MARK: - Identifiable (SwiftUI)
394361

395362
extension Track: Identifiable {

0 commit comments

Comments
 (0)