Ведение статистики для формирования отчетов RTCP
Протокол RTCP предусматривает периодическое формирование отчетов получателя. Для этого программное обеспечение RTCP должно, иметь информацию о том, какой пакет был получен последним по времени и какова при этом была флуктуация. При поступлении каждого пакета RTP вызывается процедура rtpupdate. Она обновляет статистические данные, которые требуются для составления отчета получателя в соответствии со спецификацией, которая определена в стандарте протокола. Надежное видеооборудывание. Спрос на оптоволоконный приемник растет! Стоимость оборудования. Рассматриваемый код содержится в файле rtpupdate.c.
Инициализация программного обеспечения RTP
Теперь, после рассмотрения процедур, которые обрабатывают входящие пакеты RTP, перейдем к описанию процедуры инициализации. Код инициализации, который обеспечивает инициализацию потоков, сокетов и всех структур данных, приведен в файле rtpinit.c.
Выполнение процедуры rtpinit начинается с заполнения нулевыми значениями структуры, содержащей информацию о сеансе. Затем эта процедура создает пул буферов пакетов, а также инициализирует условную переменную и мьютекс, которые используются потоками. После этого процедура создает сокеты для трафика RTP и RTCP и привязывает их к соответствующим (групповым) адресам. И наконец, после подготовки сокетов и всех переменных мьютекса процедура rtpinit запускает второй и третий потоки. Один из них обрабатывает входящие пакеты RTP, а другой — входящие пакеты RTCP. Напомним, что четвертый поток, который отправляет отчеты получателя RTCP, создается процедурой rtprecv сразу после установления сеанса.
Последний фрагмент кода находится в главной процедуре. В ней вызывается процедура rtpinit для инициализации кода RTP и playaudio для воспроизведения аудиоинформации. В нашей реализации процедура playaudio никогда не возвращает управление, поскольку по окончании сеанса процедура rtcpcycle вызывает функцию exit и процесс завершается. Однако после вызова процедуры playaudio вставлен оператор return для обеспечения того, чтобы эта главная процедура успешно прошла проверку утилитой lint. Рассматриваемый код содержится в файле main.с.
int
main(int argc, char **argv) {
rtpinit(inet_addr(argv[1]), atoi(argv[2]));
playaudio();
return 0;
}
Процедура playaudio.с выполняет чтение данных из потока RTP и воспроизводит данные, которые соответствуют текущему моменту времени "now". Для этого в указанной процедуре необходимо установить соответствие между временем на часах локального компьютера и временем, отсчитанным по часам источника мультимедийного потока RTP. Это соответствие устанавливается процедурой rtpnewdata; после достижения порогового уровня заполнения флуктуационного буфера процедура rtpnewdata регистрирует текущее местное время в переменной stm.stm_clkx, а мультимедийное время из первого пакета — в переменной stm.stm_clky. Процедура playaudio использует эти два значения для пересчета текущих показаний часов в показания часов источника мультимедийной информации, содержащейся в пакетах RTP. Поэтому после получения доступа к очередному пакету процедура playaudio может еще раз проверить время, в которое должны быть воспроизведены данные из этого пакета. Если это значение соответствует прошедшему моменту времени, процедура playaudio просто пропускает пакет без его воспроизведения, а если же это значение соответствует будущему моменту времени, процедура playaudio вычисляет, сколько пройдет времени до того момента, как должно начаться воспроизведение данных, и блокируется, устанавливая задержку до этого времени. И наконец, даже после обнаружения пакета, который содержит данные, соответствующие текущему времени, процедура playaudio не начинает автоматически воспроизведение данных из этого пакета. Вместо этого процедура playaudio вычисляет смещение в пакете для поиска данных, точно соответствующих текущему времени, и начинает воспроизведение данных с этого места.