Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
11 changes: 4 additions & 7 deletions Sources/LiveKit/Protocols/VideoRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,20 @@ public protocol VideoRenderer {
@objc optional
func set(size: CGSize)

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

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

class VideoRendererAdapter: NSObject, LKRTCVideoRenderer {
private weak var target: VideoRenderer?
private weak var localVideoTrack: LocalVideoTrack?

init(target: VideoRenderer, localVideoTrack: LocalVideoTrack?) {
init(target: VideoRenderer) {
self.target = target
self.localVideoTrack = localVideoTrack
}

func setSize(_ size: CGSize) {
Expand All @@ -61,9 +60,7 @@ class VideoRendererAdapter: NSObject, LKRTCVideoRenderer {
func renderFrame(_ frame: LKRTCVideoFrame?) {
guard let frame = frame?.toLKType() else { return }
target?.render?(frame: frame)

let cameraCapturer = localVideoTrack?.capturer as? CameraCapturer
target?.render?(frame: frame, captureDevice: cameraCapturer?.device, captureOptions: cameraCapturer?.options)
target?.render?(frame: frame, captureDevice: nil, captureOptions: nil)
}

// Proxy the equality operators
Expand Down
1 change: 1 addition & 0 deletions Sources/LiveKit/Track/Capturers/VideoCapturer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ extension VideoCapturer {
if rendererDelegates.isDelegatesNotEmpty {
if let lkVideoFrame = frame.toLKType() {
rendererDelegates.notify { renderer in
renderer.render?(frame: lkVideoFrame)
renderer.render?(frame: lkVideoFrame, captureDevice: device, captureOptions: options)
}
}
Expand Down
10 changes: 6 additions & 4 deletions Sources/LiveKit/Track/Local/LocalVideoTrack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ internal import LiveKitWebRTC
#endif

@objc
public class LocalVideoTrack: Track, LocalTrack, VideoTrack {
public class LocalVideoTrack: Track, LocalTrack {
@objc
public internal(set) var capturer: VideoCapturer

Expand Down Expand Up @@ -67,12 +67,14 @@ public class LocalVideoTrack: Track, LocalTrack, VideoTrack {
}
}

public extension LocalVideoTrack {
func add(videoRenderer: VideoRenderer) {
// MARK: - VideoTrack Protocol

extension LocalVideoTrack: VideoTrack {
public func add(videoRenderer: VideoRenderer) {
capturer.rendererDelegates.add(delegate: videoRenderer)
}

func remove(videoRenderer: VideoRenderer) {
public func remove(videoRenderer: VideoRenderer) {
capturer.rendererDelegates.remove(delegate: videoRenderer)
}
}
Expand Down
32 changes: 26 additions & 6 deletions Sources/LiveKit/Track/Remote/RemoteVideoTrack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ internal import LiveKitWebRTC
#endif

@objc
public class RemoteVideoTrack: Track, RemoteTrack, VideoTrack {
public class RemoteVideoTrack: Track, RemoteTrack {
init(name: String,
source: Track.Source,
track: LKRTCMediaStreamTrack,
Expand All @@ -35,12 +35,32 @@ public class RemoteVideoTrack: Track, RemoteTrack, VideoTrack {
}
}

public extension RemoteVideoTrack {
func add(videoRenderer: VideoRenderer) {
super._add(videoRenderer: videoRenderer)
// MARK: - VideoTrack Protocol

extension RemoteVideoTrack: VideoTrack {
public func add(videoRenderer: VideoRenderer) {
guard let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
log("mediaTrack is not a RTCVideoTrack", .error)
return
}

_state.mutate {
$0.videoRenderers.add(videoRenderer)
}

rtcVideoTrack.add(VideoRendererAdapter(target: videoRenderer))
}

func remove(videoRenderer: VideoRenderer) {
super._remove(videoRenderer: videoRenderer)
public func remove(videoRenderer: VideoRenderer) {
guard let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
log("mediaTrack is not a RTCVideoTrack", .error)
return
}

_state.mutate {
$0.videoRenderers.remove(videoRenderer)
}

rtcVideoTrack.remove(VideoRendererAdapter(target: videoRenderer))
}
}
33 changes: 0 additions & 33 deletions Sources/LiveKit/Track/Track.swift
Original file line number Diff line number Diff line change
Expand Up @@ -357,39 +357,6 @@ extension Track {
}
}

// MARK: - VideoTrack

// workaround for error:
// @objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
//
extension Track {
func _add(videoRenderer: VideoRenderer) {
guard self is VideoTrack, let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
log("mediaTrack is not a RTCVideoTrack", .error)
return
}

_state.mutate {
$0.videoRenderers.add(videoRenderer)
}

rtcVideoTrack.add(VideoRendererAdapter(target: videoRenderer, localVideoTrack: self as? LocalVideoTrack))
}

func _remove(videoRenderer: VideoRenderer) {
guard self is VideoTrack, let rtcVideoTrack = mediaTrack as? LKRTCVideoTrack else {
log("mediaTrack is not a RTCVideoTrack", .error)
return
}

_state.mutate {
$0.videoRenderers.remove(videoRenderer)
}

rtcVideoTrack.remove(VideoRendererAdapter(target: videoRenderer, localVideoTrack: self as? LocalVideoTrack))
}
}

// MARK: - Identifiable (SwiftUI)

extension Track: Identifiable {
Expand Down