/* Set handlers for custom lossy packets. * Set the function to be called when friend sends us a lossy packet starting with byte. * byte must be in the 200-254 range. * * NOTE: lossy packets behave like UDP packets meaning they might never reach the other side * or might arrive more than once (if someone is messing with the connection) or might arrive * in the wrong order. * * Unless latency is an issue, it is recommended that you use lossless packets instead. * * return -1 on failure. * return 0 on success. */ int tox_lossy_packet_registerhandler(Tox *tox, int32_t friendnumber, uint8_t byte, int (*packet_handler_callback)(void *object, const uint8_t *data, uint32_t len), void *object) { Messenger *m = tox; if (byte < (PACKET_ID_LOSSY_RANGE_START + 8)) /* First 8 reserved for A/V*/ return -1; return custom_lossy_packet_registerhandler(m, friendnumber, byte, packet_handler_callback, object); }
RTPSession *rtp_new ( int payload_type, Messenger *messenger, int friend_num ) { RTPSession *retu = calloc(1, sizeof(RTPSession)); if ( !retu ) { LOGGER_WARNING("Alloc failed! Program might misbehave!"); return NULL; } if ( -1 == custom_lossy_packet_registerhandler(messenger, friend_num, payload_type, rtp_handle_packet, retu)) { LOGGER_ERROR("Error setting custom register handler for rtp session"); free(retu); return NULL; } LOGGER_DEBUG("Registered packet handler: pt: %d; fid: %d", payload_type, friend_num); retu->version = RTP_VERSION; /* It's always 2 */ retu->padding = 0; /* If some additional data is needed about the packet */ retu->extension = 0; /* If extension to header is needed */ retu->cc = 1; /* Amount of contributors */ retu->csrc = NULL; /* Container */ retu->ssrc = random_int(); retu->marker = 0; retu->payload_type = payload_type % 128; retu->dest = friend_num; retu->rsequnum = retu->sequnum = 0; retu->ext_header = NULL; /* When needed allocate */ if ( !(retu->csrc = calloc(1, sizeof (uint32_t))) ) { LOGGER_WARNING("Alloc failed! Program might misbehave!"); free(retu); return NULL; } retu->csrc[0] = retu->ssrc; /* Set my ssrc to the list receive */ /* Also set payload type as prefix */ retu->prefix = payload_type; /* * */ return retu; }
void rtp_kill ( RTPSession *session, Messenger *messenger ) { if ( !session ) return; custom_lossy_packet_registerhandler(messenger, session->dest, session->prefix, NULL, NULL); free ( session->ext_header ); free ( session->csrc ); LOGGER_DEBUG("Terminated RTP session: %p", session); /* And finally free session */ free ( session ); }