mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-11 20:01:35 +00:00
sendrecv: try to add a data channel
This commit is contained in:
parent
7865c31387
commit
547f296293
3 changed files with 103 additions and 0 deletions
|
@ -40,6 +40,7 @@ enum AppState {
|
||||||
|
|
||||||
static GMainLoop *loop;
|
static GMainLoop *loop;
|
||||||
static GstElement *pipe1, *webrtc1;
|
static GstElement *pipe1, *webrtc1;
|
||||||
|
static GObject *send_channel, *receive_channel;
|
||||||
|
|
||||||
static SoupWebsocketConnection *ws_conn = NULL;
|
static SoupWebsocketConnection *ws_conn = NULL;
|
||||||
static enum AppState app_state = 0;
|
static enum AppState app_state = 0;
|
||||||
|
@ -274,6 +275,54 @@ on_negotiation_needed (GstElement * element, gpointer user_data)
|
||||||
#define RTP_CAPS_OPUS "application/x-rtp,media=audio,encoding-name=OPUS,payload="
|
#define RTP_CAPS_OPUS "application/x-rtp,media=audio,encoding-name=OPUS,payload="
|
||||||
#define RTP_CAPS_VP8 "application/x-rtp,media=video,encoding-name=VP8,payload="
|
#define RTP_CAPS_VP8 "application/x-rtp,media=video,encoding-name=VP8,payload="
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_channel_on_error (GObject * dc, gpointer user_data)
|
||||||
|
{
|
||||||
|
cleanup_and_quit_loop ("Data channel error", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_channel_on_open (GObject * dc, gpointer user_data)
|
||||||
|
{
|
||||||
|
GBytes *bytes = g_bytes_new ("data", strlen("data"));
|
||||||
|
g_print ("data channel opened\n");
|
||||||
|
g_signal_emit_by_name (dc, "send-string", "Hi! from GStreamer");
|
||||||
|
g_signal_emit_by_name (dc, "send-data", bytes);
|
||||||
|
g_bytes_unref (bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_channel_on_close (GObject * dc, gpointer user_data)
|
||||||
|
{
|
||||||
|
cleanup_and_quit_loop ("Data channel closed", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
data_channel_on_message_string (GObject * dc, gchar *str, gpointer user_data)
|
||||||
|
{
|
||||||
|
g_print ("Received data channel message: %s\n", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
connect_data_channel_signals (GObject * data_channel)
|
||||||
|
{
|
||||||
|
g_signal_connect (data_channel, "on-error", G_CALLBACK (data_channel_on_error),
|
||||||
|
NULL);
|
||||||
|
g_signal_connect (data_channel, "on-open", G_CALLBACK (data_channel_on_open),
|
||||||
|
NULL);
|
||||||
|
g_signal_connect (data_channel, "on-close", G_CALLBACK (data_channel_on_close),
|
||||||
|
NULL);
|
||||||
|
g_signal_connect (data_channel, "on-message-string", G_CALLBACK (data_channel_on_message_string),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_data_channel (GstElement * webrtc, GObject * data_channel, gpointer user_data)
|
||||||
|
{
|
||||||
|
connect_data_channel_signals (data_channel);
|
||||||
|
receive_channel = data_channel;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
start_pipeline (void)
|
start_pipeline (void)
|
||||||
{
|
{
|
||||||
|
@ -306,6 +355,17 @@ start_pipeline (void)
|
||||||
* added by us too, see on_server_message() */
|
* added by us too, see on_server_message() */
|
||||||
g_signal_connect (webrtc1, "on-ice-candidate",
|
g_signal_connect (webrtc1, "on-ice-candidate",
|
||||||
G_CALLBACK (send_ice_candidate_message), NULL);
|
G_CALLBACK (send_ice_candidate_message), NULL);
|
||||||
|
g_signal_emit_by_name (webrtc1, "create-data-channel", "channel", NULL,
|
||||||
|
&send_channel);
|
||||||
|
if (send_channel) {
|
||||||
|
g_print ("Created data channel\n");
|
||||||
|
connect_data_channel_signals (send_channel);
|
||||||
|
} else {
|
||||||
|
g_print ("Could not create data channel, is usrsctp available?\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_connect (webrtc1, "on-data-channel", G_CALLBACK (on_data_channel),
|
||||||
|
NULL);
|
||||||
/* Incoming streams will be exposed via this signal */
|
/* Incoming streams will be exposed via this signal */
|
||||||
g_signal_connect (webrtc1, "pad-added", G_CALLBACK (on_incoming_stream),
|
g_signal_connect (webrtc1, "pad-added", G_CALLBACK (on_incoming_stream),
|
||||||
pipe1);
|
pipe1);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
<body>
|
<body>
|
||||||
<div><video id="stream" autoplay>Your browser doesn't support video</video></div>
|
<div><video id="stream" autoplay>Your browser doesn't support video</video></div>
|
||||||
<div>Status: <span id="status">unknown</span></div>
|
<div>Status: <span id="status">unknown</span></div>
|
||||||
|
<div><textarea id="text" cols=40 rows=4></textarea></div>
|
||||||
<div>Our id is <b id="peer-id">unknown</b></div>
|
<div>Our id is <b id="peer-id">unknown</b></div>
|
||||||
<br/>
|
<br/>
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -20,6 +20,7 @@ var default_constraints = {video: true, audio: true};
|
||||||
|
|
||||||
var connect_attempts = 0;
|
var connect_attempts = 0;
|
||||||
var peer_connection;
|
var peer_connection;
|
||||||
|
var send_channel;
|
||||||
var ws_conn;
|
var ws_conn;
|
||||||
// Promise for local stream after constraints are approved by the user
|
// Promise for local stream after constraints are approved by the user
|
||||||
var local_stream_promise;
|
var local_stream_promise;
|
||||||
|
@ -234,6 +235,41 @@ function errorUserMediaHandler() {
|
||||||
setError("Browser doesn't support getUserMedia!");
|
setError("Browser doesn't support getUserMedia!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleDataChannelOpen = (event) =>{
|
||||||
|
console.log("dataChannel.OnOpen", event);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDataChannelMessageReceived = (event) =>{
|
||||||
|
console.log("dataChannel.OnMessage:", event, event.data.type);
|
||||||
|
|
||||||
|
setStatus("Received data channel message");
|
||||||
|
if (typeof event.data === 'string' || event.data instanceof String) {
|
||||||
|
console.log('Incoming string message: ' + event.data);
|
||||||
|
textarea = document.getElementById("text")
|
||||||
|
textarea.value = textarea.value + '\n' + event.data
|
||||||
|
} else {
|
||||||
|
console.log('Incoming data message');
|
||||||
|
}
|
||||||
|
send_channel.send("Hi! (from browser)");
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDataChannelError = (error) =>{
|
||||||
|
console.log("dataChannel.OnError:", error);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDataChannelClose = (event) =>{
|
||||||
|
console.log("dataChannel.OnClose", event);
|
||||||
|
};
|
||||||
|
|
||||||
|
function onDataChannel(event) {
|
||||||
|
setStatus("Data channel created");
|
||||||
|
let receiveChannel = event.channel;
|
||||||
|
receiveChannel.onopen = handleDataChannelOpen;
|
||||||
|
receiveChannel.onmessage = handleDataChannelMessageReceived;
|
||||||
|
receiveChannel.onerror = handleDataChannelError;
|
||||||
|
receiveChannel.onclose = handleDataChannelClose;
|
||||||
|
}
|
||||||
|
|
||||||
function createCall(msg) {
|
function createCall(msg) {
|
||||||
// Reset connection attempts because we connected successfully
|
// Reset connection attempts because we connected successfully
|
||||||
connect_attempts = 0;
|
connect_attempts = 0;
|
||||||
|
@ -241,6 +277,12 @@ function createCall(msg) {
|
||||||
console.log('Creating RTCPeerConnection');
|
console.log('Creating RTCPeerConnection');
|
||||||
|
|
||||||
peer_connection = new RTCPeerConnection(rtc_configuration);
|
peer_connection = new RTCPeerConnection(rtc_configuration);
|
||||||
|
send_channel = peer_connection.createDataChannel('label', null);
|
||||||
|
send_channel.onopen = handleDataChannelOpen;
|
||||||
|
send_channel.onmessage = handleDataChannelMessageReceived;
|
||||||
|
send_channel.onerror = handleDataChannelError;
|
||||||
|
send_channel.onclose = handleDataChannelClose;
|
||||||
|
peer_connection.ondatachannel = onDataChannel;
|
||||||
peer_connection.onaddstream = onRemoteStreamAdded;
|
peer_connection.onaddstream = onRemoteStreamAdded;
|
||||||
/* Send our video/audio to the other peer */
|
/* Send our video/audio to the other peer */
|
||||||
local_stream_promise = getLocalStream().then((stream) => {
|
local_stream_promise = getLocalStream().then((stream) => {
|
||||||
|
|
Loading…
Reference in a new issue