unix.zhegan.in
milter-callback changelog versions archive download latest stable g72x for */FreeBSD ru en

КАК САМОСТОЯТЕЛЬНО СОБРАТЬ КОДЕКИ g723/g729 для Asterisk/FreeBSD.

  • Сначала нужно из портов установить lang/icc (также можно собирать кодеки стандартным gcc, что я, наример, и делаю; в этом случае этот шаг можно пропустить). Самое трудное в этом деле - найти тарболл, потому что версия icc из портов уже довольно мохнатого года выпуска. Тарболл, не мудрствуя лукаво, можно взять здесь. Перед установкой нужно загрузить линукслятор, потому что порт вытянет по зависимостям какой-нибудь linux-base.

  • Далее нам понадобится Intel/IPP. Идем сюда и качаем Intel Integrated Performance Primitives (Intel IPP) for Linux. Intel будет предлагать сохранить куда-нибудь сериал, и грозиться, что он обязательно потребуется, но мне он так и не понадобился. Полученный tgz нужно разархивировать. Далее нужно поставить из портов archivers/rpm2cpio и куда-нибудь разархивировать содержимое трех rpm (собственно, всех rpm) из папки rpm, у меня это были intel-ippia32051-6.1p-051.i486.rpm, intel-ippia32lib051-6.1p-051.i486.rpm и intel-ippia32libdev051-6.1p-051.i486.rpm. Делается это примерно так:
    rpm2cpio.pl intel-ippia32051-6.1p-051.i486.rpm | cpio --extract --make-directories 
    		 
  • Дальше нужно просто собрать кодеки. :) Берем сырцы на asterisk.hosting.lv, разворачиваем их и правим build.sh. Нужно сделать следующее: указать путь к хэдерам asterisk (в случае с FreeBSD это /usr/local/include), поправить путь к ipp, не забыть выставить свою версию asterisk, и архитектуру процессора, под которую вы собираете кодеки. По умолчанию кодеки собираются gcc, если хочется их собрать icc, нужно поменять соответствующую строчку в build.sh. При этом в build.sh уже есть примеры, как это делается, с одним небольшим "но": в ipp за последнее время кое-что поменялось, поэтому название файла с хэдерами для старых процессорных архитектур в примере build.sh неправильное. Правильное название можно узнать из readme.htm, который находится в директории с хэдерами. У меня это, например, ~/g72x/opt/intel/ipp/6.1.2.051/ia32/tools/staticlib. Дальше просто нажимаем лапой по build.sh и получаем нечто вроде:
    # ./build.sh
    gcc -Wall -shared -Xlinker -x -D_GNU_SOURCE -DG72X_ASTERISK=16 -DIPPCORE_NO_SSE -I/usr/local/include -I/home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/include -include /home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/tools/staticlib/ipp_px.h -march=pentium2 -O3 -fomit-frame-pointer -fPIC -DG72X_3 -o codec_g723.so codec_g72x.c decg723.c encg723.c owng723.c vadg723.c aux_tbls.c -L/home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/lib -lippscmerged -lippsrmerged -lippsmerged -lippcore
    gcc -Wall -shared -Xlinker -x -D_GNU_SOURCE -DG72X_ASTERISK=16 -DIPPCORE_NO_SSE -I/usr/local/include -I/home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/include -include /home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/tools/staticlib/ipp_px.h -march=pentium2 -O3 -fomit-frame-pointer -fPIC -DG72X_9 -DG72X_9_FP -o codec_g729.so codec_g72x.c decg729fp.c encg729fp.c owng729fp.c vadg729fp.c -L/home/emz/g72x/opt/intel/ipp/6.1.2.051/ia32/lib -lippscmerged -lippsrmerged -lippsmerged -lippcore
    encg729fp.c: In function 'CodecType2Num':
    encg729fp.c:85: warning: enumeration value 'G729I_CODEC' not handled in switch
    encg729fp.c: In function 'apiG729FPEncode':
    encg729fp.c:791: warning: enumeration value 'G729I_CODEC' not handled in switch
    vadg729fp.c: In function 'VoiceActivityDetect_G729_32f':
    vadg729fp.c:303: warning: suggest parentheses around && within ||
    		 

    То, что собралось, получилось вполне рабочим. Нет, linux.ko не нужен в загруженном состоянии для работы таких кодеков. Все описанное в статье проводилось на FreeBSD 8.0-RELEASE.

This article was last modified [an error occurred while processing the directive].