Skip to content

Commit 5d21906

Browse files
One to one call
1 parent 3535008 commit 5d21906

14 files changed

Lines changed: 1114 additions & 69 deletions

File tree

src/main/kotlin/io/openfuture/openmessenger/kurento/KurentoWebsocketConfigurer.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package io.openfuture.openmessenger.kurento
22

33
import io.openfuture.openmessenger.kurento.groupcall.CallHandler
44
import io.openfuture.openmessenger.kurento.groupcall.RoomManager
5-
import io.openfuture.openmessenger.kurento.groupcall.UserRegistry
65
import org.kurento.client.KurentoClient
76
import org.springframework.beans.factory.annotation.Value
87
import org.springframework.context.annotation.Bean
@@ -11,6 +10,7 @@ import org.springframework.web.socket.config.annotation.EnableWebSocket
1110
import org.springframework.web.socket.config.annotation.WebSocketConfigurer
1211
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
1312
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean
13+
import io.openfuture.openmessenger.kurento.recording.RecordingCallHandler as RecordingCallHandler
1414

1515
@Configuration
1616
@EnableWebSocket
@@ -38,12 +38,19 @@ class KurentoWebsocketConfigurer(
3838
override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) {
3939
registry.addHandler(groupCallHandler(), "/groupcall").setAllowedOriginPatterns("*")
4040
registry.addHandler(handler(), "/helloworld").setAllowedOriginPatterns("*")
41+
registry.addHandler(callHandler(), "/call").setAllowedOrigins("*")
4142
}
43+
4244
@Bean
4345
fun registry(): UserRegistry {
4446
return UserRegistry()
4547
}
4648

49+
@Bean
50+
fun recordingUserRegistry(): io.openfuture.openmessenger.kurento.recording.UserRegistry {
51+
return io.openfuture.openmessenger.kurento.recording.UserRegistry()
52+
}
53+
4754
@Bean
4855
fun roomManager(): RoomManager {
4956
return RoomManager()
@@ -54,5 +61,10 @@ class KurentoWebsocketConfigurer(
5461
return CallHandler()
5562
}
5663

64+
@Bean
65+
fun callHandler(): RecordingCallHandler {
66+
return RecordingCallHandler(kurentoClient(), recordingUserRegistry())
67+
}
68+
5769
}
5870

src/main/kotlin/io/openfuture/openmessenger/kurento/groupcall/UserRegistry.kt renamed to src/main/kotlin/io/openfuture/openmessenger/kurento/UserRegistry.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package io.openfuture.openmessenger.kurento.groupcall
1+
package io.openfuture.openmessenger.kurento
22

3+
import io.openfuture.openmessenger.kurento.groupcall.UserSession
34
import org.springframework.web.socket.WebSocketSession
45
import java.util.concurrent.ConcurrentHashMap
56

src/main/kotlin/io/openfuture/openmessenger/kurento/groupcall/CallHandler.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.openfuture.openmessenger.kurento.groupcall
33
import com.google.gson.Gson
44
import com.google.gson.GsonBuilder
55
import com.google.gson.JsonObject
6+
import io.openfuture.openmessenger.kurento.UserRegistry
67
import org.kurento.client.IceCandidate
78
import org.slf4j.Logger
89
import org.slf4j.LoggerFactory
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.openfuture.openmessenger.kurento.recording
2+
3+
import org.kurento.client.*
4+
import java.text.SimpleDateFormat
5+
import java.util.*
6+
7+
8+
class CallMediaPipeline(kurento: KurentoClient, from: String, to: String?) {
9+
val pipeline: MediaPipeline = kurento.createMediaPipeline()
10+
11+
val callerWebRtcEp: WebRtcEndpoint = WebRtcEndpoint.Builder(pipeline).build()
12+
val calleeWebRtcEp: WebRtcEndpoint = WebRtcEndpoint.Builder(pipeline).build()
13+
private val recorderCaller: RecorderEndpoint
14+
private val recorderCallee: RecorderEndpoint
15+
16+
init {
17+
recorderCaller = RecorderEndpoint.Builder(pipeline, RECORDING_PATH + from + RECORDING_EXT)
18+
.build()
19+
recorderCallee = RecorderEndpoint.Builder(pipeline, RECORDING_PATH + to + RECORDING_EXT)
20+
.build()
21+
22+
callerWebRtcEp.connect(calleeWebRtcEp)
23+
calleeWebRtcEp.connect(callerWebRtcEp)
24+
val composite: Composite = Composite.Builder(pipeline).build()
25+
26+
val callerPort: HubPort = HubPort.Builder(composite).build()
27+
val calleePort: HubPort = HubPort.Builder(composite).build()
28+
val out = HubPort.Builder(composite).build()
29+
30+
callerWebRtcEp.connect(callerPort)
31+
calleeWebRtcEp.connect(calleePort)
32+
33+
out.connect(recorderCallee)
34+
35+
// Connections
36+
callerWebRtcEp.connect(calleeWebRtcEp)
37+
callerWebRtcEp.connect(recorderCaller)
38+
39+
calleeWebRtcEp.connect(callerWebRtcEp)
40+
calleeWebRtcEp.connect(recorderCallee)
41+
}
42+
43+
fun record() {
44+
recorderCaller.record()
45+
recorderCallee.record()
46+
}
47+
48+
fun generateSdpAnswerForCaller(sdpOffer: String?): String {
49+
return callerWebRtcEp.processOffer(sdpOffer)
50+
}
51+
52+
fun generateSdpAnswerForCallee(sdpOffer: String?): String {
53+
return calleeWebRtcEp.processOffer(sdpOffer)
54+
}
55+
56+
companion object {
57+
private val df = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-S")
58+
val RECORDING_PATH: String = "file:///tmp/" + df.format(Date()) + "-"
59+
const val RECORDING_EXT: String = ".webm"
60+
}
61+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.openfuture.openmessenger.kurento.recording
2+
3+
import com.google.gson.JsonObject
4+
import io.openfuture.openmessenger.kurento.recording.CallMediaPipeline.Companion.RECORDING_EXT
5+
import io.openfuture.openmessenger.kurento.recording.CallMediaPipeline.Companion.RECORDING_PATH
6+
import org.kurento.client.KurentoClient
7+
import org.kurento.client.MediaPipeline
8+
import org.kurento.client.PlayerEndpoint
9+
import org.kurento.client.WebRtcEndpoint
10+
import org.slf4j.Logger
11+
import org.slf4j.LoggerFactory
12+
import org.springframework.web.socket.TextMessage
13+
import org.springframework.web.socket.WebSocketSession
14+
import java.io.IOException
15+
16+
class PlayMediaPipeline(kurento: KurentoClient, user: String, session: WebSocketSession) {
17+
val pipeline: MediaPipeline = kurento.createMediaPipeline()
18+
var webRtc: WebRtcEndpoint?
19+
val player: PlayerEndpoint
20+
21+
init {
22+
webRtc = WebRtcEndpoint.Builder(pipeline).build()
23+
player = PlayerEndpoint.Builder(pipeline, RECORDING_PATH + user + RECORDING_EXT).build()
24+
25+
player.connect(webRtc)
26+
27+
player.addErrorListener { event ->
28+
log.info("ErrorEvent: {}", event.description)
29+
sendPlayEnd(session)
30+
}
31+
}
32+
33+
fun sendPlayEnd(session: WebSocketSession) {
34+
try {
35+
val response: JsonObject = JsonObject()
36+
response.addProperty("id", "playEnd")
37+
session.sendMessage(TextMessage(response.toString()))
38+
} catch (e: IOException) {
39+
log.error("Error sending playEndOfStream message", e)
40+
}
41+
42+
// Release pipeline
43+
pipeline.release()
44+
this.webRtc = null
45+
}
46+
47+
fun play() {
48+
player.play()
49+
}
50+
51+
fun generateSdpAnswer(sdpOffer: String?): String {
52+
val processOffer: String? = webRtc?.processOffer(sdpOffer)
53+
return processOffer!!
54+
}
55+
56+
companion object {
57+
private val log: Logger = LoggerFactory.getLogger(PlayMediaPipeline::class.java)
58+
}
59+
}

0 commit comments

Comments
 (0)