You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.5 KiB
95 lines
3.5 KiB
// call_proto.h — wire-формат и константы P2P аудио-звонка (svc_id ETCP_RT_ID_CALL 0x36) |
|
// |
|
// Приём/отправка через etcp_router. На проводе первый байт payload = subcmd. |
|
// Сигналинг идёт с ROUTE_CRYPTO_SIGN|ROUTE_CRYPTO_ENCRYPT, медиа — без подписи |
|
// (уже внутри шифрованного канала etcp_router). |
|
#ifndef CALL_PROTO_H |
|
#define CALL_PROTO_H |
|
|
|
#include <stdint.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* ── подкоманды (первый байт payload после svc_id) ── */ |
|
enum { |
|
CALL_SUBCMD_INVITE = 0x01, /* {call_id:8, group_id:8, tracks:[]} */ |
|
CALL_SUBCMD_RINGING = 0x02, /* {call_id:8} */ |
|
CALL_SUBCMD_ACCEPT = 0x03, /* {call_id:8} */ |
|
CALL_SUBCMD_DECLINE = 0x04, /* {call_id:8, reason:1} */ |
|
CALL_SUBCMD_BUSY = 0x05, /* {call_id:8} */ |
|
CALL_SUBCMD_CANCEL = 0x06, /* {call_id:8} */ |
|
CALL_SUBCMD_HANGUP = 0x07, /* {call_id:8, reason:1} */ |
|
CALL_SUBCMD_MEDIA = 0x10, /* {call_id:8, track_id:1, seq:2, ts_ms:4, payload[]} */ |
|
}; |
|
|
|
/* ── треки и кодеки (модель расширяема под видео) ── */ |
|
enum { CALL_TRACK_AUDIO = 0x01, CALL_TRACK_VIDEO = 0x02 }; |
|
enum { CALL_CODEC_OPUS = 0x01 }; |
|
|
|
/* ── причины завершения (ENDED) ── */ |
|
enum { |
|
CALL_REASON_LOCAL_HANGUP = 0, |
|
CALL_REASON_REMOTE_HANGUP = 1, |
|
CALL_REASON_DECLINE = 2, |
|
CALL_REASON_BUSY = 3, |
|
CALL_REASON_CANCEL = 4, |
|
CALL_REASON_NO_TRAFFIC = 5, |
|
CALL_REASON_RING_TIMEOUT = 6, |
|
CALL_REASON_CONNECT_FAIL = 7, |
|
}; |
|
|
|
#pragma pack(push, 1) |
|
|
|
struct call_pkt_track { |
|
uint8_t type; /* CALL_TRACK_AUDIO / CALL_TRACK_VIDEO */ |
|
uint8_t codec; /* CALL_CODEC_OPUS */ |
|
uint32_t sample_rate; |
|
uint8_t channels; |
|
uint32_t bitrate; |
|
}; |
|
|
|
struct call_pkt_invite { |
|
uint8_t subcmd; /* CALL_SUBCMD_INVITE */ |
|
uint64_t call_id; |
|
uint64_t group_id; |
|
uint8_t num_tracks; |
|
struct call_pkt_track tracks[1]; /* tracks[num_tracks] */ |
|
}; |
|
|
|
struct call_pkt_ringing { uint8_t subcmd; uint64_t call_id; }; |
|
struct call_pkt_accept { uint8_t subcmd; uint64_t call_id; }; |
|
struct call_pkt_decline { uint8_t subcmd; uint64_t call_id; uint8_t reason; }; |
|
struct call_pkt_busy { uint8_t subcmd; uint64_t call_id; }; |
|
struct call_pkt_cancel { uint8_t subcmd; uint64_t call_id; }; |
|
struct call_pkt_hangup { uint8_t subcmd; uint64_t call_id; uint8_t reason; }; |
|
|
|
struct call_pkt_media { |
|
uint8_t subcmd; /* CALL_SUBCMD_MEDIA */ |
|
uint64_t call_id; |
|
uint8_t track_id; |
|
uint16_t seq; |
|
uint32_t ts_ms; |
|
/* payload[] */ |
|
}; |
|
|
|
#pragma pack(pop) |
|
|
|
#define CALL_MEDIA_HDR_SIZE sizeof(struct call_pkt_media) /* 16 */ |
|
|
|
/* ── параметры аудио (Opus 48kHz mono, 20ms) ── */ |
|
#define CALL_OPUS_SAMPLE_RATE 48000 |
|
#define CALL_OPUS_FRAME_MS 20 |
|
#define CALL_OPUS_FRAME_SAMPLES (CALL_OPUS_SAMPLE_RATE * CALL_OPUS_FRAME_MS / 1000) /* 960 */ |
|
|
|
/* ── таймауты и ёмкости (timebase 0.1ms) ── */ |
|
#define CALL_RING_TIMEOUT_TB 450000 /* 45с — нет ответа → CANCEL */ |
|
#define CALL_NO_TRAFFIC_TB 200000 /* 20с — нет входящих медиа → HANGUP */ |
|
#define CALL_TEARDOWN_DELAY_TB 5000 /* 500мс — задержка разрыва conn_mgr после завершения */ |
|
#define CALL_MAX_TX_FRAMES 50 /* ~1с буфер отправки (50 кадров × 20мс) */ |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif /* CALL_PROTO_H */
|
|
|