void krad_websocket_add_link ( krad_ipc_session_data_t *krad_ipc_session_data, krad_link_rep_t *krad_link) { cJSON *msg; cJSON_AddItemToArray(krad_ipc_session_data->msgs, msg = cJSON_CreateObject()); cJSON_AddStringToObject (msg, "com", "kradlink"); cJSON_AddStringToObject (msg, "cmd", "add_link"); cJSON_AddNumberToObject (msg, "link_num", krad_link->link_num); cJSON_AddStringToObject (msg, "operation_mode", krad_link_operation_mode_to_string(krad_link->operation_mode)); cJSON_AddStringToObject (msg, "av_mode", krad_link_av_mode_to_string(krad_link->av_mode)); if (krad_link->operation_mode == CAPTURE) { cJSON_AddStringToObject (msg, "video_source", krad_link_video_source_to_string(krad_link->video_source)); } if (krad_link->operation_mode == TRANSMIT) { cJSON_AddStringToObject (msg, "host", krad_link->host); cJSON_AddNumberToObject (msg, "port", krad_link->port); cJSON_AddStringToObject (msg, "mount", krad_link->mount); if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { cJSON_AddStringToObject (msg, "video_codec", krad_codec_to_string (krad_link->video_codec)); cJSON_AddNumberToObject (msg, "video_width", krad_link->width); cJSON_AddNumberToObject (msg, "video_height", krad_link->height); cJSON_AddNumberToObject (msg, "video_fps_numerator", krad_link->fps_numerator); cJSON_AddNumberToObject (msg, "video_fps_denominator", krad_link->fps_denominator); cJSON_AddNumberToObject (msg, "video_color_depth", krad_link->color_depth); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { cJSON_AddStringToObject (msg, "audio_codec", krad_codec_to_string (krad_link->audio_codec)); cJSON_AddNumberToObject (msg, "audio_channels", krad_link->audio_channels); cJSON_AddNumberToObject (msg, "audio_sample_rate", krad_link->audio_sample_rate); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->audio_codec == VORBIS) { cJSON_AddNumberToObject (msg, "vorbis_quality", krad_link->vorbis_quality); } if (krad_link->audio_codec == FLAC) { cJSON_AddNumberToObject (msg, "flac_bit_depth", krad_link->flac_bit_depth); } if (krad_link->audio_codec == OPUS) { cJSON_AddStringToObject (msg, "opus_signal", krad_opus_signal_to_string (krad_link->opus_signal)); cJSON_AddStringToObject (msg, "opus_bandwidth", krad_opus_bandwidth_to_string (krad_link->opus_bandwidth)); cJSON_AddNumberToObject (msg, "opus_complexity", krad_link->opus_complexity); cJSON_AddNumberToObject (msg, "opus_bitrate", krad_link->opus_bitrate); cJSON_AddNumberToObject (msg, "opus_frame_size", krad_link->opus_frame_size); } } if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->video_codec == THEORA) { cJSON_AddNumberToObject (msg, "theora_quality", krad_link->theora_quality); } if (krad_link->video_codec == VP8) { cJSON_AddNumberToObject (msg, "vp8_bitrate", krad_link->vp8_bitrate); cJSON_AddNumberToObject (msg, "vp8_deadline", krad_link->vp8_deadline); cJSON_AddNumberToObject (msg, "vp8_min_quantizer", krad_link->vp8_min_quantizer); cJSON_AddNumberToObject (msg, "vp8_max_quantizer", krad_link->vp8_max_quantizer); } } } }
void krad_transponder_link_to_ebml ( krad_ipc_server_client_t *client, krad_link_t *krad_link) { uint64_t link; krad_ebml_start_element (client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_LINK, &link); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_TRANSPONDER_LINK_NUMBER, krad_link->link_num); switch ( krad_link->av_mode ) { case AUDIO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "audio only"); break; case VIDEO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "video only"); break; case AUDIO_AND_VIDEO: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AV_MODE, "audio and video"); break; } switch ( krad_link->operation_mode ) { case TRANSMIT: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "transmit"); break; case RECORD: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "record"); break; case PLAYBACK: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "playback"); break; case RECEIVE: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "receive"); break; case CAPTURE: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "capture"); break; default: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPERATION_MODE, "Other/Unknown"); break; } if (krad_link->operation_mode == RECEIVE) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); if ((krad_link->transport_mode == UDP) || (krad_link->transport_mode == TCP)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); } } if (krad_link->operation_mode == CAPTURE) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_SOURCE, krad_link_video_source_to_string (krad_link->video_source)); } if (krad_link->operation_mode == PLAYBACK) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); if (krad_link->transport_mode == FILESYSTEM) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FILENAME, krad_link->input); } if (krad_link->transport_mode == TCP) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_HOST, krad_link->host); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_MOUNT, krad_link->mount); } } if ((krad_link->operation_mode == TRANSMIT) || (krad_link->operation_mode == RECORD)) { switch ( krad_link->av_mode ) { case AUDIO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CODEC, krad_codec_to_string (krad_link->audio_codec)); break; case VIDEO_ONLY: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_CODEC, krad_codec_to_string (krad_link->video_codec)); break; case AUDIO_AND_VIDEO: krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_CODEC, krad_codec_to_string (krad_link->video_codec)); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CODEC, krad_codec_to_string (krad_link->audio_codec)); break; } if (krad_link->operation_mode == TRANSMIT) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_TRANSPORT_MODE, krad_link_transport_mode_to_string (krad_link->transport_mode)); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_HOST, krad_link->host); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_PORT, krad_link->port); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_MOUNT, krad_link->mount); } if (krad_link->operation_mode == RECORD) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FILENAME, krad_link->output); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_CHANNELS, 2); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_AUDIO_SAMPLE_RATE, 48000); } if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_WIDTH, krad_link->encoding_width); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_HEIGHT, krad_link->encoding_height); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FPS_NUMERATOR, krad_link->encoding_fps_numerator); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FPS_DENOMINATOR, krad_link->encoding_fps_denominator); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VIDEO_COLOR_DEPTH, 420); } if ((krad_link->av_mode == AUDIO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->audio_codec == VORBIS) { krad_ebml_write_float (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VORBIS_QUALITY, krad_link->krad_vorbis->quality); } if (krad_link->audio_codec == FLAC) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_FLAC_BIT_DEPTH, krad_link->krad_flac->bit_depth); } if (krad_link->audio_codec == OPUS) { krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_SIGNAL, krad_opus_signal_to_string (krad_opus_get_signal (krad_link->krad_opus))); krad_ebml_write_string (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_BANDWIDTH, krad_opus_bandwidth_to_string (krad_opus_get_bandwidth (krad_link->krad_opus))); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_BITRATE, krad_opus_get_bitrate (krad_link->krad_opus)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_COMPLEXITY, krad_opus_get_complexity (krad_link->krad_opus)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_OPUS_FRAME_SIZE, krad_opus_get_frame_size (krad_link->krad_opus)); //EBML_ID_KRAD_LINK_LINK_OGG_MAX_PACKETS_PER_PAGE, atoi(argv[5])); } } if ((krad_link->av_mode == VIDEO_ONLY) || (krad_link->av_mode == AUDIO_AND_VIDEO)) { if (krad_link->video_codec == THEORA) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_THEORA_QUALITY, krad_theora_encoder_quality_get (krad_link->krad_theora_encoder)); } if (krad_link->video_codec == VP8) { krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_BITRATE, krad_vpx_encoder_bitrate_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_MIN_QUANTIZER, krad_vpx_encoder_min_quantizer_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_MAX_QUANTIZER, krad_vpx_encoder_max_quantizer_get (krad_link->krad_vpx_encoder)); krad_ebml_write_int32 (client->krad_ebml2, EBML_ID_KRAD_LINK_LINK_VP8_DEADLINE, krad_vpx_encoder_deadline_get (krad_link->krad_vpx_encoder)); } } } krad_ebml_finish_element (client->krad_ebml2, link); }