int codec_unmap_payload(codec_id_t id, u_char pt) { if (payload_is_valid(pt) && codec_id_is_valid(id) && payload_map[pt] == id) { payload_map[pt] = 0; codec_map[CODEC_GET_IFS_INDEX(id)][CODEC_GET_FMT_INDEX(id)] = CODEC_PAYLOAD_DYNAMIC; return TRUE; } debug_msg("Failed to unmap payload\n"); return FALSE; }
u_char codec_get_payload(codec_id_t id) { u_char pt; assert(codec_id_is_valid(id)); pt = codec_map[CODEC_GET_IFS_INDEX(id)][CODEC_GET_FMT_INDEX(id)]; if (payload_is_valid(pt)) { assert(codec_get_by_payload(pt) == id); return pt; } return CODEC_PAYLOAD_DYNAMIC; }
codec_id_t codec_get_by_payload (u_char pt) { if (payload_is_valid(pt)) { #ifdef DEBUG if (payload_map[pt] == 0) { debug_msg("No codec for payload %d\n", pt); } #endif return payload_map[pt]; } else { debug_msg("codec_get_by_payload - invalid payload (%d)\n", pt); return 0; } }
int codec_map_payload(codec_id_t id, u_char pt) { if (payload_is_valid(pt) && codec_id_is_valid(id)) { if (payload_map[pt] != 0) { codec_unmap_payload(id, pt); } payload_map[pt] = id; codec_map[CODEC_GET_IFS_INDEX(id)][CODEC_GET_FMT_INDEX(id)] = pt; return TRUE; } #ifdef DEBUG { const codec_format_t *cf; cf = codec_get_format(id); debug_msg("Failed to map payload for %s\n", cf->long_name); } #endif /* DEBUG */ return FALSE; }
/* Adds header to next free slot in channel_data */ static void add_hdr(channel_unit *chu, int hdr_type, codec_id_t cid, uint32_t uo, uint32_t len) { uint32_t so; /* sample time offset */ u_char pt; assert(chu != NULL); assert(chu->data == NULL); pt = codec_get_payload(cid); assert(payload_is_valid(pt)); so = codec_get_samples_per_frame(cid) * uo; assert(so <= RED_MAX_OFFSET); assert(len <= RED_MAX_LEN ); if (hdr_type == RED_EXTRA) { uint32_t *h; h = (uint32_t*)block_alloc(4); RED_HDR32_INIT(*h); RED_HDR32_SET_PT(*h, (uint32_t)pt); RED_HDR32_SET_OFF(*h, so); RED_HDR32_SET_LEN(*h, len); *h = htonl(*h); chu->data = (u_char*)h; chu->data_len = sizeof(*h); } else { u_char *h; assert(hdr_type == RED_PRIMARY); h = (u_char*)block_alloc(1); RED_HDR8_INIT(*h); RED_HDR8_SET_PT(*h, pt); chu->data = h; chu->data_len = sizeof(*h); } }