![]() |
UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
|
#include <algorithm>#include <array>#include <iostream>#include <sstream>#include <vector>#include "audio/codec.h"#include "audio/types.h"#include "audio/utils.h"#include "control_socket.h"#include "crypto/openssl_encrypt.h"#include "debug.h"#include "host.h"#include "lib_common.h"#include "module.h"#include "rtp/fec.h"#include "rtp/rtp.h"#include "rtp/rtp_callback.h"#include "rtp/rtpenc_h264.h"#include "transmit.h"#include "tv.h"#include "types.h"#include "utils/jpeg_reader.h"#include "utils/macros.h"#include "utils/misc.h"#include "utils/random.h"#include "video.h"#include "video_codec.h"
Go to the source code of this file.
Classes | |
| struct | rate_limit_dyn |
| struct | tx |
Macros | |
| #define | CONTROL_PORT_BANDWIDTH_REPORT_INTERVAL_NS NS_IN_SEC |
| #define | FEC_MAX_MULT 10 |
| #define | GET_DELTA delta = (long)((double)(stop.QuadPart - start.QuadPart) * 1000 * 1000 * 1000 / freq.QuadPart); |
| #define | GET_STARTTIME {QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); } |
| #define | GET_STOPTIME { QueryPerformanceCounter(&stop); } |
| #define | MOD_NAME "[transmit] " |
| #define | TRANSMIT_MAGIC 0xe80ab15f |
Functions | |
| void | audio_tx_send (struct tx *tx, struct rtp *rtp_session, const audio_frame2 *buffer) |
| static void | audio_tx_send_chan (struct tx *tx, struct rtp *rtp_session, uint32_t timestamp, const audio_frame2 *buffer, int channel, bool send_m) |
| void | audio_tx_send_standard (struct tx *tx, struct rtp *rtp_session, const audio_frame2 *buffer) |
| static void | check_symbol_size (int fec_symbol_size, int payload_len) |
| static void | fec_check_messages (struct tx *tx) |
| void | format_audio_header (const audio_frame2 *frame, int channel, int buffer_idx, uint32_t *audio_hdr) |
| static uint32_t | format_interl_fps_hdr_row (enum interlacing_t interlacing, double input_fps) |
| void | format_video_header (struct video_frame *frame, int tile_idx, int buffer_idx, uint32_t *video_hdr) |
| static long | get_packet_rate (struct tx *tx, struct video_frame *frame, int substream, long packet_count) |
| static vector< int > | get_packet_sizes (struct video_frame *frame, int substream, int mtu) |
| static int | get_tx_hdr_len (bool is_ipv6) |
| static int | get_video_pkt_len (int mtu, int symbol_size, int *symbol_offset) |
| static void | report_stats (struct tx *tx, struct rtp *rtp_session, long data_sent) |
| static bool | set_fec (struct tx *tx, const char *fec) |
| static void | tx_done (struct module *tx) |
| int | tx_get_buffer_id (struct tx *tx) |
| struct tx * | tx_init (struct module *parent, unsigned mtu, enum tx_media_type media_type, const char *fec, const char *encryption, long long int bitrate) |
| void | tx_send (struct tx *tx, struct video_frame *frame, struct rtp *rtp_session) |
| static void | tx_send_base (struct tx *tx, struct video_frame *frame, struct rtp *rtp_session, uint32_t ts, int send_m, unsigned int substream, int fragment_offset) |
| void | tx_send_h264 (struct tx *tx, struct video_frame *frame, struct rtp *rtp_session) |
| void | tx_send_jpeg (struct tx *tx, struct video_frame *frame, struct rtp *rtp_session) |
| static void | tx_update (struct tx *tx, struct video_frame *frame, int substream) |
| static bool | validate_std_audio (const audio_frame2 *buffer, int payload_size) |
| #define CONTROL_PORT_BANDWIDTH_REPORT_INTERVAL_NS NS_IN_SEC |
Definition at line 93 of file transmit.cpp.
Referenced by report_stats().
| #define FEC_MAX_MULT 10 |
Definition at line 91 of file transmit.cpp.
Referenced by set_fec().
| #define GET_DELTA delta = (long)((double)(stop.QuadPart - start.QuadPart) * 1000 * 1000 * 1000 / freq.QuadPart); |
Definition at line 106 of file transmit.cpp.
Referenced by tx_send_base().
| #define GET_STARTTIME {QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); } |
Definition at line 104 of file transmit.cpp.
Referenced by tx_send_base().
| #define GET_STOPTIME { QueryPerformanceCounter(&stop); } |
Definition at line 105 of file transmit.cpp.
Referenced by tx_send_base().
| #define MOD_NAME "[transmit] " |
Definition at line 88 of file transmit.cpp.
Referenced by audio_tx_send_chan(), check_symbol_size(), tx_init(), and validate_std_audio().
| #define TRANSMIT_MAGIC 0xe80ab15f |
Definition at line 89 of file transmit.cpp.
Referenced by tx_done(), tx_init(), and tx_send_base().
| void audio_tx_send | ( | struct tx * | tx, |
| struct rtp * | rtp_session, | ||
| const audio_frame2 * | buffer ) |
Definition at line 799 of file transmit.cpp.
References audio_tx_send_chan(), tx::buffer, fec_check_messages(), audio_frame2::get_channel_count(), get_local_mediatime(), get_local_mediatime_offset(), audio_frame2::get_timestamp(), tx::mult_count, and rtp_has_receiver().
Referenced by audio_sender_thread(), and state_audio_mixer::worker().

|
static |
Definition at line 826 of file transmit.cpp.
References tx::buffer, fec_desc::c, check_symbol_size(), tx::enc_funcs, openssl_encrypt_info::encrypt, tx::encryption, FEC_NONE, fec_pt_from_fec_type(), format_audio_header(), openssl_encrypt_info::get_cipher, audio_frame2::get_data(), audio_frame2::get_data_len(), audio_frame2::get_fec_params(), openssl_encrypt_info::get_overhead, get_tx_hdr_len(), fec_desc::k, LOG_LEVEL_WARNING, log_msg_once(), fec_desc::m, MAX_CRYPTO_EXCEED, MOD_NAME, tx::mtu, report_stats(), rtp_is_ipv6(), RTP_MAX_PACKET_LEN, rtp_send_data_hdr(), fec_desc::seed, fec_desc::symbol_size, to_fourcc, TX_MEDIA_AUDIO, and fec_desc::type.
Referenced by audio_tx_send().

| void audio_tx_send_standard | ( | struct tx * | tx, |
| struct rtp * | rtp_session, | ||
| const audio_frame2 * | buffer ) |
audio_tx_send_standard - Send interleaved channels from the audio_frame2, as the mulaw and A-law standards (dynamic or std PT).
Definition at line 958 of file transmit.cpp.
References AC_ALAW, AC_MP3, AC_MULAW, AC_OPUS, audio_frame2::get_channel_count(), audio_frame2::get_codec(), audio_frame2::get_data(), audio_frame2::get_data_len(), audio_frame2::get_duration(), audio_frame2::get_sample_rate(), get_std_audio_local_mediatime(), get_time_in_ns(), kHz8, tx::mtu, offset, PT_DynRTP_Type97, PT_ITU_T_G711_PCMA, PT_ITU_T_G711_PCMU, PT_MPA, remux_channel(), rtp_send_ctrl(), rtp_send_data(), tx::tmp_packet, ts, and validate_std_audio().
Referenced by audio_sender_thread().

|
inlinestatic |
Definition at line 502 of file transmit.cpp.
References LOG, log_level, LOG_LEVEL_DEBUG2, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, and MOD_NAME.
Referenced by audio_tx_send_chan(), and get_packet_sizes().
|
static |
Definition at line 354 of file transmit.cpp.
References tx::bitrate, check_message(), free_message(), LOG, LOG_LEVEL_ERROR, LOG_LEVEL_NOTICE, tx::mod, msg, MSG_UNIVERSAL_TAG_TX, new_response(), RATE_MIN, RESPONSE_BAD_REQUEST, RESPONSE_INT_SERV_ERR, RESPONSE_OK, set_fec(), msg_universal::text, response::text, and unit_evaluate().
Referenced by audio_tx_send(), and tx_send().

| void format_audio_header | ( | const audio_frame2 * | frame, |
| int | channel, | ||
| int | buffer_idx, | ||
| uint32_t * | audio_hdr ) |
Definition at line 460 of file transmit.cpp.
References frame, and get_audio_tag().
Referenced by audio_tx_send_chan(), and rs::encode().

|
static |
Definition at line 478 of file transmit.cpp.
References round().
Referenced by format_video_header().

| void format_video_header | ( | struct video_frame * | frame, |
| int | tile_idx, | ||
| int | buffer_idx, | ||
| uint32_t * | video_hdr ) |
Definition at line 445 of file transmit.cpp.
References video_frame::color_spec, tile::data_len, format_interl_fps_hdr_row(), video_frame::fps, frame, get_fourcc(), tile::height, video_frame::interlacing, video_frame::tiles, and tile::width.
Referenced by rs::encode(), and tx_send_base().

|
static |
Returns inter-packet interval in nanoseconds.
Definition at line 614 of file transmit.cpp.
References rate_limit_dyn::avg_frame_size, tx::bitrate, tile::data_len, tx::dyn_rate_limit_state, rate_limit_dyn::EXCESS_GAP, video_frame::fps, frame, rate_limit_dyn::last_excess, tx::mtu, tx::mult_count, packet_rate, RATE_AUTO, RATE_DYNAMIC, RATE_FLAG_FIXED_RATE, RATE_UNLIMITED, video_frame::tile_count, and video_frame::tiles.
Referenced by tx_send_base().
|
static |
| mtu | is tx->mtu - hdrs_len |
Definition at line 552 of file transmit.cpp.
References check_symbol_size(), video_frame::color_spec, tile::data_len, FEC_NONE, video_frame::fec_params, frame, get_pf_block_bytes(), get_pf_block_pixels(), get_video_pkt_len(), is_codec_opaque(), len, tx::mtu, PIX_BLOCK_LCM, fec_desc::symbol_size, video_frame::tiles, fec_desc::type, vc_get_linesize(), and tile::width.
Referenced by tx_send_base().

|
static |
Definition at line 652 of file transmit.cpp.
References IPV4_HDR_LEN, IPV6_HDR_LEN, RTP_HDR_LEN, and UDP_HDR_LEN.
Referenced by audio_tx_send_chan(), and tx_send_base().
|
inlinestatic |
Splits symbol (FEC symbol or uncompressed line) to 1 or more MTUs. Symbol starts always on beginning of packet.
If symbol_size is longer than MTU (more symbols fit one packet), the aligned packet size is always the same.
| symbol_size | FEC symbol size or linesize for uncompressed |
Definition at line 536 of file transmit.cpp.
References tx::mtu.
Referenced by get_packet_sizes().
Definition at line 585 of file transmit.cpp.
References tx::control, CONTROL_PORT_BANDWIDTH_REPORT_INTERVAL_NS, control_report_stats(), control_stats_enabled(), get_time_in_ns(), tx::last_stat_report, tx::media_type, rtp_my_ssrc(), tx::sent_since_report, and TX_MEDIA_VIDEO.
Referenced by audio_tx_send_chan(), and tx_send_base().

|
static |
Definition at line 263 of file transmit.cpp.
References color_printf(), msg_sender::fec_cfg, tx::fec_dup_1st_pkt, FEC_LDGM, FEC_MAX_MULT, FEC_MULT, FEC_NONE, FEC_RS, tx::fec_scheme, free_message(), free_response(), get_parent_module(), MAX, tx::max_loss, tx::media_type, tx::mod, MSG, tx::mult_count, new_message(), send_message_to_receiver(), SENDER_MSG_CHANGE_FEC, TBOLD, and TX_MEDIA_AUDIO.
Referenced by fec_check_messages(), and tx_init().

|
static |
Definition at line 396 of file transmit.cpp.
References tx::magic, tx::mod, module::priv_data, and TRANSMIT_MAGIC.
Referenced by tx_init().
| int tx_get_buffer_id | ( | struct tx * | tx_session | ) |
Returns buffer ID to be sent with next tx_send() call
Definition at line 1240 of file transmit.cpp.
References tx::buffer.
| struct tx * tx_init | ( | struct module * | parent, |
| unsigned | mtu, | ||
| enum tx_media_type | media_type, | ||
| const char * | fec, | ||
| const char * | encryption, | ||
| long long int | bitrate ) |
Definition at line 201 of file transmit.cpp.
References tx::avg_len, tx::avg_len_last, tx::bitrate, tx::buffer, module::cls, tx::control, module::deleter, tx::enc_funcs, tx::encryption, FEC_NONE, tx::fec_scheme, get_module(), get_root_module(), openssl_encrypt_info::init, tx::last_frame_fragment_id, LIBRARY_CLASS_UNDEFINED, load_library(), LOG_LEVEL_ERROR, log_msg(), tx::magic, tx::max_loss, tx::media_type, tx::mod, MOD_NAME, MODULE_CLASS_TX, module_done(), module_init_default(), module_register(), tx::mtu, tx::mult_count, OPENSSL_ENCRYPT_ABI_VERSION, parent, module::priv_data, RATE_MIN, RTP_MAX_MTU, tx::sent_frames, set_fec(), TRANSMIT_MAGIC, tx_done(), and ug_rand().
Referenced by am_participant::am_participant(), rtp_video_rxtx::rtp_video_rxtx(), and audio_init().

| void tx_send | ( | struct tx * | tx, |
| struct video_frame * | frame, | ||
| struct rtp * | rtp_session ) |
Definition at line 407 of file transmit.cpp.
References tx::buffer, FALSE, fec_check_messages(), FEC_NONE, tx::fec_scheme, video_frame::flags, video_frame::fragment, frame, video_frame::frame_fragment_id, get_local_mediatime(), get_local_mediatime_offset(), video_frame::last_fragment, tx::last_frame_fragment_id, tx::last_ts, tile::offset, video_frame::tile_count, video_frame::timestamp, TIMESTAMP_VALID, TRUE, ts, tx_send_base(), and vf_get_tile().
Referenced by ultragrid_rtp_video_rxtx::send_frame_async().

|
static |
Definition at line 659 of file transmit.cpp.
References tx::buffer, fec_desc::c, tile::data, tile::data_len, tx::enc_funcs, openssl_encrypt_info::encrypt, tx::encryption, tx::fec_dup_1st_pkt, FEC_NONE, video_frame::fec_params, fec_pt_from_fec_type(), format_video_header(), frame, openssl_encrypt_info::get_cipher, GET_DELTA, openssl_encrypt_info::get_overhead, get_packet_rate(), get_packet_sizes(), GET_STARTTIME, GET_STOPTIME, get_tx_hdr_len(), fec_desc::k, fec_desc::m, tx::magic, MAX_CRYPTO_EXCEED, tx::mtu, tx::mult_count, packet_rate, report_stats(), rtp_async_start(), rtp_async_wait(), rtp_has_receiver(), rtp_is_ipv6(), RTP_MAX_PACKET_LEN, rtp_send_data_hdr(), fec_desc::seed, start(), video_frame::tiles, TRANSMIT_MAGIC, ts, TX_MEDIA_VIDEO, tx_update(), and fec_desc::type.
Referenced by tx_send().

| void tx_send_h264 | ( | struct tx * | tx, |
| struct video_frame * | frame, | ||
| struct rtp * | rtp_session ) |
H.264 standard transmission
Definition at line 1057 of file transmit.cpp.
References tile::data, tile::data_len, error_msg, FEC_NONE, tx::fec_scheme, video_frame::fragment, frame, get_std_video_local_mediatime(), tx::mtu, PT_DynRTP_Type96, rtp_send_data(), rtp_send_data_hdr(), rtpenc_get_next_nal(), start(), video_frame::tile_count, video_frame::tiles, and ts.
Referenced by h264_rtp_video_rxtx::configure_rtsp_server_video(), and h264_sdp_video_rxtx::send_frame().

| void tx_send_jpeg | ( | struct tx * | tx, |
| struct video_frame * | frame, | ||
| struct rtp * | rtp_session ) |
Definition at line 1168 of file transmit.cpp.
References jpeg_rtp_data::data, tile::data, tile::data_len, exit_uv(), FEC_NONE, tx::fec_scheme, video_frame::fragment, frame, get_std_video_local_mediatime(), jpeg_rtp_data::height, jpeg_get_rtp_hdr_data(), LOG_LEVEL_ERROR, log_msg(), tx::mtu, PT_JPEG, jpeg_rtp_data::q, jpeg_rtp_data::quantization_tables, jpeg_rtp_data::restart_interval, rtp_is_ipv6(), rtp_send_data_hdr(), video_frame::tile_count, video_frame::tiles, ts, jpeg_rtp_data::type, and jpeg_rtp_data::width.
Referenced by h264_rtp_video_rxtx::configure_rtsp_server_video(), and h264_sdp_video_rxtx::send_frame().

|
static |
Definition at line 166 of file transmit.cpp.
References abs(), tx::avg_len, tx::avg_len_last, tile::data_len, FEC_LDGM, FEC_NONE, video_frame::fec_params, tx::fec_scheme, frame, free_response(), get_parent_module(), fec_desc::k, fec_desc::m, tx::max_loss, tx::mod, tx::mtu, new_message(), send_message_to_receiver(), SENDER_MSG_CHANGE_FEC, tx::sent_frames, video_frame::tiles, and fec_desc::type.
Referenced by tx_send_base().

|
static |
Definition at line 933 of file transmit.cpp.
References AC_MP3, AC_OPUS, audio_frame2::get_channel_count(), audio_frame2::get_codec(), audio_frame2::get_data_len(), get_name_to_audio_codec(), LOG_LEVEL_ERROR, log_msg_once(), MOD_NAME, MSG, and to_fourcc.
Referenced by audio_tx_send_standard().
