diff options
-rw-r--r-- | toxav/rtp.c | 30 | ||||
-rw-r--r-- | toxav/rtp.h | 8 | ||||
-rw-r--r-- | toxav/toxav.c | 4 |
3 files changed, 33 insertions, 9 deletions
diff --git a/toxav/rtp.c b/toxav/rtp.c index f48c483b..69aed2dc 100644 --- a/toxav/rtp.c +++ b/toxav/rtp.c | |||
@@ -26,6 +26,23 @@ | |||
26 | */ | 26 | */ |
27 | #define VIDEO_KEEP_KEYFRAME_IN_BUFFER_FOR_MS 15 | 27 | #define VIDEO_KEEP_KEYFRAME_IN_BUFFER_FOR_MS 15 |
28 | 28 | ||
29 | |||
30 | /* | ||
31 | * return -1 on failure, 0 on success | ||
32 | * | ||
33 | */ | ||
34 | static int rtp_send_custom_lossy_packet(Tox *tox, int32_t friendnumber, const uint8_t *data, uint32_t length) | ||
35 | { | ||
36 | Tox_Err_Friend_Custom_Packet error; | ||
37 | tox_friend_send_lossy_packet(tox, friendnumber, data, (size_t)length, &error); | ||
38 | |||
39 | if (error == TOX_ERR_FRIEND_CUSTOM_PACKET_OK) { | ||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | return -1; | ||
44 | } | ||
45 | |||
29 | // allocate_len is NOT including header! | 46 | // allocate_len is NOT including header! |
30 | static struct RTPMessage *new_message(const struct RTPHeader *header, size_t allocate_len, const uint8_t *data, | 47 | static struct RTPMessage *new_message(const struct RTPHeader *header, size_t allocate_len, const uint8_t *data, |
31 | uint16_t data_length) | 48 | uint16_t data_length) |
@@ -626,7 +643,7 @@ size_t rtp_header_unpack(const uint8_t *data, struct RTPHeader *header) | |||
626 | return p - data; | 643 | return p - data; |
627 | } | 644 | } |
628 | 645 | ||
629 | RTPSession *rtp_new(int payload_type, Messenger *m, uint32_t friendnumber, | 646 | RTPSession *rtp_new(int payload_type, Messenger *m, Tox *tox, uint32_t friendnumber, |
630 | BWController *bwc, void *cs, rtp_m_cb *mcb) | 647 | BWController *bwc, void *cs, rtp_m_cb *mcb) |
631 | { | 648 | { |
632 | assert(mcb != nullptr); | 649 | assert(mcb != nullptr); |
@@ -654,6 +671,7 @@ RTPSession *rtp_new(int payload_type, Messenger *m, uint32_t friendnumber, | |||
654 | session->ssrc = payload_type == RTP_TYPE_VIDEO ? 0 : random_u32(); | 671 | session->ssrc = payload_type == RTP_TYPE_VIDEO ? 0 : random_u32(); |
655 | session->payload_type = payload_type; | 672 | session->payload_type = payload_type; |
656 | session->m = m; | 673 | session->m = m; |
674 | session->tox = tox; | ||
657 | session->friend_number = friendnumber; | 675 | session->friend_number = friendnumber; |
658 | 676 | ||
659 | // set NULL just in case | 677 | // set NULL just in case |
@@ -787,7 +805,7 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint32_t length, | |||
787 | rtp_header_pack(rdata + 1, &header); | 805 | rtp_header_pack(rdata + 1, &header); |
788 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data, length); | 806 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data, length); |
789 | 807 | ||
790 | if (-1 == m_send_custom_lossy_packet(session->m, session->friend_number, rdata, SIZEOF_VLA(rdata))) { | 808 | if (-1 == rtp_send_custom_lossy_packet(session->tox, session->friend_number, rdata, SIZEOF_VLA(rdata))) { |
791 | const char *netstrerror = net_new_strerror(net_error()); | 809 | const char *netstrerror = net_new_strerror(net_error()); |
792 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %u)! std error: %s, net error: %s", | 810 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %u)! std error: %s, net error: %s", |
793 | (unsigned)SIZEOF_VLA(rdata), strerror(errno), netstrerror); | 811 | (unsigned)SIZEOF_VLA(rdata), strerror(errno), netstrerror); |
@@ -805,8 +823,8 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint32_t length, | |||
805 | rtp_header_pack(rdata + 1, &header); | 823 | rtp_header_pack(rdata + 1, &header); |
806 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data + sent, piece); | 824 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data + sent, piece); |
807 | 825 | ||
808 | if (-1 == m_send_custom_lossy_packet(session->m, session->friend_number, | 826 | if (-1 == rtp_send_custom_lossy_packet(session->tox, session->friend_number, |
809 | rdata, piece + RTP_HEADER_SIZE + 1)) { | 827 | rdata, piece + RTP_HEADER_SIZE + 1)) { |
810 | const char *netstrerror = net_new_strerror(net_error()); | 828 | const char *netstrerror = net_new_strerror(net_error()); |
811 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %d)! std error: %s, net error: %s", | 829 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %d)! std error: %s, net error: %s", |
812 | piece + RTP_HEADER_SIZE + 1, strerror(errno), netstrerror); | 830 | piece + RTP_HEADER_SIZE + 1, strerror(errno), netstrerror); |
@@ -825,8 +843,8 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint32_t length, | |||
825 | rtp_header_pack(rdata + 1, &header); | 843 | rtp_header_pack(rdata + 1, &header); |
826 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data + sent, piece); | 844 | memcpy(rdata + 1 + RTP_HEADER_SIZE, data + sent, piece); |
827 | 845 | ||
828 | if (-1 == m_send_custom_lossy_packet(session->m, session->friend_number, rdata, | 846 | if (-1 == rtp_send_custom_lossy_packet(session->tox, session->friend_number, rdata, |
829 | piece + RTP_HEADER_SIZE + 1)) { | 847 | piece + RTP_HEADER_SIZE + 1)) { |
830 | const char *netstrerror = net_new_strerror(net_error()); | 848 | const char *netstrerror = net_new_strerror(net_error()); |
831 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %d)! std error: %s, net error: %s", | 849 | LOGGER_WARNING(session->m->log, "RTP send failed (len: %d)! std error: %s, net error: %s", |
832 | piece + RTP_HEADER_SIZE + 1, strerror(errno), netstrerror); | 850 | piece + RTP_HEADER_SIZE + 1, strerror(errno), netstrerror); |
diff --git a/toxav/rtp.h b/toxav/rtp.h index 46cd6b86..be9e63f8 100644 --- a/toxav/rtp.h +++ b/toxav/rtp.h | |||
@@ -16,6 +16,11 @@ | |||
16 | extern "C" { | 16 | extern "C" { |
17 | #endif | 17 | #endif |
18 | 18 | ||
19 | #ifndef TOX_DEFINED | ||
20 | #define TOX_DEFINED | ||
21 | typedef struct Tox Tox; | ||
22 | #endif /* TOX_DEFINED */ | ||
23 | |||
19 | /** | 24 | /** |
20 | * RTPHeader serialised size in bytes. | 25 | * RTPHeader serialised size in bytes. |
21 | */ | 26 | */ |
@@ -159,6 +164,7 @@ typedef struct RTPSession { | |||
159 | struct RTPWorkBufferList *work_buffer_list; | 164 | struct RTPWorkBufferList *work_buffer_list; |
160 | uint8_t first_packets_counter; /* dismiss first few lost video packets */ | 165 | uint8_t first_packets_counter; /* dismiss first few lost video packets */ |
161 | Messenger *m; | 166 | Messenger *m; |
167 | Tox *tox; | ||
162 | uint32_t friend_number; | 168 | uint32_t friend_number; |
163 | BWController *bwc; | 169 | BWController *bwc; |
164 | void *cs; | 170 | void *cs; |
@@ -184,7 +190,7 @@ size_t rtp_header_pack(uint8_t *rdata, const struct RTPHeader *header); | |||
184 | */ | 190 | */ |
185 | size_t rtp_header_unpack(const uint8_t *data, struct RTPHeader *header); | 191 | size_t rtp_header_unpack(const uint8_t *data, struct RTPHeader *header); |
186 | 192 | ||
187 | RTPSession *rtp_new(int payload_type, Messenger *m, uint32_t friendnumber, | 193 | RTPSession *rtp_new(int payload_type, Messenger *m, Tox *tox, uint32_t friendnumber, |
188 | BWController *bwc, void *cs, rtp_m_cb *mcb); | 194 | BWController *bwc, void *cs, rtp_m_cb *mcb); |
189 | void rtp_kill(RTPSession *session); | 195 | void rtp_kill(RTPSession *session); |
190 | int rtp_allow_receiving(RTPSession *session); | 196 | int rtp_allow_receiving(RTPSession *session); |
diff --git a/toxav/toxav.c b/toxav/toxav.c index a3fa7894..3dbe2cff 100644 --- a/toxav/toxav.c +++ b/toxav/toxav.c | |||
@@ -1331,7 +1331,7 @@ static bool call_prepare_transmission(ToxAVCall *call) | |||
1331 | goto FAILURE; | 1331 | goto FAILURE; |
1332 | } | 1332 | } |
1333 | 1333 | ||
1334 | call->audio_rtp = rtp_new(RTP_TYPE_AUDIO, av->m, call->friend_number, call->bwc, | 1334 | call->audio_rtp = rtp_new(RTP_TYPE_AUDIO, av->m, av->tox, call->friend_number, call->bwc, |
1335 | call->audio, ac_queue_message); | 1335 | call->audio, ac_queue_message); |
1336 | 1336 | ||
1337 | if (!call->audio_rtp) { | 1337 | if (!call->audio_rtp) { |
@@ -1347,7 +1347,7 @@ static bool call_prepare_transmission(ToxAVCall *call) | |||
1347 | goto FAILURE; | 1347 | goto FAILURE; |
1348 | } | 1348 | } |
1349 | 1349 | ||
1350 | call->video_rtp = rtp_new(RTP_TYPE_VIDEO, av->m, call->friend_number, call->bwc, | 1350 | call->video_rtp = rtp_new(RTP_TYPE_VIDEO, av->m, av->tox, call->friend_number, call->bwc, |
1351 | call->video, vc_queue_message); | 1351 | call->video, vc_queue_message); |
1352 | 1352 | ||
1353 | if (!call->video_rtp) { | 1353 | if (!call->video_rtp) { |