專利名稱:一種數(shù)據(jù)緩存方法和裝置的制作方法
技術領域:
本發(fā)明屬于數(shù)據(jù)存儲領域,尤其涉及一種數(shù)據(jù)緩存方法和裝置。
背景技術:
在接收數(shù)據(jù)時,為了使接收的數(shù)據(jù)在重現(xiàn)(如播放)時流暢,不產(chǎn)生卡屏 現(xiàn)象, 一般需要在用于接收和重現(xiàn)數(shù)據(jù)的設備中內(nèi)置存儲設備(也稱為內(nèi)存), 通過內(nèi)存對接收的數(shù)據(jù)進行緩存。由于用于緩存的內(nèi)存的存儲空間不可能無限 大,因此,為了達到較好的數(shù)據(jù)重現(xiàn)效果,需要設計較合理的數(shù)據(jù)緩存方法。
現(xiàn)有技術提供了一種乒乓形式的數(shù)據(jù)援存方法,簡述如下采用兩塊緩存 分別為緩存A和緩存B,當緩存A在緩存數(shù)據(jù)時,將緩存B提供給編碼或處理 程序使用,當緩存A中的數(shù)據(jù)緩存完畢時,向緩存B中傳輸數(shù)據(jù),同時將緩存 A提供給編碼或處理程序使用。這種數(shù)據(jù)緩存方法對編碼程序的實時性要求較 高, 一般要求編碼或處理程序的運行速度快于采集數(shù)據(jù)的速度,否則數(shù)據(jù)就會 丟失;當采集速度太快,兩塊緩存都滿的時候,需要硬件上能夠暫停采集,對 硬件功能有要求;編碼程序可能一次需要多幀原始數(shù)據(jù),以避免內(nèi)存拷貝,提 高編碼效率,兵乓操作的雙緩沖方式無法滿足。
現(xiàn)有技術提供另一種采用緩存隊列的數(shù)據(jù)緩存方法,簡述如下將采用緩 存隊列對數(shù)據(jù)采集完畢的幀緩存進行管理,當編碼程序需要一幀新的數(shù)據(jù)的時 候,從緩存隊列中獲取一幀數(shù)據(jù)。這種數(shù)據(jù)緩存方法由于沒有標識為準備狀態(tài) 的幀緩存,難以保證在當前幀接收完時,馬上有下一幀緩存供數(shù)據(jù)采集使用; 從緩存隊列中獲取一幀數(shù)據(jù)時,需要把數(shù)據(jù)從幀緩存中拷貝出來,降低了編碼 程序的效率;編碼程序無法一次獲取多幀數(shù)據(jù)或者釋》文多幀數(shù)據(jù)。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種數(shù)據(jù)緩存方法,旨在解決采用內(nèi)存緩存數(shù)據(jù)時, 當幀緩存接收完一幀數(shù)據(jù)后,可快速的切換到另 一個幀緩存來接收下一幀數(shù)據(jù), 從而在內(nèi)存的容量可以滿足當前數(shù)據(jù)存儲需要時,避免了具有恒定速度或流量 的數(shù)據(jù)幀丟失的問題。
本發(fā)明是這樣實現(xiàn)的, 一種內(nèi)存的數(shù)據(jù)緩存方法,所述內(nèi)存的存儲空間被
配置為多塊幀i爰存,所述方法包括下述步驟
A、 設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標識幀援存的數(shù)據(jù)存 儲狀態(tài);
B、 在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確定用于緩存下一 幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件下的狀態(tài) 更新機制,更新每塊幀緩存的狀態(tài)。
進一步的,所述幀緩存的狀態(tài)包括正在緩存數(shù)據(jù)狀態(tài)、準備緩存數(shù)據(jù)狀態(tài)、 已經(jīng)緩存數(shù)據(jù)狀態(tài)、被數(shù)據(jù)占用狀態(tài)、以及空閑狀態(tài),所述狀態(tài)更新條件包括 一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放幀緩存。
進一步的,所述步驟B具體包括
B1 、實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條件; B2、在當前幀數(shù)據(jù)緩存完畢時,將下一幀數(shù)據(jù)傳輸至處于準備緩存數(shù)據(jù)狀 態(tài)的幀緩存,并采用處于空閑狀態(tài)的其中一塊幀緩存存儲再下一幀數(shù)據(jù),同時 將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準 備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),將處于空閑狀態(tài)的 其中 一塊幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài);
B3、當讀取幀緩存時,將讀取的幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài); B4、當釋放幀緩存時,將被釋放的幀緩存的狀態(tài)更新為空閑狀態(tài)。 進一步的,所述方法還包括下述步驟
設置先進先出的已緩存數(shù)據(jù)隊列和數(shù)據(jù)占用隊列,當所述幀緩存的狀態(tài)為已經(jīng)緩存數(shù)據(jù)狀態(tài)時,使所述幀緩存進入所迷已緩存數(shù)據(jù)隊列,當所述幀緩存 的狀態(tài)為被數(shù)據(jù)占用狀態(tài)時,使所述幀緩存進入所述數(shù)據(jù)占用隊列。
進一步的,所迷步驟B具體包括
B1,、實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條件; B2'、如果當前幀數(shù)據(jù)緩存完畢,將下一幀數(shù)據(jù)傳輸至處于準備緩存數(shù)據(jù)狀 態(tài)的幀緩存,并采用處于空閑狀態(tài)的其中一塊幀緩存存儲再下一幀數(shù)據(jù),同時 將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準 備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),如果當前不存在處 于空閑狀態(tài)的幀緩存,按照先進先出的順序,將最早進入所述已緩存數(shù)據(jù)隊列 中幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài),或者動態(tài)申請一塊新的幀緩存,并 將所述新的幀緩存的狀態(tài)設為準備緩存數(shù)據(jù)狀態(tài),同時動態(tài)調(diào)整內(nèi)存的存儲空 間的幀緩存總數(shù);
B3,、當讀取幀緩存時,按照先進先出的順序,將所述已緩存數(shù)據(jù)隊列中的 被讀取的 一塊或者多塊幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài);
B4,、當釋放幀緩存時,按照先進先出的順序,將所述數(shù)據(jù)占用隊列中被釋 放的 一塊或者多塊幀緩存的狀態(tài)更新為空閑狀態(tài)。
本發(fā)明的另一目的在于提供一種內(nèi)存的數(shù)據(jù)緩存裝置,所述內(nèi)存的存儲空 間被配置為多塊幀緩存,所述裝置包括
幀緩存配置單元,用于設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標 識幀緩存的數(shù)據(jù)存儲狀態(tài),所述幀緩存的狀態(tài)包括正在緩存數(shù)據(jù)狀態(tài)、準備緩 存數(shù)據(jù)狀態(tài)、已經(jīng)緩存數(shù)據(jù)狀態(tài)、被數(shù)據(jù)占用狀態(tài)、以及空閑狀態(tài);
數(shù)據(jù)緩存單元,用于用于在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀 態(tài)確定用于緩存下一幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀 態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài),所述狀態(tài)更新條件包 括一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放幀緩存。
進一步的,所述數(shù)據(jù)緩存單元包括條件檢測子單元,用于實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條
件;
數(shù)據(jù)傳輸子單元,用于在所述條件檢測子單元檢測到數(shù)據(jù)存儲狀態(tài)達到一 幀數(shù)據(jù)緩存完畢的狀態(tài)更新條件時,向處于準備接收數(shù)據(jù)狀態(tài)的幀緩存中傳輸 數(shù)據(jù);
緩存任務產(chǎn)生子單元,用于根據(jù)每塊幀緩存的狀態(tài)以及條件檢測子單元得 到的當前達到的狀態(tài)更新條件,確定每塊幀緩存的緩存任務;
狀態(tài)更新子單元,用于在所述條件;險測子單元^r測到的數(shù)據(jù)存儲狀態(tài)達到 預設的狀態(tài)更新條件時,采用該狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀 緩存的狀態(tài)。
進一步的,所述裝置還包括
隊列存儲單元,用于存儲已緩存數(shù)據(jù)隊列和數(shù)據(jù)占用隊列,當所述幀緩存 的狀態(tài)為已經(jīng)緩存數(shù)據(jù)狀態(tài)時,使所述幀緩存進入所述已緩存數(shù)據(jù)隊列,當所 述幀緩存的狀態(tài)為被數(shù)據(jù)占用狀態(tài)時,使所述幀緩存進入所述數(shù)據(jù)占用隊列。
進一步的,所述狀態(tài)更新子單元在一幀數(shù)據(jù)緩存完畢時,采用處于準備緩 存數(shù)據(jù)狀態(tài)的幀緩存存儲下一幀數(shù)據(jù),并將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的 狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新 為正在緩存數(shù)據(jù)狀態(tài),如果當前不存在處于空閑狀態(tài)的幀i爰存時,按照先進先 出的順序,將最早進入所述已緩存數(shù)據(jù)隊列中幀緩存的狀態(tài)更新為準備緩存數(shù) 據(jù)狀態(tài);
在讀取幀緩存時,按照先進先出的順序,將所述已緩存數(shù)據(jù)隊列中被讀取 的一塊或者多塊幀緩存的狀態(tài)更新為^l數(shù)據(jù)占用狀態(tài);
在釋放幀緩存時,按照先進先出的順序,將所述數(shù)據(jù)占用隊列中被釋放的 一塊或者多塊幀緩存更新為空閑狀態(tài)。
進一步的,所述裝置還包括
幀援存申請單元,用于在一幀數(shù)據(jù)緩存完畢,且不存在處于空閑狀態(tài)的幀緩存時,動態(tài)申請一塊新的幀緩存,并將所述新的幀緩存的狀態(tài)設為準備緩存 數(shù)據(jù)狀態(tài),同時動態(tài)調(diào)整內(nèi)存的存儲空間的幀緩存總數(shù)。
在本發(fā)明實施例中,通過將內(nèi)存配置為多塊幀緩存,設置每塊幀緩存的狀 態(tài),根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件下的狀態(tài)更新機制,確定 每塊幀緩存的緩存任務,并更新每塊幀緩存的狀態(tài),從而在一幀數(shù)據(jù)幀緩存完 畢時,切換到另一個幀緩存來接收下一幀數(shù)據(jù),避免了具有恒定速度或流量的 數(shù)據(jù)幀纟皮丟失。通過建立兩個先進先出隊列,從而保證最早輸入的數(shù)據(jù)先被編 碼程序使用,使數(shù)據(jù)保持連續(xù)性。由于可以動態(tài)的改變幀緩存的個數(shù),在內(nèi)存 容量允許時,可以達到不丟失一幀數(shù)據(jù)的效果。
圖l是本發(fā)明實施例提供的數(shù)據(jù)緩存方法的實現(xiàn)流程圖2是本發(fā)明實施例提供的幀緩存狀態(tài)更新機制的一個具體示例圖3是本發(fā)明實施例提供的Ready隊列和Output隊列的狀態(tài)輪替的具體示 例圖4是本發(fā)明實施例提供的C^D的狀態(tài)輪替示意圖; 圖5是本發(fā)明實施例提供的C+D的Ready隊列和Output隊列的狀態(tài)輪替 示意圖6是本發(fā)明實施例提供的D^E的狀態(tài)輪替示意圖; 圖7是本發(fā)明實施例提供的D^E的Ready隊列和Output隊列的狀態(tài)輪替 示意圖8是本發(fā)明實施例提供的數(shù)據(jù)緩存裝置的結(jié)構示意圖。
具體實施例方式
為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實 施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
在本發(fā)明實施例中,設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標識 幀緩存的數(shù)據(jù)存儲狀態(tài),根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件下的 狀態(tài)更新機制,確定每塊幀緩存的緩存任務,并更新每塊幀緩存的狀態(tài),從而 在一幀數(shù)據(jù)幀緩存完畢時,即可快速的切換到另一個幀緩存來接收下一幀數(shù)據(jù), 避免了具有恒定速度或流量的數(shù)據(jù)幀被丟失。
圖1示出了本發(fā)明實施例提供的內(nèi)存的數(shù)據(jù)緩存方法的實現(xiàn)流程,詳述如
下
在步驟S101中,將內(nèi)存的存儲空間配置為N塊幀緩存,并設置每塊幀援 存的狀態(tài),幀緩存的狀態(tài)用于標識幀緩存的數(shù)據(jù)存儲狀態(tài)。
在將內(nèi)存的存儲空間配置為N塊幀緩存時,將每塊幀緩存的大小配置為一 幀數(shù)據(jù)大小,并為每塊幀緩存配置一標號,如Buffer—1 , Buffer—2,Buffer_3,……, Buffer—n,以區(qū)分每塊幀緩存。其中N為大于3的自然數(shù)。
在N塊幀緩存中緩存數(shù)據(jù)時,設置5種幀緩存的狀態(tài),用于標識幀緩存的 數(shù)據(jù)存儲狀態(tài)。其中5種幀緩存的狀態(tài)分別為正在緩存數(shù)據(jù)狀態(tài)(也稱為Getting 狀態(tài))、準備緩存數(shù)據(jù)狀態(tài)(也稱為Preparing狀態(tài))、已經(jīng)緩存數(shù)據(jù)狀態(tài)(也 稱為Ready狀態(tài))、被數(shù)據(jù)占用狀態(tài)(也稱為Output狀態(tài))、以及空閑狀態(tài)(也 稱為Null狀態(tài))。其中Getting狀態(tài)是指幀緩存正在援存數(shù)據(jù);Preparing狀態(tài) 是指幀緩存準備緩存數(shù)據(jù);Ready狀態(tài)是指幀緩存已經(jīng)緩存數(shù)據(jù),可以提供給 編碼程序使用;Output狀態(tài)是指幀緩存已經(jīng)被數(shù)據(jù)占用,暫時不能用來緩存數(shù) 據(jù);Null狀態(tài)是指幀緩存處于無可用數(shù)據(jù)的空閑狀態(tài),可以用來緩存數(shù)據(jù)。
在開始緩存數(shù)據(jù)前,為每塊幀緩存設置初始狀態(tài),其中設置至少一塊幀緩 存的狀態(tài)為Preparing狀態(tài),其余幀緩存可以均設置為Null狀態(tài)。如可以設置 Buffer—1的狀態(tài)為Preparing狀態(tài),Buffer—2、 Buffer—3、 Buffer—4、 Buffer—5的 狀態(tài)均為Null狀態(tài)。
在步驟S102中,在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確定用于緩存下 一 幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條 件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài)。
在本發(fā)明實施例中,釆用直接存儲器存取方式(Direct Memory Access, DMA)將源地址中的數(shù)據(jù)傳輸至目的地址中,其中目的地址即為本發(fā)明實施例 中的內(nèi)存的相應地址。當幀緩存的數(shù)據(jù)存儲狀態(tài)達到預設的更新條件時,如一 幀數(shù)據(jù)(如處于Getting狀態(tài)的A幀)緩存完畢時,根據(jù)每塊幀緩存的狀態(tài)切 換到另一塊幀緩存來存儲下一幀數(shù)據(jù),即馬上向處于Preparing狀態(tài)的幀緩存中 (如Buffer—1中)傳輸B幀數(shù)據(jù),同時產(chǎn)生DMA中斷,DMA中斷處理函數(shù) 根據(jù)每塊幀緩存的狀態(tài),確定每塊幀緩存的緩存任務,并根據(jù)預設的狀態(tài)更新 條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài)。
其中確定每塊幀緩存的緩存任務包括DMA的目的地址和源地址,以及傳 輸長度。其中DMA的目的地址的確定過程如下中斷處理函數(shù)從所有幀緩存 中尋找處于Null狀態(tài)的幀緩存,如果處于Null狀態(tài)的幀緩存的數(shù)量大于1,則 從中任意選擇一塊幀緩存(如Buffer_2 )作為DMA的目的地址。
在本發(fā)明另一實施例中,如果當前不存在處于Null狀態(tài)的幀緩存,則中斷 處理函數(shù)從所有幀緩存中尋找處于Ready狀態(tài)的幀緩存,如果處于Ready狀態(tài) 的幀緩存的數(shù)量大于1,則從中任意選擇一塊幀緩存作為DMA的目的地址。
在本發(fā)明另 一實施例中,可以預先創(chuàng)建一先進先出(First In First Out, FIFO ) 隊列,用于管理處于Ready狀態(tài)的幀緩存,在此稱為已緩存數(shù)據(jù)隊列(Ready 隊歹'])。該Ready隊列的最大容量為N-2,其中N為配置的幀緩存的塊數(shù)。 如果當前不存在處于Null狀態(tài)的幀緩存,則中斷處理函數(shù)按照先進先出的順序 從該Ready隊列中選擇一塊幀緩存作為DMA的目的地址。
在本發(fā)明另一實施例中,為了避免數(shù)據(jù)幀的丟失,確定下一數(shù)據(jù)幀的緩存 任務時,如果當前不存在處于Null狀態(tài)的幀緩存,則動態(tài)申請一塊新的幀緩存, 并將該新的幀緩存作為DMA的目的地址。同時動態(tài)調(diào)整內(nèi)存的存儲空間的幀 緩存總^t,即由原來的N調(diào)整為N+1,此時Ready隊列和Output隊列的容量也隨著增加。
在本發(fā)明實施例中,預設的狀態(tài)更新條件包括一幀數(shù)據(jù)緩存完畢、讀取幀
緩存、以及釋放幀緩存。其中一幀數(shù)據(jù)緩存完畢是指N塊幀緩存中處于Getting 狀態(tài)的幀緩存中數(shù)據(jù)緩存完畢;讀取幀緩存是指編碼程序從處于Ready狀態(tài)的 幀緩存中讀取數(shù)據(jù);釋放幀緩存是指編碼程序使用完處于Output狀態(tài)的幀緩存 中的數(shù)據(jù)。狀態(tài)更新條件包括一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放幀緩 存。
而在上述預設的狀態(tài)更新條件下的狀態(tài)更新機制如下所述 在當前幀數(shù)據(jù)緩存完畢時,將下一幀數(shù)據(jù)傳輸至處于準備緩存數(shù)據(jù)狀態(tài)的 幀緩存,并采用處于空閑狀態(tài)的其中一塊幀緩存存儲再下一幀數(shù)據(jù),同時將處 于Getting狀態(tài)的幀緩存的狀態(tài)更新為Ready狀態(tài),將處于Preparing狀態(tài)的幀 緩存的狀態(tài)更新為Getting狀態(tài),將處于Null狀態(tài)的其中一塊幀纟爰存的狀態(tài)更 新為Preparing狀態(tài)。
在本發(fā)明另一實施例中,在當前幀數(shù)據(jù)緩存完畢時,如果不存在處于Null 狀態(tài)的幀緩存,則將處于Ready狀態(tài)的其中一塊幀緩存的狀態(tài)更新為Preparing 狀態(tài)。
在本發(fā)明另一實施例中,在當前幀數(shù)據(jù)緩存完畢時,如果不存在處于Null 狀態(tài)的幀緩存,則按照先進先出的順序從Ready隊列中確定一塊幀緩存,并將 該幀鄉(xiāng)爰存的狀態(tài)更新為Preparing狀態(tài)。
為了避免數(shù)據(jù)幀的丟失,在本發(fā)明另一實施例中,在當前幀數(shù)據(jù)緩存完畢 時,如果不存在處于Null狀態(tài)的幀緩存,則動態(tài)申請一塊新的幀緩存,并將該 新的幀緩存的狀態(tài)設置為Preparing狀態(tài)。同時動態(tài)調(diào)整內(nèi)存的存儲空間的幀緩 存總數(shù),即由原來的N調(diào)整為N + 1 ,此時Ready隊列和Output隊列的容量也 隨著增加。
當讀取幀緩存時,將讀取的幀緩存的狀態(tài)更新為Output狀態(tài)。 在本發(fā)明實施例中,由于只有在幀緩存已經(jīng)緩存完數(shù)據(jù),即幀緩存處于Ready狀態(tài)時,編碼程序才能從該幀緩存中讀取到有效數(shù)據(jù),而編碼程序在處 于Ready狀態(tài)的幀緩存中讀取數(shù)據(jù)時,是按照先進先出的順序讀取的,因此, 將編碼程序取走數(shù)據(jù)的幀緩存的狀態(tài)更新為Output狀態(tài)的過程,即是將最先進
在本發(fā)明另一實施例中,當Ready隊列中幀緩存的數(shù)量大于1時,如果編 碼程序需要同時使用多塊幀緩存中的數(shù)據(jù),則可以^l安照先進先出的順序一次從 Ready隊列中讀取多個幀緩存中的數(shù)據(jù),從而使編碼程序可以同時使用原始幀 和參考幀,從而提高了編碼效率。此時,將編碼程序讀取數(shù)據(jù)的所有幀緩存的 狀態(tài)更新為Output狀態(tài)。從而使編碼程序可以同時使用多塊幀緩存中的數(shù)據(jù), 提高了編碼效率。
在本發(fā)明實施例中,由于數(shù)據(jù)緩存完畢后的幀緩存即可直接提供給編碼程 序使用,從而避免了內(nèi)存拷貝。
當釋放幀緩存時,將被釋放的幀緩存的狀態(tài)更新為Null狀態(tài)。
在本發(fā)明實施例中,可以預先創(chuàng)建一 FIFO隊列,用于管理處于Output狀 態(tài)的幀緩存,在此稱為數(shù)據(jù)占用隊列(Output隊列)。該Output隊列的最大容 量為N-3,其中N為配置的幀緩存的塊數(shù),且任意時刻,Ready隊列和Output 隊列中的幀緩存的數(shù)量之和小于或者等于N-2,其中N為配置的幀緩存的塊 數(shù)。由于只有在編碼程序已經(jīng)讀取幀緩存中的數(shù)據(jù),即幀緩存處于Output狀態(tài) 時,編碼程序才能使用該幀緩存中的數(shù)據(jù),因此,在將編碼程序使用完其中數(shù) 據(jù)的幀緩存的狀態(tài)更新為Null狀態(tài)的過程,即是將最先進入Output隊列中的幀 緩存的狀態(tài)更新為Null狀態(tài)。
在本發(fā)明另一實施例中,當Output隊列中幀緩存的數(shù)量大于1時,如果編 碼程序同時使用完多塊幀緩存,則可以按照先進先出的順序同時從Output隊列 中釋放多個幀緩存,此時,將編碼程序釋放的所有幀緩存的狀態(tài)從Output狀態(tài) 更新為Null狀態(tài)。
圖2示出了本發(fā)明實施例提供的幀緩存狀態(tài)更新機制的一個具體示例,詳述如下
在此假設將內(nèi)存配置為5塊幀緩存,分別為Buffer—1、 Buffer_2、 Buffer—3、 Buffer—4、 Buffer_5,并假設在開始緩存數(shù)據(jù)后的某個時刻A, 5塊幀緩存的狀 態(tài)如圖2中的A所示,此時,Ready隊列和Output隊列的狀態(tài)如圖3中的A所 示。以下循著圖2和圖3所示的A+B^C^D+E這幾個時刻的狀態(tài)變更來詳 細說明在狀態(tài)更新條件下的緩存機制。 (1 ) A^B
請參閱圖2, Buffer—1數(shù)據(jù)緩存完畢,此時,DMA繼續(xù)向處于Preparing 狀態(tài)的Buffer—2傳輸數(shù)據(jù),并根據(jù)每塊幀緩存的狀態(tài),確定下一數(shù)據(jù)幀的緩存 任務,同時根據(jù)狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài),其 具體過程為產(chǎn)生DMA中斷,中斷處理函數(shù)查詢處于Null狀態(tài)下的幀緩存(此 處為Buffer—3),將Buffer一3作為下一數(shù)據(jù)幀的目的地址,同時中斷處理函數(shù) 根據(jù)新的一幀數(shù)據(jù)緩存完畢條件下的狀態(tài)更新機制,將處于Getting狀態(tài)的 Buffer—1的狀態(tài)更新為Ready狀態(tài),將處于Preparing狀態(tài)的Buffer—2的狀態(tài)更 新為Getting狀態(tài),將處于Null狀態(tài)的Buffer—3的狀態(tài)更新為Preparing狀態(tài), 從而實現(xiàn)圖2所示的A^B的狀態(tài)輪替。
請參閱圖3,由于Buffer—1的狀態(tài)由Getting狀態(tài)更新為Ready狀態(tài),因此, 使Buffer—1進入Ready隊列,從而實現(xiàn)圖3所示的A^B的Ready隊列和Output 隊列的狀態(tài)輪替。 (2) C
請參閱圖2,讀取幀緩存,即編碼程序需要讀取一幀數(shù)據(jù),此時,編碼程 序按照先進先出的順序從Ready隊列中讀取一幀(即Buffer_4中的數(shù)據(jù)),此 時,根據(jù)讀取幀緩存條件下的狀態(tài)更新機制,將處于Ready狀態(tài)的Buffei^4的 狀態(tài)更新為Output狀態(tài),從而實現(xiàn)圖2所示的B>>C的狀態(tài)輪替。
請參閱圖3,由于Buffer—4的狀態(tài)由Ready狀態(tài)更新為Output狀態(tài),因此, 將Buffer_4從Ready隊列中取出,并使Buffer_4進入Output隊列,從而實現(xiàn)圖
153所示的B+C的Ready隊列和Output隊列的狀態(tài)^^替。 (3) C》D
C^D的狀態(tài)輪替主要包括兩個步驟
步驟l:請參閱圖4,讀取幀緩存,即編碼程序需要讀取一幀數(shù)據(jù),此時, 編碼程序按照先進先出的順序從Ready隊列中讀取一幀(即Buffer—5中的數(shù) 據(jù)),此時,根據(jù)讀取幀緩存條件下的狀態(tài)更新機制,將處于Ready狀態(tài)的 Buffer—5的狀態(tài)更新為Output狀態(tài),從而實現(xiàn)圖4所示的C^C,的狀態(tài)輪替。
請參與圖5 ,由于Buffer—5的狀態(tài)由Ready狀態(tài)更新為Output狀態(tài),因此, 將Buffer—5從Ready隊列中刪除,并使Buffer—5進入Output隊列,從而實現(xiàn)圖 5所示的C^C,的Ready隊列和Output隊列的狀態(tài)輪替。
步驟2:請參閱圖4, Buffer_2數(shù)據(jù)緩存完畢,此時,DMA繼續(xù)向處于 Preparing狀態(tài)的Buffer—3傳輸數(shù)據(jù),并根據(jù)每塊幀緩存的狀態(tài),確定下一數(shù)據(jù) 幀的緩存任務,同時根據(jù)狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的 狀態(tài),其具體過程為產(chǎn)生DMA中斷,中斷處理函數(shù)查詢5塊幀緩存中是否 存在處于Null狀態(tài)的幀緩存,由于不存在,此時,按照先進先出的順序從Ready 隊列中選擇最早進入Ready隊列的幀緩存(此處為Buffer_l ),將BufferJ作 為下一數(shù)據(jù)幀的緩存任務的目的地址。同時中斷處理函數(shù)根據(jù)新的一幀數(shù)據(jù)緩 存完畢條件下的狀態(tài)更新機制,將處于Ready狀態(tài)的Buffer—1的狀態(tài)更新為
Preparing狀態(tài),將處于Getting狀態(tài)的Buffer—2的狀態(tài)更新為Ready狀態(tài),將 處于Preparing狀態(tài)的Buffer_3的狀態(tài)更新為Getting狀態(tài),從而實現(xiàn)圖4所示 的C,^D的狀態(tài)輪替。經(jīng)步驟1和步驟2之后,即可實現(xiàn)圖2所示的C^D的 狀態(tài)輪替。
請參閱圖5,由于Buffer—1的狀態(tài)由Ready狀態(tài)更新為Preparing狀態(tài),因 此,將Buffer—1從Ready隊列中刪除;由于Buffer—2的狀態(tài)由Getting狀態(tài)更 新為Ready狀態(tài),因此,使Buffer—2進入Ready隊列,從而實現(xiàn)圖5所示的C'+D 的Ready隊列和Output隊列的狀態(tài)輪替。經(jīng)步驟1和步驟2之后,即可實現(xiàn)圖3所示的C^D的Ready隊列和Output隊列的狀態(tài)輪替。 (4) D—E
D^E的狀態(tài)輪替主要包括兩個步驟
步驟1:請參閱圖6, BufferJ數(shù)據(jù)緩存完畢,此時,DMA繼續(xù)向處于 Preparing狀態(tài)的BufferJ傳輸數(shù)據(jù),并根據(jù)每塊幀緩存的狀態(tài),確定下一數(shù)據(jù) 幀的緩存任務,同時根據(jù)狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的 狀態(tài),其具體過程為產(chǎn)生DMA中斷,中斷處理函數(shù)查詢5塊幀緩存中是否 存在處于Null狀態(tài)的幀緩存,由于不存在,此時,按照先進先出的順序從Ready 隊列中選擇最早進入Ready隊列的幀緩存(此處為Buffer—2 ),將Buffer_2作 為下一數(shù)據(jù)幀的緩存任務的目的地址。同時中斷處理函數(shù)根據(jù)數(shù)據(jù)緩存完畢條 件下的狀態(tài)更新機制,將處于Ready狀態(tài)的Buffer—2的狀態(tài)更新為Preparing 狀態(tài),將處于Getting狀態(tài)的Buffer—3的狀態(tài)更新為Ready狀態(tài),將處于Preparing 狀態(tài)的Buffer—l的狀態(tài)更新為Getting狀態(tài),從而實現(xiàn)圖6所示的D^D,的狀 態(tài)輪替。
請參閱圖7 ,由于Buffer—2的狀態(tài)由Ready狀態(tài)更新為Preparing狀態(tài),因 此,將Buffer—2從Ready隊列中刪除;由于Buffer_3的狀態(tài)由Getting狀態(tài)更 新為Ready狀態(tài),因此,使Buffer—3進入Ready隊列,從而實現(xiàn)圖7所示的 D+D,的Ready隊列和Output隊列的狀態(tài)4侖替。
步驟2:請參閱圖6,編碼程序按照先入先出的順序釋放Buffer—4,此時, 根據(jù)釋放幀緩存的條件下的狀態(tài)更新機制,將處于Output狀態(tài)的Buffer_4的狀 態(tài)更新為Null狀態(tài),從而實現(xiàn)圖6所示的D,">E的狀態(tài)輪替。經(jīng)步驟1和步驟 2后,即可實現(xiàn)圖2所示的D+E的狀態(tài)4侖替。
請參閱圖7,由于Buffe匸4的狀態(tài)由Output狀態(tài)更新為Null狀態(tài),因此, 將Buffer—4從Output隊列中刪除,從而實現(xiàn)圖7所示的D,"^E的Ready隊列 和Output隊列的狀態(tài)輪替。經(jīng)步驟1和步驟2后,即可實現(xiàn)圖3所示的D+E 的Ready隊列和Output隊列的狀態(tài)輪替。圖8示出了本發(fā)明實施例提供的內(nèi)存的數(shù)據(jù)緩存裝置的結(jié)構,為了便于說
明,僅示出了與本發(fā)明實施例相關的部分。該數(shù)據(jù)緩存裝置可以是內(nèi)置于數(shù)據(jù) 緩存設備中的軟件單元、硬件單元或者軟硬件相結(jié)合的單元,也可以作為獨立 的掛件集成到數(shù)據(jù)緩存設備中或者運行于數(shù)據(jù)緩存設備的應用系統(tǒng)中。該內(nèi)存
的存儲空間被配置為多塊幀緩存,其中
幀緩存配置單元81設置內(nèi)存中預設的每塊幀緩存的狀態(tài),幀緩存的狀態(tài)用 于標識幀緩存的數(shù)據(jù)存儲狀態(tài)。在將內(nèi)存的存儲空間配置為N塊幀緩存時,將 每塊幀援存的大小配置為一幀數(shù)據(jù)大小,并為每塊幀緩存配置一標號,如
Buffer—1, Buffer—2, Buffer—3, ......, Buffer_n,以區(qū)分每塊幀緩存。其中N
為大于等于2的自然數(shù)。幀緩存的狀態(tài)包括Getting狀態(tài)、Preparing狀態(tài)、Ready 狀態(tài)、Output狀態(tài)、以及Null狀態(tài)。幀緩存各狀態(tài)的所表示的數(shù)據(jù)存儲狀態(tài)如 上所述,在此不再贅述。
數(shù)據(jù)緩存單元82在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確定用 于緩存下 一幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條 件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài)。該數(shù)據(jù)緩存單元82包括條件檢 測子單元821,數(shù)據(jù)傳輸子單元822,緩存任務產(chǎn)生子單元823,以及狀態(tài)更新 子單元824。
條件檢測子單元821實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條 件。其中預設的狀態(tài)更新條件包括一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放 幀緩存。
數(shù)據(jù)傳輸子單元822在條件檢測子單元821檢測到數(shù)據(jù)存儲狀態(tài)達到一幀 數(shù)據(jù)緩存完畢的狀態(tài)更新條件時,向處于Preparing狀態(tài)的幀緩存中傳輸數(shù)據(jù)。
緩存任務產(chǎn)生子單元823在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀 態(tài)確定用于緩存下一幀數(shù)據(jù)的幀緩存。其中確定用于緩存下一幀數(shù)據(jù)的幀緩存 包括DMA的目的地址和源地址、以及傳輸長度。緩存任務產(chǎn)生子單元823確 定DMA的目的地址的過程如下從所有幀緩存中尋找處于Null狀態(tài)的幀緩存,如果處于Null狀態(tài)的幀緩存的數(shù)量大于1,則從中任意選擇一塊幀緩存(如 Buffer—2 ) DMA的目的地址。
在本發(fā)明另一實施例中,如果當前不存在處于Null狀態(tài)的幀緩存,則緩存 任務產(chǎn)生子單元823從所有幀緩存中尋找處于Ready狀態(tài)的幀緩存,如果處于 Ready狀態(tài)的幀緩存的數(shù)量大于1,則從中任意選擇一塊幀緩存作為DMA的目 的地址。
在本發(fā)明另一實施例中,該數(shù)據(jù)緩存裝置還包括隊列存儲單元83。該隊列 存儲單元83預先建立兩個先進先出隊列,分別為Ready隊列和Output隊列。 其中用于管理處于Ready狀態(tài)的幀緩存,其最大容量為N-2, N為配置的幀緩 存的塊數(shù)。Output隊列用于管理處于Output狀態(tài)的幀緩存,其最大容量為N-3, N為配置的幀緩存的塊數(shù),且任意時刻,Ready隊列和Output隊列中的幀緩 存的數(shù)量之和小于或者等于N-2。此時,如果當前不存在處于Null狀態(tài)的幀 緩存,則緩存任務產(chǎn)生子單元823按照先進先出的順序從隊列存儲單元83的 Ready隊列中選擇一塊幀緩存作為DMA的目的地址。
為了避免數(shù)據(jù)幀的丟失,在本發(fā)明另一實施例中,該數(shù)據(jù)緩存裝置還包括 幀緩存申請單元,如果當前不存在處于Null狀態(tài)的幀緩存,則幀緩存申請單元 動態(tài)申請一塊新的幀緩存,并動態(tài)調(diào)整內(nèi)存的存儲空間的幀緩存總數(shù)。此時緩 存任務產(chǎn)生子單元823將幀緩存申請單元申請的幀緩存作為DMA的目的地址。
狀態(tài)更新子單元824在條件檢測子單元821檢測到數(shù)據(jù)存儲狀態(tài)達到預設 的狀態(tài)更新條件時,采用該狀態(tài)更新條件下的狀態(tài)更新^4'j,更新每塊幀緩存 的狀態(tài)。
當一幀數(shù)據(jù)緩存完畢時,將處于Getting狀態(tài)的幀緩存的狀態(tài)更新為Ready 狀態(tài),將處于Preparing狀態(tài)的幀緩存的狀態(tài)更新為Getting狀態(tài),將處于Null 狀態(tài)的其中一塊幀緩存的狀態(tài)更新為Preparing狀態(tài)。
在本發(fā)明另一實施例中,當一幀數(shù)據(jù)緩存完畢時,如果不存在處于Null狀 態(tài)的幀緩存,則狀態(tài)更新子單元824將處于Ready狀態(tài)的其中一塊幀緩存的狀態(tài)更新為Preparing爿犬態(tài)。
在本發(fā)明另一實施例中,當一幀數(shù)據(jù)緩存完畢時,如果不存在處于Null狀 態(tài)的幀緩存,則狀態(tài)更新子單元824按照先進先出的順序^v隊列存儲單元83 中的Ready隊列中確定一塊幀緩存,并將該幀緩存的狀態(tài)更新為Preparing狀態(tài)。
為了避免數(shù)據(jù)幀的丟失,在本發(fā)明另一實施例中,在新的一幀數(shù)據(jù)緩存完 畢條件下,如果不存在處于Null狀態(tài)的幀緩存,則狀態(tài)更新子單元824將幀緩 存申請單元申請的幀緩存的狀態(tài)設為Preparing狀態(tài)。
在讀取幀緩存時,將被讀取的幀緩存的狀態(tài)更新為Output狀態(tài)。在本發(fā)明 實施例中,由于只有在幀緩存已經(jīng)緩存數(shù)據(jù),即幀緩存處于Ready狀態(tài)時,才 能從該幀緩存中讀取到有效數(shù)據(jù),而在讀取幀緩存時,是按照先進先出的順序 讀取的,因此,將被讀取的幀緩存的狀態(tài)更新為Output狀態(tài)的過程,即是將最 先進入Ready隊列中的幀緩存的狀態(tài)更新為Output狀態(tài)。
在本發(fā)明另 一實施例中,當Ready隊列中幀《爰存的數(shù)量大于1時,如果編 碼程序需要同時使用多塊幀緩存中的數(shù)據(jù),則可以按照先進先出的順序一次從 Ready隊列中讀取多個幀緩存中的數(shù)據(jù),此時,將被讀取的所有幀緩存的狀態(tài) 更新為Output狀態(tài)。從而使編碼程序可以同時使用多塊幀緩存中的數(shù)據(jù),提高 了編碼效率。
在釋放幀緩存時,將被釋放的幀緩存的狀態(tài)更新為Null狀態(tài)。 由于只有在編碼程序已經(jīng)讀取幀緩存中的數(shù)據(jù),即幀緩存處于Output狀態(tài) 時,編碼程序才能使用該幀緩存中的數(shù)據(jù),同時為了保證數(shù)據(jù)幀的連續(xù)性,在 本發(fā)明實施例中,在將被釋放的幀緩存的狀態(tài)更新為Null狀態(tài)時,按照先進先 出的順序?qū)⒆钕冗M入Output隊列中的幀緩存的狀態(tài)更新為Null狀態(tài)。
在本發(fā)明另一實施例中,當Output隊列中幀緩存的數(shù)量大于1時,如果編 碼程序同時使用完多塊幀緩存,則可以按照先進先出的順序同時從Output隊列 中釋放多個幀緩存,此時,將被釋放的所有幀緩存的狀態(tài)從Output狀態(tài)更新為 Null狀態(tài)。
2在本發(fā)明實施例中,通過將內(nèi)存配置為N塊幀緩存,并為每塊幀緩存設置 標識數(shù)據(jù)存儲情況的狀態(tài),并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件 下的狀態(tài)更新機制,確定每塊幀緩存的緩存任務,并更新每塊幀緩存的狀態(tài), 從而在當前數(shù)據(jù)幀存儲完畢時,即可快速的切換到另 一個幀緩存來接收下一幀
數(shù)據(jù);通過建立兩個先進先出隊列,從而保證最早輸入的數(shù)據(jù)先被編碼程序使 用,使數(shù)據(jù)保持連續(xù)性;由于Ready隊列的容量可以在1塊幀緩存至N - 2塊 幀緩存之間動態(tài)變動,從而在一定程度上起到了平衡輸入數(shù)據(jù)的速度和編碼速 度的作用;當每塊幀緩存均緩存數(shù)據(jù)且編碼程序未釋放幀緩存時,將最早緩存 數(shù)據(jù)的幀緩存釋放,從而可以重新緩存數(shù)據(jù);由于兩個先進先出隊列的容量均 可以大于1,從而可以一次為編碼程序提供多個幀緩存的數(shù)據(jù),有效的提高了 編碼速度;同時由于可以動態(tài)的改變幀緩存的個數(shù),在內(nèi)存容量允許時,可以 達到不丟失一幀數(shù)據(jù)的效果。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā) 明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應包含在本發(fā)明 的保護范圍之內(nèi)。
權利要求
1、一種內(nèi)存的數(shù)據(jù)緩存方法,所述內(nèi)存的存儲空間被配置為多塊幀緩存,其特征在于,所述方法包括下述步驟A、設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標識幀緩存的數(shù)據(jù)存儲狀態(tài);B、在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確定用于緩存下一幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài)。
2、 如權利要求l所迷的方法,其特征在于,所述幀緩存的狀態(tài)包括正在緩 存數(shù)據(jù)狀態(tài)、準備緩存數(shù)據(jù)狀態(tài)、已經(jīng)緩存數(shù)據(jù)狀態(tài)、被數(shù)據(jù)占用狀態(tài)、以及 空閑狀態(tài),所述狀態(tài)更新條件包括一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放 幀緩存。
3、 如權利要求2所述的方法,其特征在于,所述步驟B具體包括 B1 、實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條件;B2、在當前幀數(shù)據(jù)緩存完畢時,將下一幀數(shù)據(jù)傳輸至處于準備緩存數(shù)據(jù)狀 態(tài)的幀緩存,并采用處于空閑狀態(tài)的其中一塊幀緩存存儲再下一幀數(shù)據(jù),同時 將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準 備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),將處于空閑狀態(tài)的 其中一塊幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài);B3、當讀取幀緩存時,將讀取的幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài); B4、當釋放幀緩存時,將被釋放的幀緩存的狀態(tài)更新為空閑狀態(tài)。
4、 如權利要求3所迷的方法,其特征在于,所述方法還包括下述步驟 設置先進先出的已緩存數(shù)據(jù)隊列和數(shù)據(jù)占用隊列,當所述幀緩存的狀態(tài)為已經(jīng)緩存數(shù)據(jù)狀態(tài)時,使所述幀緩存進入所述已緩存數(shù)據(jù)隊列,當所述幀緩存 的狀態(tài)為被數(shù)據(jù)占用狀態(tài)時,使所述幀緩存進入所述數(shù)據(jù)占用隊列。
5、 如權利要求4所述的方法,其特征在于,所述已緩存數(shù)據(jù)隊列的最大容量為幀緩存塊數(shù)減2,所述數(shù)據(jù)占用隊列的最大容量為幀緩存塊數(shù)減3,所述已 緩存數(shù)據(jù)隊列中的幀緩存塊數(shù)與數(shù)據(jù)占用隊列中的幀緩存塊數(shù)之和小于或者等 于內(nèi)存中預設的幀緩存總數(shù)減2。
6、 如權利要求4所述的方法,其特征在于,所述步驟B具體包括 B1'、實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條件;B2'、如果當前幀數(shù)據(jù)緩存完畢,將下一幀數(shù)據(jù)傳輸至處于準備援存數(shù)據(jù)狀 態(tài)的幀緩存,并采用處于空閑狀態(tài)的其中一塊幀緩存存儲再下一幀數(shù)據(jù),同時 將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準 備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),如果當前不存在處 于空閑狀態(tài)的幀緩存,按照先進先出的順序,將最早進入所述已緩存數(shù)據(jù)隊列 中幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài),或者動態(tài)申請一塊新的幀緩存,并 將所述新的幀緩存的狀態(tài)設為準備緩存數(shù)據(jù)狀態(tài),同時動態(tài)調(diào)整內(nèi)存的存儲空 間的幀緩存總凄t;B3,、當讀取幀緩存時,按照先進先出的順序,將所述已緩存數(shù)據(jù)隊列中的 被讀取的一塊或者多塊幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài);B4,、當釋放幀緩存時,按照先進先出的順序,將所述數(shù)據(jù)占用隊列中被釋 放的一塊或者多塊幀緩存的狀態(tài)更新為空閑狀態(tài)。
7、 一種內(nèi)存的數(shù)據(jù)緩存裝置,所述內(nèi)存的存儲空間被配置為多塊幀緩存, 其特征在于,所述裝置包括幀緩存配置單元,用于設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標 識幀緩存的數(shù)據(jù)存儲狀態(tài),所述幀緩存的狀態(tài)包括正在緩存數(shù)據(jù)狀態(tài)、準備緩 存數(shù)據(jù)狀態(tài)、已經(jīng)緩存數(shù)據(jù)狀態(tài)、被數(shù)據(jù)占用狀態(tài)、以及空閑狀態(tài);數(shù)據(jù)緩存單元,用于在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確 定用于緩存下一幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更 新條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài),所述狀態(tài)更新條件包括一幀數(shù)據(jù)緩存完畢、讀取幀緩存、以及釋放幀緩存。
8、 如權利要求7所述的裝置,其特征在于,所述數(shù)據(jù)緩存單元包括 條件檢測子單元,用于實時檢測數(shù)據(jù)存儲狀態(tài)是否達到預設的狀態(tài)更新條件;數(shù)據(jù)傳輸子單元,用于在所述條件4企測子單元檢測到數(shù)據(jù)存儲狀態(tài)達到一 幀數(shù)據(jù)緩存完畢的狀態(tài)更新條件時,向處于準備接收數(shù)據(jù)狀態(tài)的幀緩存中傳輸 數(shù)據(jù);緩存任務產(chǎn)生子單元,用于在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的 狀態(tài)確定用于緩存下一幀數(shù)據(jù)的幀緩存;狀態(tài)更新子單元,用于在所述條件檢測子單元檢測到數(shù)據(jù)存儲狀態(tài)達到預 設的狀態(tài)更新條件時,采用所述狀態(tài)更新條件下的狀態(tài)更新^4'J,更新每塊幀緩存的狀態(tài)。
9、 如權利要求8所述的裝置,其特征在于,所述狀態(tài)更新子單元在一幀數(shù) 據(jù)緩存完畢時,將處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù) 狀態(tài),將處于準備緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),將 處于空閑狀態(tài)的其中 一 塊幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài);在讀取幀緩存時,將被讀取的幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài); 在釋放幀緩存時,將被釋放的幀緩存的狀態(tài)更新為空閑狀態(tài)。
10、 如權利要求8所述的裝置,其特征在于,所述裝置還包括 隊列存儲單元,用于存儲已緩存數(shù)據(jù)隊列和數(shù)據(jù)占用隊列,當所述幀緩存的狀態(tài)為已經(jīng)緩存數(shù)據(jù)狀態(tài)時,使所述幀緩存進入所述已緩存數(shù)據(jù)隊列,當所 述幀緩存的狀態(tài)為^皮數(shù)據(jù)占用狀態(tài)時,使所述幀緩存進入所述數(shù)據(jù)占用隊列。
11、 如權利要求IO所述的裝置,其特征在于,所述已緩存數(shù)據(jù)隊列的最大 容量為幀緩存塊數(shù)減2,所述數(shù)據(jù)占用隊列的最大容量為幀緩存塊數(shù)減3,所述 已緩存數(shù)據(jù)隊列中的幀緩存塊數(shù)與數(shù)據(jù)占用隊列中的幀緩存塊數(shù)之和小于或者 等于內(nèi)存中預設的幀緩存總數(shù)減2。
12、 如權利要求IO所述的裝置,其特征在于,所述狀態(tài)更新子單元在一幀數(shù)據(jù)緩存完畢時,采用處于準備緩存數(shù)據(jù)狀態(tài)的幀緩存存儲下一幀數(shù)據(jù),并將 處于正在緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為已經(jīng)緩存數(shù)據(jù)狀態(tài),將處于準備 緩存數(shù)據(jù)狀態(tài)的幀緩存的狀態(tài)更新為正在緩存數(shù)據(jù)狀態(tài),如果當前不存在處于 空閑狀態(tài)的幀緩存時,按照先進先出的順序,將最早進入所述已緩存數(shù)據(jù)隊列中幀緩存的狀態(tài)更新為準備緩存數(shù)據(jù)狀態(tài);在讀取幀緩存時,按照先進先出的順序,將所迷已緩存數(shù)據(jù)隊列中被讀取 的 一 塊或者多塊幀緩存的狀態(tài)更新為被數(shù)據(jù)占用狀態(tài);在釋放幀緩存時,按照先進先出的順序,將所述數(shù)據(jù)占用隊列中被釋放的 一塊或者多塊幀緩存更新為空閑狀態(tài)。
13、如權利要求IO所述的裝置,其特征在于,所述裝置還包括幀緩存申請單元,用于在一幀數(shù)據(jù)緩存完畢,且不存在處于空閑狀態(tài)的幀 緩存時,動態(tài)申請一塊新的幀緩存,并將所述新的幀緩存的狀態(tài)設為準備緩存 數(shù)據(jù)狀態(tài),同時動態(tài)調(diào)整內(nèi)存的存儲空間的幀緩存總數(shù)。
全文摘要
本發(fā)明適用于數(shù)據(jù)存儲領域,提供了一種數(shù)據(jù)緩存方法、裝置及設備,所述方法包括下述步驟將內(nèi)存的存儲空間配置為多塊幀緩存,并設置每塊幀緩存的狀態(tài),所述幀緩存的狀態(tài)用于標識幀緩存的數(shù)據(jù)存儲狀態(tài);在當前幀數(shù)據(jù)緩存完畢前,根據(jù)每塊幀緩存的狀態(tài)確定用于緩存下一幀數(shù)據(jù)的幀緩存,并根據(jù)每塊幀緩存的狀態(tài)以及預設的狀態(tài)更新條件下的狀態(tài)更新機制,更新每塊幀緩存的狀態(tài)。本發(fā)明實施例在緩存當前數(shù)據(jù)幀時,即確定下一數(shù)據(jù)幀的緩存任務,從而保證在當前新的一幀數(shù)據(jù)緩存完畢時,可以快速的切換到用于緩存下一數(shù)據(jù)幀的幀緩存,避免了數(shù)據(jù)丟失。本發(fā)明實施例同時可以提高編碼效率。
文檔編號G06F12/08GK101567849SQ20091010692
公開日2009年10月28日 申請日期2009年4月30日 優(yōu)先權日2009年4月30日
發(fā)明者侯景昆 申請人:炬才微電子(深圳)有限公司