欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

使用CodecEngine的API函數(shù)(四) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

使用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
// 正文

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)案例查看更多