Определения RTCP

Опубликовано в Технологии > Серверные технологии

Каждое сообщение RTCP начинается с заголовка, в котором указан его тип. В рассматриваемом примере кода формат заголовка сообщения определяет структура rtcp. За заголовком следует сообщение RTCP, которое может принадлежать к одному из двух типов: отчет отправителя, определенный структурой sr, или отчет получателя, определенный структурой sr. Сообщение с отчетом получателя состоит из последовательности блоков приема, где формат отдельного блока определен структурой rblock. Рассматриваемые определения содержатся в файле rtcp.h. Кресла - детские диванкровати самые дешевые. Дешевый.

Прием отчетов отправителя RTCP

Как было отмечено выше, в рассматриваемом примере кода RTCP функционирование организовано в виде двух отдельных потоков: один из них обеспечивает прием поступающих пакетов RTCP, а другой формирует исходящие пакеты. Процедура г tcprecv обрабатывает входящие сообщения с отчетами отправителя. Для выработки исходящих отчетов получателя требуется два фрагмента информации о каждом отчете отправителя: отметка времени NTP, находящаяся в отчете, и местное время получения этого сообщения. Процедура rtcprecv извлекает из отчета отправителя значение отметки времени и регистрирует это значение в структуре stream наряду со значением местного времени, возвращаемым функцией gettimeofday системы Linux. В процедуре rtcprecv используется также идентификатор источника синхронизации, содержащийся в каждом входящем отчете отправителя, для исключения сообщений, поступивших от других отправителей. Рассматриваемый код приведен в файле rtcprecv.с.

Выработка отчетов получателя RTCP

Второй поток RTCP обеспечивает формирование отчетов получателя; исходный код программного компонента, на котором основано функционирование этого потока, имеет большой объем, и поэтому он разбит на два файла. Процедура rtcpcycle содержит главный цикл, который начинает функционировать с момента установления текущего сеанса. При каждом проходе по циклу устанавливается задержка на число секунд, равное wait, после чего выполняются действия, предусмотренные в данном цикле (значение wait вычисляется, как описано ниже). Во время прохода по циклу процедура rtcpcycle проверяет, остается ли еще поток данных активным. Если во время последнего прохода по циклу поступили данные, процедура rtcpcycle передает отчет получателя. Если данные в течение последнего цикла не поступили, процедура rtcpcycle увеличивает значение переменной stm.stm_inactive, где ведется подсчет подряд идущих циклов, в которых не было получено данных. Если эта величина не превышает порогового значения RTP_INACTTHRESH, то процедура rtcpcycle не выполняет никаких действий. Если же число холостых циклов достигает порогового значения, процедура rtcpcycle вызывает процедуру rtcpsendbye для выработки сообщения о разрыве сеанса связи RTCP и завершает свою работу.

Поля в пакете RTCP имеют нестандартный размер, что приводит к дополнительному усложнению процедуры rtcpcycle. Например, спецификация RTCP предусматривает, что накопленное число потерянных пакетов должно быть представлено в виде 24-битового целого числа. Сразу после вычисления числа потерянных пакетов путем вычитания числа поступивших пакетов из общего числа ожидаемых пакетов, в процедуре rtcpcycle необходимо вызвать макрос hton24 для преобразования полученного значения из 32-битового в 24-битовое целое число. Однако перед выполнением такого преобразования в процедуре rtcpcycle необходимо проверить, что это значение находится в допустимом диапазоне. В ней вначале вызывается макрос min для проверки того, что это значение не превышает максимально возможного положительного 24-битового целого числа. Затем в ней вызывается макрос max для проверки того, что это значение остается выше минимального отрицательного 24-битового целого числа.

В том случае, если возникает необходимость отправить отчет получателя, процедура rtcpcycle заполняет блок отчета и заголовок сообщения, а затем передает это сообщение. После отправки отчета процедура rtcpcycle разблокирует структуры данных, повторно вычислит продолжительность своей приостановки и повторит цикл. Рассматриваемый код содержится в файле rtcpcycle.с.

Похожие статьи