Интегрированные сети ISDN


Таблица Типы SDES - часть 2


while (r < end && r->common.version == 2);

if (r != end) {

/* что-то не в порядке с форматом пакета */

}

Генерирование пакетов SDES RTCP

Эта функция формирует фрагмент SDES, состоящий из элементов argc, взятых из массивов type, в буфере b.

char *rtp_write_sdes(char *b, u_int32 src, int argc,

rtcp_sdes_type_t type[], char *value[],

int length[])

{

rtcp_sdes_t *s = (rtcp_sdes_t *)b;

rtcp_sdes_item_t *rsp;

int i;

int len;

int pad;

/* SSRC header */

s->src = src;

rsp = &s->item[0];

/* SDES items */

for (i = 0; i < argc; i++) {

rsp->type = type[i];

len = length[i];

if (len > RTP_MAX_SDES) {

/* неверная длина, возможно нужны другие действия */

len = RTP_MAX_SDES;

}

rsp->length = len;

memcpy(rsp->data, value[i], len);

rsp = (rtcp_sdes_item_t *)&rsp->data[len];

}

/* завершить конечным маркером и заполнителем на очередной 4-октетной границе */

len = ((char *) rsp) - b;

pad = 4 - (len & 0x3);

b = (char *) rsp;

while (pad--) *b++ = RTCP_SDES_END;

return b;

}

Разбор пакетов RTCP SDES

Эта функция осуществляет разбор пакета SDES, вызывая функции find_member() для поиска указателя на информацию для члена сессии с идентификатором SSRC и member_sdes() для запоминания новой информации SDES для этого участника. Этой функции необходим указатель на заголовок пакета RTCP.

void rtp_read_sdes(rtcp_t *r)

{

int count = r->common.count;

rtcp_sdes_t *sd = &r->r.sdes;

rtcp_sdes_item_t *rsp, *rspn;

rtcp_sdes_item_t *end = (rtcp_sdes_item_t *)

((u_int32 *)r + r->common.length + 1);

source *s;

while (--count >= 0) {

rsp = &sd->item[0];

if (rsp >= end) break;

s = find_member(sd->src);

for (; rsp->type; rsp = rspn ) {

rspn = (rtcp_sdes_item_t *)((char*)rsp+rsp->length+2);

if (rspn >= end) {

rsp = rspn;

break;

}

member_sdes(s, rsp->type, rsp->data, rsp->length);

}

sd = (rtcp_sdes_t *)

((u_int32 *)sd + (((char *)rsp - (char *)sd) >> 2)+1);



Начало  Назад  Вперед



Книжный магазин