集成IPP的pjsip在Linux下的static linking編譯

在Linux下用gcc編譯pjsip並不是一件太困難的事情,但是如果要用Intel所提供的IPP開發包進行g729的流壓縮處理,則可能會有一定問題。http://trac.pjsip.org/repos/wiki/Intel_IPP_Codecs提供了大致指導,但是它是基於IPP5的,而且對static linking的描述在IPP6下是行不通的,需要做一定的更改。
本人正好有一個項目:在linux下開發softphone和frontdesk,支持g729流壓縮以提高語音通話質量。下面是staticlinking編譯處理的步驟。

1,下載IPP和IPP Samples並且按照說明安裝它們(這個步驟應該比較簡單)。
2,更改IPPSamples(_bin->binlibspeech.a->libusc.a)
mv./ipp-samples/speech-codecs/_bin./ipp-samples/speech-codecs/bin
mv ./ipp-samples/speech-codecs/bin/linux32_gcc4/lib/libspeech.a./ipp-samples/speech-codecs/bin/linux32_gcc4/lib/libusc.a
3,設置環境變量
export IPPROOT=/opt/intel/ipp/6.1.2.051/ia32
export IPPSAMPLES=/home/admin0/ipp-samples

4,修改pjsip的相應源代碼
4.1)在pjlib\include\pj\config_site.h 頭文件中添加IPP,g729支持:
#definePJMEDIA_HAS_INTEL_IPP 
  1
#definePJMEDIA_HAS_INTEL_IPP_CODEC_AMR    0
#definePJMEDIA_HAS_INTEL_IPP_CODEC_AMRWB  0
#definePJMEDIA_HAS_INTEL_IPP_CODEC_G729   1
#define PJMEDIA_HAS_INTEL_IPP_CODEC_G723_1 0
#definePJMEDIA_HAS_INTEL_IPP_CODEC_G726   0
#definePJMEDIA_HAS_INTEL_IPP_CODEC_G728   0
#define PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 0
#define PJMEDIA_AUTO_LINK_IPP_LIBS  0
以下步驟是基於項目實際情況的修改,你可能並不需要。
4.2)pjmedia\src\pjmedia-codec\ipp_codec.c 在頭文件 #include<usc.h>前添加
----------------
#if defined(_MSC_VER) &&PJMEDIA_AUTO_LINK_IPP_STATIC_LIBS
#include <ipp_w7.h>
#endif
---------------
"ipp_w7.h" 還有其他選項,根據操作系統,CPU類型選擇不同的頭文件

4.3)pjsip-apps\src\pjsua\pjsua_app.c
4.3.1) include ippcore.h to call initial static linking.
#include <ippcore.h>
4.3.2) Add
-------------
ippStaticInit();
-------------
before
 
    for (i=0;i<PJ_ARRAY_SIZE(app_config.call_data); ++i) {
   app_config.call_data[i].timer.id = PJSUA_INVALID_ID;
   app_config.call_data[i].timer.cb =&call_timeout_callback;
    }
4.3.3) set priority of g927
in app_init function.
------------------
define pj_str_t tmp;
-----------------
take out the original priority setting and replace by
--------------------
pjsua_codec_set_priority(pj_cstr(&tmp, "g729"),240);
pjsua_codec_set_priority(pj_cstr(&tmp, "gsm"),239);
pjsua_codec_set_priority(pj_cstr(&tmp, "pcma"),238);
pjsua_codec_set_priority(pj_cstr(&tmp, "pcmu"),237);
pjsua_codec_set_priority(pj_cstr(&tmp,"speex/8000"), 190);
pjsua_codec_set_priority(pj_cstr(&tmp, "ilbc"),189);
pjsua_codec_set_priority(pj_cstr(&tmp,"speex/16000"), 180);
pjsua_codec_set_priority(pj_cstr(&tmp,"speex/32000"), 0); 
------------------ 
以上步驟是主要的pjsip修改。項目不同,修改的方式也不同

5,go to /pjsip-apps/build/Makefile
change $(CC_INC)../../pjmedia/include ->$(CC_INC)../../pjmedia/include \
and add one line $(CC_INC)/opt/intel/ipp/6.1.2.051/ia32/include\

6,cp user.mak.sample user.mak

# export CFLAGS += -Wno-unused-label -Werror
export LDFLAGS +=  -lippscmerged -lippsmerged-lippsrmerged

7,./configure --disable-oss --enable-ipp --with-ipp=$IPPROOT--with-ipp-samples=$IPPSAMPLES
--disable-oss選項是爲了解決Linux下音頻Device的衝突。
注:我在項目中用的是java調用pjsua,javax.sound.sampledAPI遇到了設備佔用的問題。這是JDK的一個bug,可能在JDK7中這個問題會得以解決。爲了避開JDK的這個問題,改用了openJDK6.

8,go to config.status
change
------------
s,@ac_build_mak_vars@,
export IPP_CFLAGS=-I/opt/intel/ipp/6.1.2.051/ia32/include-I/home/admin0/ipp-samples/speech-codecs/core/usc/include
export IPP_LDFLAGS=-L/opt/intel/ipp/6.1.2.051/ia32/sharedlib-L/home/admin0/ipp-samples/speech-codecs/bin/linux32_gcc4/lib
-------------
to
---------
s,@ac_build_mak_vars@, \
export IPP_CFLAGS=-I/opt/intel/ipp/6.1.2.051/ia32/include-I/home/admin0/ipp-samples/speech-codecs/core/usc/include \
export IPP_LDFLAGS=-L/opt/intel/ipp/6.1.2.051/ia32/lib-L/home/admin0/ipp-samples/speech-codecs/bin/linux32_gcc4/lib\
--------

9, ./config.status

10,build.mak
change
export IPP_LIBS=-lusc -lippsc -lipps -lippsr -lippcore-lguide
to
export IPP_LIBS=-lusc -lippscemerged -lippscmerged -lippsremerged-lippsrmerged -lippsemerged -lippsmerged -lippcore
注:IPP6的選項和5是不同的

11,make dep
12, make

通過以上步驟,可以在 pjsip-apps/bin的目錄下看到經過static linking的可執行文件pjsua.

發佈了29 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章