Skip to content

Commit ca70dc2

Browse files
authored
Picture-in-picture delete SDK rendering mode (#458)
* Picture-in-picture delete SDK rendering mode * Fix the picture-in-picture scene bug --------- Co-authored-by: qinhui <>
1 parent e872c45 commit ca70dc2

File tree

14 files changed

+48
-832
lines changed

14 files changed

+48
-832
lines changed

iOS/APIExample-SwiftUI/APIExample-SwiftUI.xcodeproj/project.pbxproj

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,11 @@
9292
4C9309C22CBA91530085EFF9 /* JoinMultiChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309722CBA91520085EFF9 /* JoinMultiChannel.swift */; };
9393
4C9309C32CBA91530085EFF9 /* JoinMultiChannelRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309732CBA91520085EFF9 /* JoinMultiChannelRTC.swift */; };
9494
4C9309C42CBA91530085EFF9 /* PictureInPicture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309752CBA91530085EFF9 /* PictureInPicture.swift */; };
95-
4C9309C52CBA91530085EFF9 /* SDKRenderRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309772CBA91530085EFF9 /* SDKRenderRTC.swift */; };
96-
4C9309C62CBA91530085EFF9 /* SDKRenderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309782CBA91530085EFF9 /* SDKRenderViewModel.swift */; };
97-
4C9309C72CBA91530085EFF9 /* SDKRenderExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309792CBA91530085EFF9 /* SDKRenderExample.swift */; };
9895
4C9309C82CBA91530085EFF9 /* PIPDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097B2CBA91530085EFF9 /* PIPDisplayView.swift */; };
9996
4C9309C92CBA91530085EFF9 /* PixelBufferRenderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097C2CBA91530085EFF9 /* PixelBufferRenderView.swift */; };
100-
4C9309CA2CBA91530085EFF9 /* CustomRenderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097E2CBA91530085EFF9 /* CustomRenderViewModel.swift */; };
101-
4C9309CB2CBA91530085EFF9 /* CustomRenderRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097F2CBA91530085EFF9 /* CustomRenderRTC.swift */; };
102-
4C9309CC2CBA91530085EFF9 /* CustomRenderExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309802CBA91530085EFF9 /* CustomRenderExample.swift */; };
97+
4C9309CA2CBA91530085EFF9 /* PixelBufferRenderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097E2CBA91530085EFF9 /* PixelBufferRenderViewModel.swift */; };
98+
4C9309CB2CBA91530085EFF9 /* PixelBufferRenderRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93097F2CBA91530085EFF9 /* PixelBufferRenderRTC.swift */; };
99+
4C9309CC2CBA91530085EFF9 /* PixelBufferRenderExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309802CBA91530085EFF9 /* PixelBufferRenderExample.swift */; };
103100
4C9309CD2CBA91530085EFF9 /* VideoMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309822CBA91530085EFF9 /* VideoMetadata.swift */; };
104101
4C9309CE2CBA91530085EFF9 /* VideoMetaDataRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309832CBA91530085EFF9 /* VideoMetaDataRTC.swift */; };
105102
4C9309CF2CBA91530085EFF9 /* RTMPStreamRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9309852CBA91530085EFF9 /* RTMPStreamRTC.swift */; };
@@ -269,14 +266,11 @@
269266
4C9309722CBA91520085EFF9 /* JoinMultiChannel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinMultiChannel.swift; sourceTree = "<group>"; };
270267
4C9309732CBA91520085EFF9 /* JoinMultiChannelRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinMultiChannelRTC.swift; sourceTree = "<group>"; };
271268
4C9309752CBA91530085EFF9 /* PictureInPicture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PictureInPicture.swift; sourceTree = "<group>"; };
272-
4C9309772CBA91530085EFF9 /* SDKRenderRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SDKRenderRTC.swift; sourceTree = "<group>"; };
273-
4C9309782CBA91530085EFF9 /* SDKRenderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SDKRenderViewModel.swift; sourceTree = "<group>"; };
274-
4C9309792CBA91530085EFF9 /* SDKRenderExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SDKRenderExample.swift; sourceTree = "<group>"; };
275269
4C93097B2CBA91530085EFF9 /* PIPDisplayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIPDisplayView.swift; sourceTree = "<group>"; };
276270
4C93097C2CBA91530085EFF9 /* PixelBufferRenderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PixelBufferRenderView.swift; sourceTree = "<group>"; };
277-
4C93097E2CBA91530085EFF9 /* CustomRenderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomRenderViewModel.swift; sourceTree = "<group>"; };
278-
4C93097F2CBA91530085EFF9 /* CustomRenderRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomRenderRTC.swift; sourceTree = "<group>"; };
279-
4C9309802CBA91530085EFF9 /* CustomRenderExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomRenderExample.swift; sourceTree = "<group>"; };
271+
4C93097E2CBA91530085EFF9 /* PixelBufferRenderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PixelBufferRenderViewModel.swift; sourceTree = "<group>"; };
272+
4C93097F2CBA91530085EFF9 /* PixelBufferRenderRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PixelBufferRenderRTC.swift; sourceTree = "<group>"; };
273+
4C9309802CBA91530085EFF9 /* PixelBufferRenderExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PixelBufferRenderExample.swift; sourceTree = "<group>"; };
280274
4C9309822CBA91530085EFF9 /* VideoMetadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoMetadata.swift; sourceTree = "<group>"; };
281275
4C9309832CBA91530085EFF9 /* VideoMetaDataRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoMetaDataRTC.swift; sourceTree = "<group>"; };
282276
4C9309852CBA91530085EFF9 /* RTMPStreamRTC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTMPStreamRTC.swift; sourceTree = "<group>"; };
@@ -760,23 +754,12 @@
760754
isa = PBXGroup;
761755
children = (
762756
4C9309752CBA91530085EFF9 /* PictureInPicture.swift */,
763-
4C9309762CBA91530085EFF9 /* SDKRender */,
764757
4C93097A2CBA91530085EFF9 /* PIPCommon */,
765758
4C93097D2CBA91530085EFF9 /* CustomRender */,
766759
);
767760
path = PictureInPicture;
768761
sourceTree = "<group>";
769762
};
770-
4C9309762CBA91530085EFF9 /* SDKRender */ = {
771-
isa = PBXGroup;
772-
children = (
773-
4C9309772CBA91530085EFF9 /* SDKRenderRTC.swift */,
774-
4C9309782CBA91530085EFF9 /* SDKRenderViewModel.swift */,
775-
4C9309792CBA91530085EFF9 /* SDKRenderExample.swift */,
776-
);
777-
path = SDKRender;
778-
sourceTree = "<group>";
779-
};
780763
4C93097A2CBA91530085EFF9 /* PIPCommon */ = {
781764
isa = PBXGroup;
782765
children = (
@@ -789,9 +772,9 @@
789772
4C93097D2CBA91530085EFF9 /* CustomRender */ = {
790773
isa = PBXGroup;
791774
children = (
792-
4C93097E2CBA91530085EFF9 /* CustomRenderViewModel.swift */,
793-
4C93097F2CBA91530085EFF9 /* CustomRenderRTC.swift */,
794-
4C9309802CBA91530085EFF9 /* CustomRenderExample.swift */,
775+
4C93097E2CBA91530085EFF9 /* PixelBufferRenderViewModel.swift */,
776+
4C93097F2CBA91530085EFF9 /* PixelBufferRenderRTC.swift */,
777+
4C9309802CBA91530085EFF9 /* PixelBufferRenderExample.swift */,
795778
);
796779
path = CustomRender;
797780
sourceTree = "<group>";
@@ -1100,7 +1083,7 @@
11001083
buildActionMask = 2147483647;
11011084
files = (
11021085
4C93076A2CB961150085EFF9 /* CircularBuffer.c in Sources */,
1103-
4C9309CA2CBA91530085EFF9 /* CustomRenderViewModel.swift in Sources */,
1086+
4C9309CA2CBA91530085EFF9 /* PixelBufferRenderViewModel.swift in Sources */,
11041087
4C9309D52CBA91530085EFF9 /* AudioWaveformRTC.swift in Sources */,
11051088
4C9309CE2CBA91530085EFF9 /* VideoMetaDataRTC.swift in Sources */,
11061089
4C9309C12CBA91530085EFF9 /* CustomPCMAudioSource.swift in Sources */,
@@ -1113,7 +1096,7 @@
11131096
4C93077A2CB961150085EFF9 /* VideoUIView.swift in Sources */,
11141097
4C9309B92CBA91530085EFF9 /* LiveStreaming.swift in Sources */,
11151098
4C9307FC2CBA6F790085EFF9 /* JoinChannelAudio.swift in Sources */,
1116-
4C9309CB2CBA91530085EFF9 /* CustomRenderRTC.swift in Sources */,
1099+
4C9309CB2CBA91530085EFF9 /* PixelBufferRenderRTC.swift in Sources */,
11171100
4C9309D12CBA91530085EFF9 /* CustomAudioRender.swift in Sources */,
11181101
4C93076E2CB961150085EFF9 /* KFMP4Demuxer.m in Sources */,
11191102
4C9309C22CBA91530085EFF9 /* JoinMultiChannel.swift in Sources */,
@@ -1122,7 +1105,7 @@
11221105
4C9309C92CBA91530085EFF9 /* PixelBufferRenderView.swift in Sources */,
11231106
4C93075D2CB961150085EFF9 /* AgoraCustomEncryption.mm in Sources */,
11241107
4C9307652CB961150085EFF9 /* AgoraCameraSourcePush.swift in Sources */,
1125-
4C9309CC2CBA91530085EFF9 /* CustomRenderExample.swift in Sources */,
1108+
4C9309CC2CBA91530085EFF9 /* PixelBufferRenderExample.swift in Sources */,
11261109
4C9308012CBA6F8D0085EFF9 /* JoinChannelVideoRTC.swift in Sources */,
11271110
4C9309DC2CBA91530085EFF9 /* VoiceChanger.swift in Sources */,
11281111
4C93076F2CB961150085EFF9 /* MediaUtils.m in Sources */,
@@ -1139,7 +1122,6 @@
11391122
4C9309ED2CBA95530085EFF9 /* SpatialAudioRTC.swift in Sources */,
11401123
4C9309DA2CBA91530085EFF9 /* RhythmPlayerRTC.swift in Sources */,
11411124
4C9309BB2CBA91530085EFF9 /* CreateDataStream.swift in Sources */,
1142-
4C9309C62CBA91530085EFF9 /* SDKRenderViewModel.swift in Sources */,
11431125
4C9309B62CBA91530085EFF9 /* MutliCameraRTC.swift in Sources */,
11441126
4C93077D2CB961150085EFF9 /* KeyCenter.swift in Sources */,
11451127
4C9307692CB961150085EFF9 /* AgoraMetalShader.metal in Sources */,
@@ -1154,7 +1136,6 @@
11541136
4C9307612CB961150085EFF9 /* NetworkManager.swift in Sources */,
11551137
4C9307C52CB961160085EFF9 /* APIExample_SwiftUIApp.swift in Sources */,
11561138
4C9309DB2CBA91530085EFF9 /* VoiceChangerRTC.swift in Sources */,
1157-
4C9309C72CBA91530085EFF9 /* SDKRenderExample.swift in Sources */,
11581139
F73B018D2CC10E240077B7D2 /* ViewExtensions.swift in Sources */,
11591140
4C9309AB2CBA91530085EFF9 /* RawAudioDataRTC.swift in Sources */,
11601141
4C9307752CB961150085EFF9 /* AgoraPcmSourcePush.swift in Sources */,
@@ -1174,7 +1155,6 @@
11741155
4C93075E2CB961150085EFF9 /* SettingsView.swift in Sources */,
11751156
4C93080C2CBA712F0085EFF9 /* JoinChannelVideoToken.swift in Sources */,
11761157
4C9309BA2CBA91530085EFF9 /* LiveStreamingRTC.swift in Sources */,
1177-
4C9309C52CBA91530085EFF9 /* SDKRenderRTC.swift in Sources */,
11781158
4C9309E42CBA91530085EFF9 /* ContentInspect.swift in Sources */,
11791159
4C9309D92CBA91530085EFF9 /* RhythmPlayer.swift in Sources */,
11801160
4C9307622CB961150085EFF9 /* JSONObject.swift in Sources */,
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import SwiftUI
99

10-
struct CustomRenderMockContainerView: View {
11-
@ObservedObject var viewModel: CustomRenderViewModel
10+
struct PixelBufferRenderMockContainerView: View {
11+
@ObservedObject var viewModel: PixelBufferRenderViewModel
1212

1313
var localView = PixelBufferCustomRenderView()
1414

@@ -23,24 +23,24 @@ struct CustomRenderMockContainerView: View {
2323
}
2424

2525
@available(iOS 15.0, *)
26-
struct CustomRenderExample: View {
26+
struct PixelBufferRenderExample: View {
2727
@State var configs: [String: Any]
2828

2929
//mock data
30-
@StateObject private var customRenderViewModel: CustomRenderViewModel
30+
@StateObject private var customRenderViewModel: PixelBufferRenderViewModel
3131

3232
//pip controller
3333
@StateObject private var pipViewModel: PIPViewModel
3434

35-
let myContainerView: CustomRenderMockContainerView
35+
let myContainerView: PixelBufferRenderMockContainerView
3636

3737
init(configs: [String: Any]) {
3838
_configs = State(initialValue: configs)
3939

40-
let viewModel = CustomRenderViewModel(configs: configs)
40+
let viewModel = PixelBufferRenderViewModel(configs: configs)
4141
_customRenderViewModel = StateObject(wrappedValue: viewModel)
4242

43-
myContainerView = CustomRenderMockContainerView(viewModel: viewModel)
43+
myContainerView = PixelBufferRenderMockContainerView(viewModel: viewModel)
4444
let pipSourceView = UIHostingController(rootView: myContainerView).view!
4545
_pipViewModel = StateObject(wrappedValue: PIPViewModel(pipSourceView: pipSourceView))
4646
}
@@ -84,7 +84,7 @@ struct CustomRenderExample: View {
8484
struct CustomRenderExamplePreviews: PreviewProvider {
8585
static var previews: some View {
8686
if #available(iOS 15.0, *) {
87-
CustomRenderExample(configs: [:])
87+
PixelBufferRenderExample(configs: [:])
8888
} else {
8989
// Fallback on earlier versions
9090
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ protocol CustomRenderRTCProtocol {
4242
@class SDKRenderRTC
4343
@abstract RTC management class, handle RTC connection, video view data management (view based on PixelBufferRenderView self-rendering), channel management
4444
*/
45-
class CustomRenderRTC: NSObject, ObservableObject , CustomRenderRTCProtocol{
45+
class PixelBufferRenderRTC: NSObject, ObservableObject , CustomRenderRTCProtocol{
4646
var videoFrameDelegte: AgoraVideoFrameDelegate?
4747

4848
private var uid: UInt = 0
@@ -71,7 +71,7 @@ class CustomRenderRTC: NSObject, ObservableObject , CustomRenderRTCProtocol{
7171
}
7272
}
7373

74-
extension CustomRenderRTC: AgoraVideoFrameDelegate {
74+
extension PixelBufferRenderRTC: AgoraVideoFrameDelegate {
7575
func onCapture(_ videoFrame: AgoraOutputVideoFrame, sourceType: AgoraVideoSourceType) -> Bool {
7676
if let localView = localView, let pixelBuffer = videoFrame.pixelBuffer {
7777
localView.renderVideoPixelBuffer(pixelBuffer: pixelBuffer, width: videoFrame.width, height: videoFrame.height)
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import Foundation
1111
@class CustomRenderViewModel(
1212
@abstract This type has nothing to do with PIP and only simulates the implementation of rtc services for service reference and can be modified according to the service
1313
*/
14-
class CustomRenderViewModel: NSObject, ObservableObject {
14+
class PixelBufferRenderViewModel: NSObject, ObservableObject {
1515
@Published var remoteRenderViews: [PixelBufferCustomRenderView] = []
1616
private var isJoined = false
17-
var customRenderRtc: CustomRenderRTC
17+
var customRenderRtc: PixelBufferRenderRTC
1818
var configs: [String: Any]
1919

2020
private lazy var rtcConfig: AgoraRtcEngineConfig = {
@@ -40,7 +40,7 @@ class CustomRenderViewModel: NSObject, ObservableObject {
4040
}()
4141

4242
init(configs: [String: Any]) {
43-
self.customRenderRtc = CustomRenderRTC()
43+
self.customRenderRtc = PixelBufferRenderRTC()
4444
self.configs = configs
4545
super.init()
4646
}
@@ -88,7 +88,7 @@ class CustomRenderViewModel: NSObject, ObservableObject {
8888
}
8989
}
9090

91-
extension CustomRenderViewModel: AgoraRtcEngineDelegate {
91+
extension PixelBufferRenderViewModel: AgoraRtcEngineDelegate {
9292
func rtcEngine(_ engine: AgoraRtcEngineKit, didJoinChannel channel: String, withUid uid: UInt, elapsed: Int) {
9393
self.isJoined = true
9494
}

iOS/APIExample-SwiftUI/APIExample-SwiftUI/Examples/Advanced/PictureInPicture/PictureInPicture.swift

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,21 @@
77

88
import SwiftUI
99

10-
enum PipType {
11-
case sdkRender, customRender
12-
}
13-
1410
struct PipItem: Identifiable {
1511
let id = UUID()
1612
var name: String
17-
var type: PipType
1813
}
1914

2015
struct PictureInPictureEntry: View {
2116
var items: [PipItem] = [
22-
PipItem(name: "PIP Custom Render", type: .customRender),
23-
PipItem(name: "PIP RTC SDK Render", type: .sdkRender)
17+
PipItem(name: "Pixel Buffer Render"),
2418
]
2519

2620
var body: some View {
2721
List {
2822
ForEach(items) { item in
2923
NavigationLink(destination: {
30-
let entry = PictureInPictureJoinEntry(pipType: item.type)
24+
let entry = PictureInPictureJoinEntry()
3125
entry.navigationTitle(item.name)
3226
}) {
3327
Text(item.name)
@@ -38,7 +32,6 @@ struct PictureInPictureEntry: View {
3832
}
3933

4034
struct PictureInPictureJoinEntry: View {
41-
var pipType: PipType
4235
@State private var channelName: String = ""
4336
@State private var isActive = false
4437
@State private var configs: [String: Any] = [:]
@@ -54,22 +47,12 @@ struct PictureInPictureJoinEntry: View {
5447
Text("Join Channel")
5548
}.disabled(channelName.isEmpty)
5649
Spacer()
57-
if pipType == .sdkRender {
58-
if #available(iOS 15.0, *) {
59-
NavigationLink(destination: sdkRenderView().navigationTitle(channelName).navigationBarTitleDisplayMode(.inline), isActive: $isActive) {
60-
EmptyView()
61-
}
62-
} else {
63-
// Fallback on earlier versions
50+
if #available(iOS 15.0, *) {
51+
NavigationLink(destination: customRenderView().navigationTitle(channelName).navigationBarTitleDisplayMode(.inline), isActive: $isActive) {
52+
EmptyView()
6453
}
6554
} else {
66-
if #available(iOS 15.0, *) {
67-
NavigationLink(destination: customRenderView().navigationTitle(channelName).navigationBarTitleDisplayMode(.inline), isActive: $isActive) {
68-
EmptyView()
69-
}
70-
} else {
71-
// Fallback on earlier versions
72-
}
55+
// Fallback on earlier versions
7356
}
7457

7558
Spacer()
@@ -78,19 +61,14 @@ struct PictureInPictureJoinEntry: View {
7861
}
7962

8063
@available(iOS 15.0, *)
81-
private func customRenderView() -> CustomRenderExample {
82-
return CustomRenderExample(configs: configs)
83-
}
84-
85-
@available(iOS 15.0, *)
86-
private func sdkRenderView() -> SDKRenderExample{
87-
return SDKRenderExample(configs: configs)
64+
private func customRenderView() -> PixelBufferRenderExample {
65+
return PixelBufferRenderExample(configs: configs)
8866
}
8967

9068
}
9169

9270
struct PictureInPictureJoinEntryPreviews: PreviewProvider {
9371
static var previews: some View {
94-
PictureInPictureJoinEntry(pipType: .customRender)
72+
PictureInPictureJoinEntry()
9573
}
9674
}

0 commit comments

Comments
 (0)