static void on_screenws_message()

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;
	}
}