日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > [置頂] 使用 Codec Engine 的 API 函數(四)

[置頂] 使用 Codec Engine 的 API 函數(四)

來源:程序員人生   發布時間:2015-01-08 13:20:14 閱讀次數:3742次
 本文翻譯自TI的手冊,該手冊是學習GPP+DSP開發的金典文檔,希望對各位入門有所幫助,有理解不當的地方望請賜教。
 Codec Engine Application Developer User's Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 利用開發使用手冊》           http://blog.csdn.net/dyzok88/article/details/42154487
《第1章 Codec Engine 概要》                http://blog.csdn.net/dyzok88/article/details/42214813
《第2章 Codec Engine 安裝和設置》          http://blog.csdn.net/dyzok88/article/details/42278109

《第3章 使用 Codec Engine 的示例利用程序》http://blog.csdn.net/dyzok88/article/details/42302793


// 正文


4.4 Codec 服務器 API 函數

在雙 CPU 的系統中,被配置的引擎“遠程”運行(在 DSP 中)算法,透明地使用1個“DSP服務器”。DSP 的服務器是1個集成算法及其框架的可履行程序(例如,DSP/BIOS,框架組件,編解碼器,和 DSP Link 驅動程序),當引擎被打開時,這些組件將在 DSP 上被加載并開始運行。

服務器 API 函數能被在 GPP 上運行的利用程序調用,可以訪問有關DSP的服務器的信息,并控制DSP服務器。更具體地說,這些 API 函數允許 GPP 利用程序獲得有關 DSP 服務器中配置的內存堆數量,1個單獨的內存堆確當前使用狀態等信息。和重新配置 DSP 服務器的算法堆的基址和大小。

觸及到服務器的 API 函數是:
1. Engine_getServer(). 取得服務器的句柄。

2. Server_getNumMemSegs(). 取得在1個服務器中的堆數。

3. Server_getMemStat(). 獲得有關服務器的堆統計信息。

4. Server_redefineHeap(). 設置服務器堆的基址和大小。

5. Server_restoreHeap(). 重置服務器堆到默許基址和大小。


4.4.1 獲得服務器句柄

要訪問 DSP 服務器的引擎,GPP 利用程序必須通過調用 Engine_getServer() API 首先取得1個服務器句柄,例如:

static String engineName = "auddec"; Engine_Handle engine; Server_Handle server; Engine_Error err; engine = Engine_open(engineName, NULL, &err); server = Engine_getServer(engine);

注:引擎句柄,服務器句柄都不是線程保護。每一個線程使用服務器句柄必須履行自己的 Engine_getServer() 調用(使用自己的引擎句柄),或保證同享服務器句柄的同步訪問的。

如果 Engine_getServer() 返回值是 NULL,那末引擎沒有服務器

4.4.2 獲得內存堆信息

GPP 利用程序可以通過調用 Server_getNumMemSegs() 函數,取得配置到DSP服務器中內存堆的數量,例如:

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 函數返回以下毛病的代碼:
1. Server_EOK - 成功。在這類情況下, numSegs 包括 DSP 服務器中的堆數。
2. Server_ERUNTIME - 產生內部運行時毛病。

1旦堆的數目是已知的,GPP 利用程序使用 Server_getMemStat() 函數,然后可以通過此數迭代,取得每一個堆統計信息。內存統計數據返回到 Server_MemStat 結構體:

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 函數的用法(為了可讀性,疏忽毛病檢查)

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. 段號超越范圍。

3. Server_ERUNTIME. 產生內部運行時毛病。

4.4.3 重新配置DSP服務器的算法堆

DSP 服務器可以被配置為專門用于算法堆的內存段。在某些情況下,DSP 服務器被配置小算法堆,GPP 利用程序在運行時,可能需要為算法堆提供較大的,被 DSP 服務器使用的連續內存塊。然后,當堆不被 DSP 使用時,該內存可以從 DSP 回收,進而被 GPP 使用。下面的服務器 API 函數提供了重新配置 DSP 算法堆的手段:

Server_Status Server_redefineHeap(Server_Handle server,     String name, Uint32 base, Uint32 size); Server_Status Server_restoreHeap(Server_Handle server,     String name);

傳遞給這些函數的參數" name "是要重新配置堆的名稱;它必須不大于 Server_MAXSEGNAMELENGTH 字符長。傳遞給 Server_redefineHeap() 的" base "地址,必須為DSP的地址,從 base 到 base + size 的內存必須是連續的物理內存。參數" size "在 DSP MADUs(minimum addressable data units,可尋址的最小數據單元)中給出的。基址應為8字節對齊,但對大小沒有對齊限制;大小的值為 0 是可接受的。

當堆上沒有內存被當前分配時,在 DSP 算法堆只能被重新配置。 Server_restoreHeap() 函數重置算法堆的基地址和大小,回到它們的原始值(任何調用 Server_redefineHeap() 之前的值)。成功調用 Server_restoreHeap() 后,內存先前的“重新定義”到堆,可被該系統再次使用。

Server_redefineHeap() 的返回值以下:
1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大小致使與另外一堆堆疊。
3. Server_EINUSE. 內存被當前分配在算法堆。
4. Server_ENOTFOUND. 沒有發現給定的名稱的堆。

5. Server_ERUNTIME. 產生內部運行時毛病。

Server_restoreHeap() 返回以下任何的值:

1. Server_EOK. 成功。
2. Server_EINVAL. 改變到新的基地址和大小致使與另外一堆堆疊。

3. Server_EINUSE. 內存被當前分配在算法堆。
4. Server_ENOTFOUND. 沒有發現給定的名稱的堆。
5. Server_ERUNTIME. 產生內部運行時毛病。

下面的代碼說明,這兩個 API 如何可以在 DM644x (1個 GPP+DSP 器件)上使用,在這個示例中,GPP 利用程序使用 Memory_contigAlloc() 函數分配1個連續的內存塊。但是,通過此函數返回的地址是對 GPP 的虛擬地址,因此必須將其傳遞到 Server_redefineHeap() 前轉換到 DSP 地址,Memory_getBufferPhysicalAddress() 函數可以將虛擬地址轉換為 GPP 的物理地址,這樣在 DM644x 的的情況下,就是相同的 DSP 的地址。

算法運行后,該算法堆被復位到其原來的大小和位置,為了更好的可讀性,毛病檢查被省略。

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);

在其他情況下,利用程序可能需要重新配置算法堆到1個地址,在 ARM 上分配緩沖區不能取得該地址。例如,假定在 DSP 上有固定的內存空間,該空間給利用程序用于算法堆之間的交替,取決運行甚么算法。在這類情況下,利用程序可以直接傳遞 DSP 的地址給 Server_redefineHeap() 函數。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 999久久精品 | 中文字幕高清视频 | 久久一二三区 | 毛片毛片毛片 | 亚洲一区二区三区中文字幕 | 欧美一级片在线 | 国产精品久久久久久久久久久免费看 | 久久成人在线视频 | 亚洲福利在线观看 | 日韩视频 中文字幕 视频一区 | 久久久久久精 | 免费av一级片 | 懂色av影视一区二区三区 | 97视频在线免费 | 国产二区精品 | 国产午夜精品视频 | 国产性―交一乱―色―情人免费看 | 亚洲欧美另类在线 | 91在线精品秘密一区二区 | 成年人免费观看 | 免费观看黄色一级片 | 亚洲区一区二区三区 | 国产精品1区2区3区 在线一级黄色片 | 国产欧美一区二区三区在线看 | 色网站在线观看 | 久久精品国产77777蜜臀 | 亚洲精品在线免费看 | 国产一区二区在线免费观看 | 少妇18xxxx性xxxx片 | 亚洲免费网站 | 色综合综合 | av午夜| 免费黄看片 | 日日干日日操 | 综合国产| 色偷偷青青草 | 国产成人综合久久 | 日本一区二区三区视频在线播放 | 99精品免费视频 | 国产精品伦一区二区三级视频 | 亚洲网站在线播放 |