Определения протокола RTP
Код RTP может подразделяться на три общие категории: код обработки входящих пакетов данных RTP, код, обеспечивающий прием и передачу пакетов RTCP, и вспомогательный код. Определения констант и структур данных, относящихся к программному обеспечению RTP, находятся в файле rtp.h, который приведен ниже. Кроме констант и структуры rtp, которая определяет формат пакета RTP, в этом файле находятся определения структур stream и session, содержащих информацию о сеансе приема данных и об одном потоке в составе этого сеанса. Два поля структуры stream содержат ссылки на список входящих пакетов. Поле stm_qhead указывает на первый пакет в очереди, a stm_qtail — на последний. Третье поле, stmjputex, обеспечивает работу механизма взаимного исключения, который гарантирует, что в любой момент времени к очереди будет иметь доступ только один поток. И наконец, структура rtpln описывает один «Лемент в связанном списке пакетов RTP. Гидроизоляция пруда дешево. Все для водоёмов. Заказать гидроизоляцию пруда
Файл rtp.h содержит операторы включения двух файлов, common.h и util.h, относящихся к RTP. Файл common.h содержит список включаемых файлов с определениями стандартных функций Linux, а также определения констант и типов.
Обработка значений времени
Файл util.h содержит объявления функций, предназначенных для работы с буферным пулом, а также объявление одной макрокоманды tv21in, которая служит для преобразования значений времени. Эта макрокоманда необходима в связи с тем, что в операционной системе Linux значения времени хранятся в виде пары величин, представляющих секунды и микросекунды, тогда как в большинстве функций и в программном обеспечении RTP время рассматривается как одно значение.
Макрокоманда tv21in принимает два параметра: структуру timeval, которая определена в операционной системе Linux, и переменную со значением частоты аппаратных часов (измеряемой в герцах). В результате вызова макрокоманды возвращается одно значение, которое соответствует отсчету времени с частотой часов, равной второму параметру. Таким образом, вызов функции tv21in( timtc) вырабатывает одно значение, полученное после преобразования показаний времени, приведенных в структуре tim, с учетом частоты аппаратных часов, равной с.
/* Файл util.h - макрос tv21in */ tinclude
tdefine tv21in(t, clkrt) ((t.tvjsec * clkrt) + ((int) ((double) \
t.tvjisec * .000001 * (double) clkrt))) struct bufpool {
char *bp_next? /* Указатель на следующий свободный буфер */
sem_t bp_sem; /* Счетный семафор */
pthread mutex_t bpjnutex; /* Мьютекс, применяемый для манипуляции со списком */ }?
void bpinit(void); char *bpget(void); void bpfree(void *); extern struct bufpool bp;
Обработка пропусков в последовательности пакетов RTP
Программное обеспечение RTP должно проверять порядковый номер каждого входящего пакета. С начала приема потока программное обеспечение RTP устанавливает период испытания, в течение которого должно поступить в правильном порядке хотя бы минимальное число пакетов (в этом примере кода оно равно RTP_MINSEQUENTIAL). В примере кода, приведенном в процедуре rtpupdateseq, для обратного отсчета пакетов, поступающих по порядку, применяется переменная stm.stmjprobation. Если какой-либо пакет поступает вне очереди, счетчик переустанавливается и период испытания повторяется вновь с самого начала.
После прохождения первоначального периода испытания программное обеспечение RTP проверяет последовательность входящих пакетов уже менее строго. Пакет отбрасывается, если только он прибывает со значительным опережением или отставанием от ожидаемого порядкового номера. Однако сравнение двух порядковых номеров усложняется в связи с конечным числом элементов последовательности, поскольку в коде должен учитываться тот случай, когда завершается один полный цикл отсчета порядковых номеров и начинается следующий. Поскольку в этом коде учтено зацикливание порядковых номеров, программное обеспечение RTP проверяет, находится ли порядковый номер входящего пакета в пределах постоянного расстояния от ожидаемой последовательности (в данном примере кода для этой цели служит константа RTP_MAXMIS0RDER). Рассматриваемый код содержится в файле rtpseq.c.