in chime/chime-call-screen.c [141:199]
static void on_screenws_message(SoupWebsocketConnection *ws, gint type,
GBytes *message, gpointer _screen)
{
ChimeCallScreen *screen = _screen;
gsize s;
gconstpointer d = g_bytes_get_data(message, &s);
if (getenv("CHIME_SCREEN_DEBUG")) {
printf("incoming:\n");
hexdump(d, s);
}
if (s < 4)
return;
const struct screen_pkt *pkt = d;
switch(pkt->type) {
case SCREEN_PKT_TYPE_HEARTBEAT_REQUEST:
screen_send_packet(screen, SCREEN_PKT_TYPE_HEARTBEAT_RESPONSE, NULL, 0);
break;
case SCREEN_PKT_TYPE_PING_REQUEST:
screen_send_packet(screen, SCREEN_PKT_TYPE_PING_RESPONSE, NULL, 0);
break;
case SCREEN_PKT_TYPE_KEY_REQUEST:
if (screen->screen_sink) {
screen->viewer_present = 1;
GstEvent *ev = gst_video_event_new_upstream_force_key_unit(GST_CLOCK_TIME_NONE, FALSE, 0);
GstPad *pad = gst_element_get_static_pad(GST_ELEMENT(screen->screen_sink), "sink");
GstPad *peer = gst_pad_get_peer(pad);
gst_pad_send_event(peer, ev);
}
break;
case SCREEN_PKT_TYPE_STREAM_STOP:
if (screen->screen_sink) {
screen_send_packet(screen, SCREEN_PKT_TYPE_PRESENTER_END, NULL, 0);
gst_app_sink_set_callbacks(screen->screen_sink, &no_appsink_callbacks, NULL, NULL);
screen->screen_sink = NULL;
chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL);
}
break;
case SCREEN_PKT_TYPE_CAPTURE:
if (screen->screen_src) {
GstBuffer *buffer = gst_rtp_buffer_new_allocate(s - 4, 0, 0);
gst_buffer_fill(buffer, 0, &pkt[1], s - sizeof(*pkt));
gst_app_src_push_buffer(GST_APP_SRC(screen->screen_src), buffer);
}
break;
default:
chime_debug("Incoming screen packet type %d not handled\n", pkt->type);
break;
}
}