知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
使用CodecEngine的API函數(shù)(四)
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):57
本文翻譯自TI的手冊,該手冊是進(jìn)修GPP+DSP開辟的金典文檔,欲望對各位入門有所贊助,有懂得欠妥之處望請賜教。
Codec Engine Application Developer User's Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 應(yīng)用開辟應(yīng)用手冊》 http://blog.csdn.net/dyzok88/article/details/42154487
《第一章 Codec Engine 概要》 http://blog.csdn.net/dyzok88/article/details/42214813
《第二章 Codec Engine 安裝和設(shè)置》 http://blog.csdn.net/dyzok88/article/details/42278109
《第三章 應(yīng)用 Codec Engine 的示例應(yīng)用法度榜樣》http://blog.csdn.net/dyzok88/article/details/42302793
// 正文
在雙 CPU 的體系中,被設(shè)備的引擎“長途”運(yùn)行(在 DSP 中)算法,透明地應(yīng)用一個(gè)“DSP辦事器”。DSP 的辦事器是一個(gè)集成算法及其框架的可履行法度榜樣(例如,DSP/BIOS,框架組件,編解碼器,和 DSP Link 驅(qū)動(dòng)法度榜樣),當(dāng)引擎被打開時(shí),這些組件將在 DSP 上被加載并開端運(yùn)行。
辦事器 API 函數(shù)能被在 GPP 上運(yùn)行的應(yīng)用法度榜樣調(diào)用,可以拜訪有關(guān)DSP的辦事器的信息,并控制DSP辦事器。更具體地說,這些 API 函數(shù)許可 GPP 應(yīng)用法度榜樣獲取有關(guān) DSP 辦事器中設(shè)備的內(nèi)存堆數(shù)量,一個(gè)零丁的內(nèi)存堆的當(dāng)前應(yīng)用狀況等信息。以及從新設(shè)備 DSP 辦事器的算法堆的基址和大年夜小。
涉及到辦事器的 API 函數(shù)是:
1. Engine_getServer(). 獲得辦事器的句柄。
2. Server_getNumMemSegs(). 獲得在一個(gè)辦事器中的堆數(shù)。
3. Server_getMemStat(). 獲取有關(guān)辦事器的堆統(tǒng)計(jì)信息。
4. Server_redefineHeap(). 設(shè)置辦事器堆的基址和大年夜小。
5. Server_restoreHeap(). 重置辦事器堆到默認(rèn)基址和大年夜小。
要拜訪 DSP 辦事器的引擎,GPP 應(yīng)用法度榜樣必須經(jīng)由過程調(diào)用 Engine_getServer() API 起首獲得一個(gè)辦事器句柄,例如:
注:引擎句柄,辦事器句柄都不是線程保護(hù)。每個(gè)線程應(yīng)用辦事器句柄必須履行本身的 Engine_getServer() 調(diào)用(應(yīng)用本身的引擎句柄),或包管共享辦事器句柄的同步拜訪的。
如不雅 Engine_getServer() 返回值是 NULL,那么引擎沒有辦事器。
GPP 應(yīng)用法度榜樣可以經(jīng)由過程調(diào)用 Server_getNumMemSegs() 函數(shù),獲得設(shè)備到DSP辦事器中內(nèi)存堆的數(shù)量,例如:
這些 API 函數(shù)返回以下缺點(diǎn)的代碼:
1. Server_EOK - 成功。在這種情況下, numSegs 包含 DSP 辦事器中的堆數(shù)。
2. Server_ERUNTIME - 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
一旦堆的數(shù)量是已知的,GPP 應(yīng)用法度榜樣應(yīng)用 Server_getMemStat() 函數(shù),然后可以經(jīng)由過程此數(shù)迭代,獲得每個(gè)堆統(tǒng)計(jì)信息。內(nèi)存統(tǒng)計(jì)數(shù)據(jù)返回到 Server_MemStat 構(gòu)造體:
下面的示例代碼顯示了這些 API 函數(shù)的用法(為了可讀性,忽視缺點(diǎn)檢查)
Server_getMemStat() 的返回值如下:
1. Server_EOK. 成功。
2. Server_ENOTFOUND. 段號(hào)超出范圍。
3. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
DSP 辦事器可以被設(shè)備為專門用于算法堆的內(nèi)存段。在某些情況下,DSP 辦事器被設(shè)備小算法堆,GPP 應(yīng)用法度榜樣在運(yùn)行時(shí),可能須要為算法堆供給較大年夜的,被 DSP 辦事器應(yīng)用的持續(xù)內(nèi)存塊。然后,當(dāng)堆不被 DSP 應(yīng)用時(shí),該內(nèi)存可以大年夜 DSP 收受接收,進(jìn)而被 GPP 應(yīng)用。下面的辦事器 API 函數(shù)供給了從新設(shè)備 DSP 算法堆的手段:
傳遞給這些函數(shù)的參數(shù)" name "是要從新設(shè)備堆的名稱;它必須不大年夜于 Server_MAXSEGNAMELENGTH 字符長。傳遞給 Server_redefineHeap() 的" base "地址,必須為DSP的地址,大年夜 base 到 base + size 的內(nèi)存必須是持續(xù)的物理內(nèi)存。參數(shù)" size "在 DSP MADUs(minimum addressable data units,可尋址的最小數(shù)據(jù)單位)中給出的?;窇?yīng)為8字節(jié)對齊,但對大年夜小沒有對齊限制;大年夜小的值為 0 是可接收的。
當(dāng)堆膳綾腔有內(nèi)存被當(dāng)前分派時(shí),在 DSP 算法堆只能被從新設(shè)備。 Server_restoreHeap() 函數(shù)重置算法堆的基地址和大年夜小,回到它們的原始值(任何調(diào)用 Server_redefineHeap() 之前的值)。成功調(diào)用 Server_restoreHeap() 后,內(nèi)存先前的“從新定義”到堆,可被該體系再次應(yīng)用。
Server_redefineHeap() 的返回值如下:
1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大年夜小導(dǎo)致與另一堆重疊。
3. Server_EINUSE. 內(nèi)存被當(dāng)前分派在算法堆。
4. Server_ENOTFOUND. 沒有發(fā)明給定的名稱的堆。
5. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
Server_restoreHeap() 返回下列任何的值:
1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大年夜小導(dǎo)致與另一堆重疊。
3. Server_EINUSE. 內(nèi)存被當(dāng)前分派在算法堆。
4. Server_ENOTFOUND. 沒有發(fā)明給定的名稱的堆。
5. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
下面的代碼解釋,這兩個(gè) API 若何可以在 DM644x (一個(gè) GPP+DSP 器件)上應(yīng)用,在這個(gè)示例中,GPP 應(yīng)用法度榜樣應(yīng)用 Memory_contigAlloc() 函數(shù)分派一個(gè)持續(xù)的內(nèi)存塊。然而,經(jīng)由過程此函數(shù)返回的地址是對 GPP 的虛擬地址,是以必須將其傳遞到 Server_redefineHeap() 前轉(zhuǎn)換到 DSP 地址,Memory_getBufferPhysicalAddress() 函數(shù)可以將虛擬地址轉(zhuǎn)換為 GPP 的物理地址,如許在 DM644x 的的情況下,就是雷同的 DSP 的地址。
算法運(yùn)行后,該算法堆被復(fù)位到其本來的大年夜小和地位,為了更好的可讀性,缺點(diǎn)檢查被省略。
在其他情況下,應(yīng)用法度榜樣可能須要從新設(shè)備算法堆到一個(gè)地址,在 ARM 上分派緩沖區(qū)不克不及獲得該地址。例如,假設(shè)在 DSP 上有固定的內(nèi)存空間,該空間給應(yīng)用法度榜樣用于算法堆之間的瓜代,取決運(yùn)行什么算法。在這種情況下,應(yīng)用法度榜樣可以直接傳遞 DSP 的地址給 Server_redefineHeap() 函數(shù)。
Codec Engine Application Developer User's Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 應(yīng)用開辟應(yīng)用手冊》 http://blog.csdn.net/dyzok88/article/details/42154487
《第一章 Codec Engine 概要》 http://blog.csdn.net/dyzok88/article/details/42214813
《第二章 Codec Engine 安裝和設(shè)置》 http://blog.csdn.net/dyzok88/article/details/42278109
《第三章 應(yīng)用 Codec Engine 的示例應(yīng)用法度榜樣》http://blog.csdn.net/dyzok88/article/details/42302793
// 正文
4.4 Codec 辦事器 API 函數(shù)
在雙 CPU 的體系中,被設(shè)備的引擎“長途”運(yùn)行(在 DSP 中)算法,透明地應(yīng)用一個(gè)“DSP辦事器”。DSP 的辦事器是一個(gè)集成算法及其框架的可履行法度榜樣(例如,DSP/BIOS,框架組件,編解碼器,和 DSP Link 驅(qū)動(dòng)法度榜樣),當(dāng)引擎被打開時(shí),這些組件將在 DSP 上被加載并開端運(yùn)行。
辦事器 API 函數(shù)能被在 GPP 上運(yùn)行的應(yīng)用法度榜樣調(diào)用,可以拜訪有關(guān)DSP的辦事器的信息,并控制DSP辦事器。更具體地說,這些 API 函數(shù)許可 GPP 應(yīng)用法度榜樣獲取有關(guān) DSP 辦事器中設(shè)備的內(nèi)存堆數(shù)量,一個(gè)零丁的內(nèi)存堆的當(dāng)前應(yīng)用狀況等信息。以及從新設(shè)備 DSP 辦事器的算法堆的基址和大年夜小。
涉及到辦事器的 API 函數(shù)是:
1. Engine_getServer(). 獲得辦事器的句柄。
2. Server_getNumMemSegs(). 獲得在一個(gè)辦事器中的堆數(shù)。
3. Server_getMemStat(). 獲取有關(guān)辦事器的堆統(tǒng)計(jì)信息。
4. Server_redefineHeap(). 設(shè)置辦事器堆的基址和大年夜小。
5. Server_restoreHeap(). 重置辦事器堆到默認(rèn)基址和大年夜小。
4.4.1 獲取辦事器句柄
要拜訪 DSP 辦事器的引擎,GPP 應(yīng)用法度榜樣必須經(jīng)由過程調(diào)用 Engine_getServer() API 起首獲得一個(gè)辦事器句柄,例如:
static String engineName = "auddec"; Engine_Handle engine; Server_Handle server; Engine_Error err; engine = Engine_open(engineName, NULL, &err); server = Engine_getServer(engine);
注:引擎句柄,辦事器句柄都不是線程保護(hù)。每個(gè)線程應(yīng)用辦事器句柄必須履行本身的 Engine_getServer() 調(diào)用(應(yīng)用本身的引擎句柄),或包管共享辦事器句柄的同步拜訪的。
如不雅 Engine_getServer() 返回值是 NULL,那么引擎沒有辦事器。
4.4.2 獲取內(nèi)存堆信息
GPP 應(yīng)用法度榜樣可以經(jīng)由過程調(diào)用 Server_getNumMemSegs() 函數(shù),獲得設(shè)備到DSP辦事器中內(nèi)存堆的數(shù)量,例如:
Server_Handle server; Server_Status status; Int numSegs; /* Get the server handle from a previously opened Engine */ server = Engine_getServer(engine); status = Server_getNumMemSegs(server, &numSegs);
這些 API 函數(shù)返回以下缺點(diǎn)的代碼:
1. Server_EOK - 成功。在這種情況下, numSegs 包含 DSP 辦事器中的堆數(shù)。
2. Server_ERUNTIME - 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
一旦堆的數(shù)量是已知的,GPP 應(yīng)用法度榜樣應(yīng)用 Server_getMemStat() 函數(shù),然后可以經(jīng)由過程此數(shù)迭代,獲得每個(gè)堆統(tǒng)計(jì)信息。內(nèi)存統(tǒng)計(jì)數(shù)據(jù)返回到 Server_MemStat 構(gòu)造體:
typedef struct Server_MemStat { Char name[Server_MAXSEGNAMELENTH+1]; /* Name of heap segment */ Uint32 base; /* Base address of heap */ Uint32 size; /* Original heap size */ Uint32 used; /* DSP MAUs of heap used */ Uint32 maxBlockLen; /* Length of largest free block */ } Server_MemStat;
下面的示例代碼顯示了這些 API 函數(shù)的用法(為了可讀性,忽視缺點(diǎn)檢查)
Server_Handle server; Int numSegs, i; Server_MemStat stat; Server_Status status; status = Server_getNumMemSegs(server, &numSegs); for (i = 0; i < numSegs; i++) { status = Server_getMemStat(server, i, &stat); printf("%s: base: 0x%x size: 0x%x used: 0x%x max free block: 0x%x", stat.name, stat.base, stat.size, stat.used, stat.maxBlockLen); }
Server_getMemStat() 的返回值如下:
1. Server_EOK. 成功。
2. Server_ENOTFOUND. 段號(hào)超出范圍。
3. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
4.4.3 從新設(shè)備DSP辦事器的算法堆
DSP 辦事器可以被設(shè)備為專門用于算法堆的內(nèi)存段。在某些情況下,DSP 辦事器被設(shè)備小算法堆,GPP 應(yīng)用法度榜樣在運(yùn)行時(shí),可能須要為算法堆供給較大年夜的,被 DSP 辦事器應(yīng)用的持續(xù)內(nèi)存塊。然后,當(dāng)堆不被 DSP 應(yīng)用時(shí),該內(nèi)存可以大年夜 DSP 收受接收,進(jìn)而被 GPP 應(yīng)用。下面的辦事器 API 函數(shù)供給了從新設(shè)備 DSP 算法堆的手段:
Server_Status Server_redefineHeap(Server_Handle server, String name, Uint32 base, Uint32 size); Server_Status Server_restoreHeap(Server_Handle server, String name);
傳遞給這些函數(shù)的參數(shù)" name "是要從新設(shè)備堆的名稱;它必須不大年夜于 Server_MAXSEGNAMELENGTH 字符長。傳遞給 Server_redefineHeap() 的" base "地址,必須為DSP的地址,大年夜 base 到 base + size 的內(nèi)存必須是持續(xù)的物理內(nèi)存。參數(shù)" size "在 DSP MADUs(minimum addressable data units,可尋址的最小數(shù)據(jù)單位)中給出的?;窇?yīng)為8字節(jié)對齊,但對大年夜小沒有對齊限制;大年夜小的值為 0 是可接收的。
當(dāng)堆膳綾腔有內(nèi)存被當(dāng)前分派時(shí),在 DSP 算法堆只能被從新設(shè)備。 Server_restoreHeap() 函數(shù)重置算法堆的基地址和大年夜小,回到它們的原始值(任何調(diào)用 Server_redefineHeap() 之前的值)。成功調(diào)用 Server_restoreHeap() 后,內(nèi)存先前的“從新定義”到堆,可被該體系再次應(yīng)用。
Server_redefineHeap() 的返回值如下:
1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大年夜小導(dǎo)致與另一堆重疊。
3. Server_EINUSE. 內(nèi)存被當(dāng)前分派在算法堆。
4. Server_ENOTFOUND. 沒有發(fā)明給定的名稱的堆。
5. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
Server_restoreHeap() 返回下列任何的值:
1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大年夜小導(dǎo)致與另一堆重疊。
3. Server_EINUSE. 內(nèi)存被當(dāng)前分派在算法堆。
4. Server_ENOTFOUND. 沒有發(fā)明給定的名稱的堆。
5. Server_ERUNTIME. 產(chǎn)生內(nèi)部運(yùn)行時(shí)缺點(diǎn)。
下面的代碼解釋,這兩個(gè) API 若何可以在 DM644x (一個(gè) GPP+DSP 器件)上應(yīng)用,在這個(gè)示例中,GPP 應(yīng)用法度榜樣應(yīng)用 Memory_contigAlloc() 函數(shù)分派一個(gè)持續(xù)的內(nèi)存塊。然而,經(jīng)由過程此函數(shù)返回的地址是對 GPP 的虛擬地址,是以必須將其傳遞到 Server_redefineHeap() 前轉(zhuǎn)換到 DSP 地址,Memory_getBufferPhysicalAddress() 函數(shù)可以將虛擬地址轉(zhuǎn)換為 GPP 的物理地址,如許在 DM644x 的的情況下,就是雷同的 DSP 的地址。
算法運(yùn)行后,該算法堆被復(fù)位到其本來的大年夜小和地位,為了更好的可讀性,缺點(diǎn)檢查被省略。
Server_Handle server = NULL; Server_Status status; Engine_Handle ce = NULL; XDAS_Int8 *buf; Uint32 base; String decoderName = "auddec_copy"; String encoderName = "audenc_copy"; String engineName = "audio_copy"; /* Open the Engine and get Server handle. Note, the * Engine_open() call will load and start the DSP. */ ce = Engine_open(engineName, NULL, NULL); server = Engine_getServer(ce); /* Allocate block of memory, contiguous in physical memory */ buf = (XDAS_Int8 *)Memory_contigAlloc(BUFSIZE, ALIGNMENT); /* Convert virtual address to physical address, which on * DM644x, happens to be the same as the DSP address. */ base = Memory_getBufferPhysicalAddress(buf, BUFSIZE, NULL); /* Reconfigure the algorithm heap */ status = Server_redefineHeap(server, "DDRALGHEAP", base, BUFSIZE); 'Create and run codecs' 'Delete codecs' /* Reconfigure algorithm heap back to its original state. */ status = Server_restoreHeap(server, "DDRALGHEAP"); /* Free the buffer */ Memory_contigFree(buf, BUFSIZE);
在其他情況下,應(yīng)用法度榜樣可能須要從新設(shè)備算法堆到一個(gè)地址,在 ARM 上分派緩沖區(qū)不克不及獲得該地址。例如,假設(shè)在 DSP 上有固定的內(nèi)存空間,該空間給應(yīng)用法度榜樣用于算法堆之間的瓜代,取決運(yùn)行什么算法。在這種情況下,應(yīng)用法度榜樣可以直接傳遞 DSP 的地址給 Server_redefineHeap() 函數(shù)。
相關(guān)案例查看更多
相關(guān)閱讀
- 楚雄網(wǎng)站建設(shè)公司
- 智慧農(nóng)貿(mào)市場
- 網(wǎng)站建設(shè)報(bào)價(jià)
- 汽車報(bào)廢回收
- 大理小程序開發(fā)
- 百度推廣
- 跳轉(zhuǎn)小程序
- 云南科技公司
- 小程序設(shè)計(jì)
- 云南etc小程序
- 小程序開發(fā)公司
- 云南網(wǎng)絡(luò)營銷
- 小程序的開發(fā)公司
- 花農(nóng)小程序
- 百度自然排名
- 云南小程序設(shè)計(jì)
- 汽車回收管理
- 云南網(wǎng)站建設(shè)高手
- 麗江小程序開發(fā)
- 網(wǎng)站制作哪家好
- 河南小程序制作
- 公眾號(hào)模板消息
- 云南網(wǎng)站設(shè)計(jì)
- 網(wǎng)站建設(shè)首選公司
- 云南網(wǎng)站建設(shè)優(yōu)化
- 云南小程序被騙蔣軍
- 汽車報(bào)廢軟件
- 云南網(wǎng)站建設(shè)服務(wù)公司
- 百度小程序開發(fā)
- 云南小程序制作