#![allow(non_camel_case_types)]
use std::os::raw::{c_char, c_int, c_void};
#[repr(C)]
pub struct PeerConnectionFactory {
_private: [u8; 0],
}
#[repr(C)]
pub struct PeerConnection {
_private: [u8; 0],
}
#[repr(C)]
pub struct DataChannel {
_private: [u8; 0],
}
#[repr(C)]
pub struct RtpTransceiver {
_private: [u8; 0],
}
#[repr(C)]
pub struct MediaStreamTrack {
_private: [u8; 0],
}
#[repr(C)]
pub struct FrameTransformer {
_private: [u8; 0],
}
#[repr(C)]
pub struct VideoSource {
_private: [u8; 0],
}
#[repr(C)]
pub struct AudioSource {
_private: [u8; 0],
}
#[repr(C)]
pub struct AudioDeviceModule {
_private: [u8; 0],
}
#[repr(C)]
pub struct ReactorEncodedFrame {
pub direction: c_int,
pub is_audio: c_int,
pub is_key_frame: c_int,
pub payload_type: u8,
pub ssrc: u32,
pub timestamp: u32,
pub data: *const u8,
pub data_len: usize,
pub mime_type: *const c_char,
pub frame: *mut c_void,
}
#[repr(C)]
pub struct ReactorRawVideoFrame {
pub y: *const u8,
pub y_stride: c_int,
pub u: *const u8,
pub u_stride: c_int,
pub v: *const u8,
pub v_stride: c_int,
pub width: u32,
pub height: u32,
pub rtp_timestamp: u32,
pub request_key_frame: c_int,
pub codec: u32,
pub encoder_id: u64,
}
#[repr(C)]
pub struct ReactorEncodedVideoOutput {
pub data: *const u8,
pub len: usize,
pub is_key_frame: c_int,
pub width: u32,
pub height: u32,
pub rtp_timestamp: u32,
pub free_data: Option<extern "C" fn(data: *const u8, len: usize)>,
}
#[repr(C)]
pub struct ReactorStatEntry {
pub kind: i32,
pub ssrc: u32,
pub packets_received: u32,
pub packets_lost: i32,
pub nack_count: u32,
pub packets_sent: u32,
pub pair_state: i32,
pub retransmitted_packets_sent: u32,
pub bytes_received: u64,
pub bytes_sent: u64,
pub priority: u64,
pub jitter: f64,
pub total_decode_time: f64,
pub target_bitrate: f64,
pub round_trip_time: f64,
pub current_round_trip_time: f64,
}
#[repr(C)]
pub struct PeerConnectionCallbacks {
pub userdata: *mut c_void,
pub on_signaling_change: Option<extern "C" fn(userdata: *mut c_void, state: c_int)>,
pub on_connection_change: Option<extern "C" fn(userdata: *mut c_void, state: c_int)>,
pub on_ice_gathering_change: Option<extern "C" fn(userdata: *mut c_void, state: c_int)>,
pub on_ice_candidate: Option<
extern "C" fn(
userdata: *mut c_void,
sdp_mid: *const c_char,
sdp_mline_index: c_int,
candidate: *const c_char,
),
>,
pub on_data_channel:
Option<extern "C" fn(userdata: *mut c_void, data_channel: *mut DataChannel)>,
pub on_renegotiation_needed: Option<extern "C" fn(userdata: *mut c_void)>,
pub on_track: Option<extern "C" fn(userdata: *mut c_void, track: *mut MediaStreamTrack)>,
}
extern "C" {
pub fn reactor_webrtc_abi_version() -> u32;
pub fn reactor_webrtc_selftest(out: *mut c_char, cap: c_int) -> c_int;
pub fn reactor_webrtc_factory_create() -> *mut PeerConnectionFactory;
pub fn reactor_webrtc_factory_create_with_adm_apm(
use_platform_adm: c_int,
apm_flags: c_int,
) -> *mut PeerConnectionFactory;
pub fn reactor_webrtc_factory_create_with_adm(
use_platform_adm: c_int,
) -> *mut PeerConnectionFactory;
pub fn reactor_webrtc_factory_destroy(factory: *mut PeerConnectionFactory);
pub fn reactor_webrtc_factory_create_with_custom_video_encoder(
use_platform_adm: c_int,
on_encode: extern "C" fn(
userdata: *mut c_void,
raw: *const ReactorRawVideoFrame,
out: *mut ReactorEncodedVideoOutput,
) -> c_int,
userdata: *mut c_void,
free_ud: Option<extern "C" fn(userdata: *mut c_void)>,
use_builtin: Option<extern "C" fn(userdata: *mut c_void, encoder_id: u64) -> c_int>,
apm_flags: c_int,
) -> *mut PeerConnectionFactory;
pub fn reactor_webrtc_peer_connection_create(
factory: *mut PeerConnectionFactory,
config_json: *const c_char,
callbacks: *const PeerConnectionCallbacks,
) -> *mut PeerConnection;
pub fn reactor_webrtc_peer_connection_destroy(pc: *mut PeerConnection);
pub fn reactor_webrtc_peer_connection_create_offer(
pc: *mut PeerConnection,
userdata: *mut c_void,
on_success: extern "C" fn(userdata: *mut c_void, ty: *const c_char, sdp: *const c_char),
on_error: extern "C" fn(userdata: *mut c_void, message: *const c_char),
);
pub fn reactor_webrtc_peer_connection_create_answer(
pc: *mut PeerConnection,
userdata: *mut c_void,
on_success: extern "C" fn(userdata: *mut c_void, ty: *const c_char, sdp: *const c_char),
on_error: extern "C" fn(userdata: *mut c_void, message: *const c_char),
);
pub fn reactor_webrtc_peer_connection_set_local_description(
pc: *mut PeerConnection,
ty: *const c_char,
sdp: *const c_char,
userdata: *mut c_void,
on_complete: extern "C" fn(userdata: *mut c_void, error: *const c_char),
);
pub fn reactor_webrtc_peer_connection_set_remote_description(
pc: *mut PeerConnection,
ty: *const c_char,
sdp: *const c_char,
userdata: *mut c_void,
on_complete: extern "C" fn(userdata: *mut c_void, error: *const c_char),
);
pub fn reactor_webrtc_peer_connection_add_ice_candidate(
pc: *mut PeerConnection,
sdp_mid: *const c_char,
sdp_mline_index: c_int,
candidate: *const c_char,
userdata: *mut c_void,
on_complete: extern "C" fn(userdata: *mut c_void, error: *const c_char),
);
pub fn reactor_webrtc_peer_connection_create_data_channel(
pc: *mut PeerConnection,
label: *const c_char,
) -> *mut DataChannel;
pub fn reactor_webrtc_data_channel_send(
data_channel: *mut DataChannel,
data: *const u8,
len: usize,
binary: c_int,
) -> c_int;
pub fn reactor_webrtc_data_channel_register_observer(
data_channel: *mut DataChannel,
userdata: *mut c_void,
on_message: extern "C" fn(
userdata: *mut c_void,
data: *const u8,
len: usize,
binary: c_int,
),
on_state_change: extern "C" fn(userdata: *mut c_void, state: c_int),
on_buffered_amount_low: extern "C" fn(userdata: *mut c_void),
);
pub fn reactor_webrtc_data_channel_buffered_amount(data_channel: *mut DataChannel) -> u64;
pub fn reactor_webrtc_data_channel_label(
data_channel: *mut DataChannel,
out: *mut c_char,
cap: c_int,
) -> c_int;
pub fn reactor_webrtc_data_channel_state(data_channel: *mut DataChannel) -> c_int;
pub fn reactor_webrtc_data_channel_set_low_threshold(
data_channel: *mut DataChannel,
threshold: u64,
);
pub fn reactor_webrtc_data_channel_destroy(data_channel: *mut DataChannel);
pub fn reactor_webrtc_video_track_create(
factory: *mut PeerConnectionFactory,
id: *const c_char,
) -> *mut MediaStreamTrack;
pub fn reactor_webrtc_video_track_push_frame(
track: *mut MediaStreamTrack,
bgra: *const u8,
width: c_int,
height: c_int,
);
pub fn reactor_webrtc_peer_connection_add_track(
pc: *mut PeerConnection,
track: *mut MediaStreamTrack,
) -> c_int;
pub fn reactor_webrtc_video_track_add_sink(
track: *mut MediaStreamTrack,
userdata: *mut c_void,
on_frame: extern "C" fn(
userdata: *mut c_void,
bgra: *const u8,
width: c_int,
height: c_int,
),
);
pub fn reactor_webrtc_media_stream_track_kind(track: *mut MediaStreamTrack) -> c_int;
pub fn reactor_webrtc_peer_connection_add_transceiver(
pc: *mut PeerConnection,
media_kind: c_int,
direction: c_int,
) -> *mut RtpTransceiver;
pub fn reactor_webrtc_peer_connection_transceiver_count(pc: *mut PeerConnection) -> c_int;
pub fn reactor_webrtc_peer_connection_get_transceiver(
pc: *mut PeerConnection,
index: c_int,
) -> *mut RtpTransceiver;
pub fn reactor_webrtc_rtp_transceiver_media_kind(transceiver: *mut RtpTransceiver) -> c_int;
pub fn reactor_webrtc_rtp_transceiver_mid(
transceiver: *mut RtpTransceiver,
out: *mut c_char,
cap: c_int,
) -> c_int;
pub fn reactor_webrtc_rtp_transceiver_set_track(
transceiver: *mut RtpTransceiver,
track: *mut MediaStreamTrack,
) -> c_int;
pub fn reactor_webrtc_rtp_transceiver_set_direction(
transceiver: *mut RtpTransceiver,
direction: c_int,
) -> c_int;
pub fn reactor_webrtc_rtp_transceiver_destroy(transceiver: *mut RtpTransceiver);
pub fn reactor_webrtc_frame_transformer_create(
on_frame: extern "C" fn(userdata: *mut c_void, frame: *const ReactorEncodedFrame) -> c_int,
userdata: *mut c_void,
free_userdata: extern "C" fn(userdata: *mut c_void),
) -> *mut FrameTransformer;
pub fn reactor_webrtc_encoded_frame_set_data(frame: *mut c_void, data: *const u8, len: usize);
pub fn reactor_webrtc_rtp_transceiver_set_sender_transform(
transceiver: *mut RtpTransceiver,
transformer: *mut FrameTransformer,
) -> c_int;
pub fn reactor_webrtc_rtp_transceiver_set_receiver_transform(
transceiver: *mut RtpTransceiver,
transformer: *mut FrameTransformer,
) -> c_int;
pub fn reactor_webrtc_frame_transformer_destroy(transformer: *mut FrameTransformer);
pub fn reactor_webrtc_media_stream_track_destroy(track: *mut MediaStreamTrack);
pub fn reactor_webrtc_audio_track_create(
factory: *mut PeerConnectionFactory,
id: *const c_char,
) -> *mut MediaStreamTrack;
pub fn reactor_webrtc_factory_push_audio_frame(
factory: *mut PeerConnectionFactory,
pcm: *const i16,
samples_per_channel: c_int,
sample_rate: c_int,
channels: c_int,
);
pub fn reactor_webrtc_audio_track_add_sink(
track: *mut MediaStreamTrack,
userdata: *mut c_void,
on_audio: extern "C" fn(
userdata: *mut c_void,
pcm: *const i16,
sample_rate: c_int,
channels: c_int,
frames: c_int,
),
);
pub fn reactor_webrtc_factory_set_adm_playout_enabled(
factory: *mut PeerConnectionFactory,
enabled: c_int,
);
pub fn reactor_webrtc_peer_connection_get_stats(
pc: *mut PeerConnection,
userdata: *mut c_void,
callback: extern "C" fn(
userdata: *mut c_void,
entries: *const ReactorStatEntry,
count: c_int,
),
);
pub fn reactor_webrtc_android_init(vm: *mut std::ffi::c_void);
pub fn reactor_webrtc_android_init_context(
vm: *mut std::ffi::c_void,
context: *mut std::ffi::c_void,
) -> c_int;
}