一種設(shè)備的視頻軟解碼方法和裝置制造方法
【專利摘要】本發(fā)明提供了一種設(shè)備的視頻軟解碼方法和裝置,所述方法包括:使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放;在分離、解碼和播放過程中,根據(jù)未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程;根據(jù)未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。本發(fā)明降低了中央處理器的占用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
【專利說明】一種設(shè)備的視頻軟解碼方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及視頻處理【技術(shù)領(lǐng)域】,特別是涉及一種設(shè)備的視頻軟解碼方法和裝置。
【背景技術(shù)】
[0002] 視頻解碼是對編碼后的視頻數(shù)據(jù)進行解碼,以使視頻數(shù)據(jù)能夠顯示的過程,通常 包括硬解碼和軟解碼兩種方式。
[0003] 硬解碼不借助于CPU,通過專用的子卡設(shè)備來獨立完成視頻解碼任務(wù),如,V⑶/DVD 解壓卡、視頻壓縮卡等都屬于硬解碼的范疇。而軟解碼則通過軟件讓CPU來對視頻進行解 碼處理。隨著視頻技術(shù)的發(fā)展,視頻數(shù)據(jù)的分辨率越來越高,視頻數(shù)據(jù)編碼的壓縮率也越來 越高,故而解碼的運算量越來越大,從而對硬解碼所需的硬件要求也越來越高,導(dǎo)致硬解碼 的成本遠(yuǎn)遠(yuǎn)超過軟解碼的成本。目前,軟解碼已成為視頻解碼的主流。
[0004] 在現(xiàn)階段的設(shè)備中,視頻軟解碼過程一般采用多線程架構(gòu)來實現(xiàn),各線程需要實 時同步各自的狀態(tài),以便每個線程都能順暢運行。在線程狀態(tài)同步時,通常的做法是采用休 眠、喚醒、判斷狀態(tài)、繼續(xù)休眠或繼續(xù)運行的循環(huán)模式,各線程若在上述循環(huán)模式中實時同 步各自的狀態(tài),需要依靠中央處理器對各線程進行任務(wù)調(diào)度。中央處理器頻繁地對各線程 進行任務(wù)調(diào)度,導(dǎo)致中央處理器的占用率升高,設(shè)備的功耗增加,造成設(shè)備續(xù)航時間短的問 題。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明提供一種設(shè)備的視頻軟解碼方法和裝置,以解決設(shè)備的中央處理器的占用 率高,功耗增加,續(xù)航時間短的問題。
[0006] 為了解決上述問題,本發(fā)明公開了一種設(shè)備的視頻軟解碼方法,所述設(shè)備包括未 解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解 碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號量和第二信號量,所述第一信號量用于指示 本隊列中是否存在空閑空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源;
[0007] 所述方法包括:
[0008] 使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示 及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放;
[0009] 在所述分離、解碼和播放過程中,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號 量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程;
[0010] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼視頻數(shù)據(jù) 緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;
[0011] 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù) 顯示及同步控制線程。
[0012] 本發(fā)明還公開了一種設(shè)備的視頻軟解碼裝置,所述設(shè)備包括未解碼視頻數(shù)據(jù)緩存 隊列和已解碼視頻數(shù)據(jù)緩存隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊 列中均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊列中是否存在 空閑空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源;
[0013] 所述裝置包括:
[0014] 功能操作模塊,用于使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和 已解碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播 放;
[0015] 第一決定模塊,用于在所述功能操作模塊進行所述分離、解碼和播放過程中,根據(jù) 所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線 程;
[0016] 第二決定模塊,用于根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所 述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;
[0017] 第三決定模塊,用于根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否 阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0018] 與【背景技術(shù)】相比,本發(fā)明包括以下優(yōu)點:
[0019] 本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列,所述 未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號量和第二 信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量用于指示 本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放過 程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視 頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼視 頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解碼視頻數(shù) 據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0020] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
【專利附圖】
【附圖說明】
[0021] 圖1是本發(fā)明實施例一中的一種設(shè)備的視頻軟解碼方法流程圖;
[0022] 圖2是本發(fā)明實施例二中的一種設(shè)備的視頻軟解碼方法流程圖;
[0023] 圖3是本發(fā)明實施例三中的一種設(shè)備的視頻軟解碼方法流程圖;
[0024] 圖4是本發(fā)明實施例四中的一種設(shè)備的視頻軟解碼裝置結(jié)構(gòu)圖;
[0025] 圖5是本發(fā)明實施例五中的一種設(shè)備的視頻軟解碼裝置結(jié)構(gòu)圖。
【具體實施方式】
[0026] 為使本發(fā)明的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和具體實 施方式對本發(fā)明作進一步詳細(xì)的說明。
[0027] 下面通過列舉幾個具體的實施例詳細(xì)介紹本發(fā)明提供的一種設(shè)備的視頻軟解碼 方法和裝置。
[0028] 本發(fā)明實施例中的設(shè)備可以是一種臺式機,也可以是一種移動終端,此設(shè)備可以 具有視頻軟解碼功能,例如,一種臺式電腦、一種智能手機、或者一種視頻播放器等等,此處 對設(shè)備的類型和型號等不做限制。
[0029] 實施例一
[0030] 詳細(xì)介紹本發(fā)明實施例提供的一種設(shè)備的視頻軟解碼方法。
[0031] 參照圖1,示出了本發(fā)明實施例中一種設(shè)備的視頻軟解碼方法流程圖。
[0032] 本發(fā)明實施例中的設(shè)備可以包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩 存隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信 號量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號 量用于指示本隊列中是否存在已存儲的資源。
[0033] 步驟100,使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和已解碼視頻 數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放。
[0034] 即使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離;使 用視頻數(shù)據(jù)解碼線程對分離后的視頻數(shù)據(jù)進行相應(yīng)的解碼;使用已解碼視頻數(shù)據(jù)顯示及同 步控制線程對解碼后的視頻數(shù)據(jù)進行相應(yīng)的播放。
[0035] 在上述步驟100的執(zhí)行過程中,可以執(zhí)行下列步驟。
[0036] 步驟102,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程。
[0037] 所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量用于指示所述未解碼視頻數(shù)據(jù)緩存 隊列中是否存在空閑空間。在上述步驟1〇〇的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù) 緩存隊列的第一信號量的具體情況,決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0038] 步驟104,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼 視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0039] 所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量用于指示所述未解碼視頻數(shù)據(jù)緩存 隊列中是否存在已存儲的資源。所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量用于指示所述 已解碼視頻數(shù)據(jù)緩存隊列中是否存在空閑空間。
[0040] 所述步驟104可以為:
[0041] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和,所述已解碼視頻數(shù)據(jù)緩存 隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0042] 在上述步驟100的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信 號量的具體情況,和,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量的具體情況,決定是否阻 塞視頻數(shù)據(jù)解碼線程。
[0043] 所述步驟104還可以為:
[0044] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,或,所述已解碼視頻數(shù)據(jù)緩存 隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0045] 在上述步驟100的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信 號量的具體情況,或,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量的具體情況,決定是否阻 塞視頻數(shù)據(jù)解碼線程。
[0046] 步驟106,根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼 視頻數(shù)據(jù)顯示及同步控制線程。
[0047] 所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量用于指示所述已解碼視頻數(shù)據(jù)緩存 隊列中是否存在已存儲的資源。在上述步驟1〇〇的執(zhí)行過程中,根據(jù)所述已解碼視頻數(shù)據(jù) 緩存隊列的第二信號量的具體情況,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。 [0048] 綜上所述,本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存 隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號 量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量 用于指示本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼 和播放過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。 [0049] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
[0050] 實施例二
[0051] 詳細(xì)介紹本發(fā)明實施例提供的一種設(shè)備的視頻軟解碼方法。
[0052] 參照圖2,示出了本發(fā)明實施例中一種設(shè)備的視頻軟解碼方法流程圖。
[0053] 在本實施例中,為實現(xiàn)高效的視頻軟解碼,可以把整個過程分解成數(shù)據(jù)傳輸及音 視頻數(shù)據(jù)分離、音頻數(shù)據(jù)解碼及播放、視頻數(shù)據(jù)解碼、已解碼視頻數(shù)據(jù)顯示及同步控制四個 主要任務(wù),每個任務(wù)由單獨的線程實現(xiàn),四個線程并發(fā)運行。同時構(gòu)建未解碼音頻數(shù)據(jù)緩存 隊列、未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列三個隊列,即本發(fā)明實施例中的 設(shè)備可以包括未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音頻數(shù)據(jù)緩存 隊列,以實現(xiàn)音視頻數(shù)據(jù)在四個線程中持續(xù)、流暢的傳遞。
[0054] 為實現(xiàn)四個線程之間無循環(huán)休眠、喚醒方式的等待,每個隊列分別使用兩個資源 信號量進行控制,即所述未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音 頻數(shù)據(jù)緩存隊列中均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊 列中是否存在空閑空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源。所述 第一信號量還可以用于指示本隊列中剩余的空閑空間的數(shù)量;所述第二信號量還可以用于 指示本隊列中已存儲的數(shù)據(jù)資源的數(shù)量。初始化時,每個隊列的空閑空間的數(shù)量就是此隊 列能存儲的最大資源量,已存入資源的數(shù)量都為〇,每個隊列里的兩個信號量分別用這兩個 值進行初始化。
[0055] 需要說明的是,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)明了,在實際應(yīng)用中,音頻數(shù)據(jù)的解碼可采用 現(xiàn)有的任意適當(dāng)方式實現(xiàn),不限于本實施例中的方式,在此情況下,可不必設(shè)置音頻解碼相 對應(yīng)的緩存隊列和信號量。此外,使用剩余的空閑空間的數(shù)量表示第一信號量,使用已存儲 的數(shù)據(jù)資源的數(shù)量表示第二信號量,使得信號量的設(shè)計和實現(xiàn)成本更低。但本領(lǐng)域技術(shù)人 員應(yīng)當(dāng)理解,在實際使用中,不限于使用數(shù)量表示信號量,也不限于初始化時,每個隊列的 空閑空間的數(shù)量為此隊列能存儲的最大資源量,已存入資源的數(shù)量都為0。本領(lǐng)域技術(shù)人員 可以根據(jù)信號量實現(xiàn)的作用采用其它任意適當(dāng)方式實現(xiàn),本發(fā)明對此不作限制。
[0056] 步驟200,使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、音頻數(shù)據(jù)解碼及播放線程、視頻 數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng) 的分離、解碼和播放。
[0057] 即使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離;使 用音頻數(shù)據(jù)解碼及播放線程對分離后音頻數(shù)據(jù)進行解碼及播放;使用視頻數(shù)據(jù)解碼線程對 分離后的視頻數(shù)據(jù)進行相應(yīng)的解碼,使用已解碼視頻數(shù)據(jù)顯示及同步控制線程對解碼后的 視頻數(shù)據(jù)進行相應(yīng)的播放。
[0058] 在上述步驟200的執(zhí)行過程中,可以執(zhí)行下列步驟。
[0059] 步驟202,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程。
[0060] 所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量用于指示所述未解碼視頻數(shù)據(jù)緩存 隊列中是否存在空閑空間。在上述步驟200的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù) 緩存隊列的第一信號量的具體情況,決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0061] 優(yōu)選地,所述步驟202可以為:
[0062] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼視頻數(shù)據(jù)緩存 隊列是否存在空閑空間。
[0063] 在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊 列不存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0064] 在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊 列存在空閑空間時,使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離出視頻數(shù)據(jù)后,將分 離出的視頻數(shù)據(jù)存入所述未解碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列 的第一信號量和第二信號量。
[0065] 例如,在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量為4時,此時未解碼視頻數(shù) 據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在4個空閑空間,則使用數(shù) 據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,獲得1個視頻數(shù)據(jù),將分離出的1 個視頻數(shù)據(jù)存入所述未解碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第 一信號量和第二信號量,具體可以為將所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量減1,第 一信號量為3,將所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量加1。
[0066] 根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述未解碼 視頻緩存隊列是否存在空閑空間。
[0067] 例如,當(dāng)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量為0時,繼續(xù)判斷 可知,此時未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列不存 在空閑空間,則可以阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0068] 步驟204,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼 視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0069] 所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量用于指示所述未解碼視頻數(shù)據(jù)緩存 隊列中是否存在已存儲的資源。所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量用于指示所述 已解碼視頻數(shù)據(jù)緩存隊列中是否存在空閑空間。
[0070] 優(yōu)選地,所述步驟204可以為:
[0071] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼視頻數(shù)據(jù)緩存 隊列是否存在已存儲的資源;和/或,根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號,判斷 所述已解碼視頻數(shù)據(jù)緩存隊列是否存在空閑空間。
[0072] 當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊 列不存在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所 述已解碼視頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述視頻數(shù)據(jù)解碼線程。
[0073] 當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊 列存在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述 已解碼視頻數(shù)據(jù)緩存隊列存在空閑空間時,使用所述視頻數(shù)據(jù)解碼線程對所述未解碼視頻 數(shù)據(jù)緩存隊列中存儲的視頻數(shù)據(jù)資源進行視頻解碼,并將解碼后的視頻數(shù)據(jù)存入所述已解 碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,以及,所述已解 碼視頻數(shù)據(jù)緩存隊列的第一信號量和第二信號量。
[0074] 例如,當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量為1,此時未解碼視頻數(shù)據(jù)緩 存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在1個已存儲的資源,當(dāng)所述已 解碼視頻數(shù)據(jù)緩存隊列的第一信號量為1,此時已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指 示所述已解碼視頻數(shù)據(jù)緩存隊列存在1個空閑空間時,則使用所述視頻數(shù)據(jù)解碼線程對所 述未解碼視頻數(shù)據(jù)緩存隊列中存儲的1個視頻數(shù)據(jù)資源進行視頻解碼,并將解碼后的1個 視頻數(shù)據(jù)存入所述已解碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第二 信號量,即將所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量減1,第二信號量為0,以及,將所 述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量減1,將所述已解碼視頻數(shù)據(jù)緩存隊列的第二信 號量加1。
[0075] 根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,繼續(xù)判斷所述未解碼 視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;和/或,根據(jù)更新后的所述已解碼視頻數(shù)據(jù)緩 存隊列的第一信號量,繼續(xù)判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在空閑空間。
[0076] 例如,當(dāng)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量為0時,繼續(xù)判斷 可知,此時未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列中不 存在已存儲的資源,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量為〇時,繼續(xù)判 斷可知,此時已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列不 存在空閑空間時,則可以阻塞所述視頻數(shù)據(jù)解碼線程。
[0077] 所述步驟204可以為:
[0078] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和,所述已解碼視頻數(shù)據(jù)緩存 隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0079] 在上述步驟200的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信 號量的具體情況,和,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量的具體情況,決定是否阻 塞視頻數(shù)據(jù)解碼線程。
[0080] 所述步驟204還可以為:
[0081] 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,或,所述已解碼視頻數(shù)據(jù)緩存 隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0082] 在上述步驟200的執(zhí)行過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信 號量的具體情況,或,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量的具體情況,決定是否阻 塞視頻數(shù)據(jù)解碼線程。
[0083] 步驟206,根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼 視頻數(shù)據(jù)顯示及同步控制線程。
[0084] 所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量用于指示所述已解碼視頻數(shù)據(jù)緩存 隊列中是否存在已存儲的資源。在上述步驟200的執(zhí)行過程中,根據(jù)所述已解碼視頻數(shù)據(jù) 緩存隊列的第二信號量的具體情況,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0085] 優(yōu)選地,所述步驟206可以為:
[0086] 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述已解碼視頻數(shù)據(jù)緩存 隊列是否存在已存儲的資源。
[0087] 在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊 列不存在已存儲的資源時,阻塞所述已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0088] 在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊 列存在已存儲的資源時,使用所述已解碼視頻數(shù)據(jù)顯示及同步控制線程顯示所述已解碼視 頻數(shù)據(jù)緩存隊列中存儲的已解碼視頻數(shù)據(jù),并控制顯示的所述已解碼視頻數(shù)據(jù)與已解碼的 音頻數(shù)據(jù)的同步播放,并更新所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量。
[0089] 根據(jù)更新后的所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,繼續(xù)判斷所述已解碼 視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
[0090] 例如,更新所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,將所述已解碼視頻數(shù)據(jù) 緩存隊列的第二信號量減1,第二信號量為0,繼續(xù)判斷可知,此時,所述已解碼視頻數(shù)據(jù)緩 存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列中不存在已存儲的資源,則可以阻 塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0091] 需要說明的是,在上述視頻數(shù)據(jù)解碼線程和上述已解碼視頻數(shù)據(jù)顯示及同步控制 線程之間設(shè)置有互斥鎖,可以根據(jù)所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示及同 步控制線程之間的互斥鎖的當(dāng)前狀態(tài),互斥調(diào)度所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻 數(shù)據(jù)顯示及同步控制線程。目的是避免上述視頻數(shù)據(jù)解碼線程和上述已解碼視頻數(shù)據(jù)顯示 及同步控制線程同時被中央處理器調(diào)度,從而避免因中央處理器的高速緩存命中率降低導(dǎo) 致的軟解碼性能低的問題。
[0092] 若從接收到的音視頻數(shù)據(jù)中分離出音頻數(shù)據(jù),則在上述步驟200的執(zhí)行過程中, 還可以包括下列步驟。
[0093] 步驟208,根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程。
[0094] 優(yōu)選地,所述步驟208可以為:
[0095] 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼音頻數(shù)據(jù)緩存 隊列是否存在空閑空間。
[0096] 在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊 列不存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0097] 在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊 列存在空閑空間時,使用所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后, 將分離出的音頻數(shù)據(jù)存入所述未解碼音頻數(shù)據(jù)緩存隊列,并更新所述未解碼音頻數(shù)據(jù)緩存 隊列的第一信號量和第二信號量。
[0098] 例如,在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量為4時,此時未解碼音頻數(shù) 據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列存在4個空閑空間,則使用數(shù) 據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,獲得1個音頻數(shù)據(jù),將分離出的1 個音頻數(shù)據(jù)存入所述未解碼音頻數(shù)據(jù)緩存隊列,并更新所述未解碼音頻數(shù)據(jù)緩存隊列的第 一信號量和第二信號量,具體可以為將所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量減1,第 一信號量為3,將所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量加1。
[0099] 根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述未解碼 音頻數(shù)據(jù)緩存隊列是否存在空閑空間。
[0100] 例如,當(dāng)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量為〇時,繼續(xù)判斷 可知,此時未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不存 在空閑空間,則可以阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0101] 步驟210,根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞音頻數(shù) 據(jù)解碼和播放線程。
[0102] 優(yōu)選地,所述步驟210可以為:
[0103] 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼音頻數(shù)據(jù)緩存 隊列是否存在已存儲的資源。
[0104] 在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊 列不存在已存儲的資源時,阻塞所述音頻數(shù)據(jù)解碼和播放線程。
[0105] 在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊 列存在已存儲的資源時,使用所述音頻數(shù)據(jù)解碼和播放線程對所述未解碼音頻數(shù)據(jù)緩存隊 列中存儲的音頻數(shù)據(jù)資源進行音頻解碼和播放,并更新所述未解碼音頻數(shù)據(jù)緩存隊列的第 二信號量。
[0106] 根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼音頻 數(shù)據(jù)緩存隊列是否存在已存儲的資源。
[0107] 例如,更新所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,將所述未解碼音頻數(shù)據(jù) 緩存隊列的第二信號量減1,第二信號量為0,根據(jù)判斷可知,此時,所述未解碼音頻數(shù)據(jù)緩 存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列中不存在已存儲的資源,則可以阻 塞音頻數(shù)據(jù)解碼和播放線程。
[0108] 需要說明的是,上述步驟202至步驟210均為在上述步驟200的執(zhí)行過程中運行, 上述步驟202至步驟210之間可以并發(fā)運行。也即,各個緩存隊列信號量的更新,以及根據(jù) 信號量對各個線程是否阻塞的判斷均可并發(fā)執(zhí)行。
[0109] 綜上所述,本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存 隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號 量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量 用于指示本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼 和播放過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0110] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
[0111] 另外,在視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同步控制線程中,可以分別 在視頻解碼代碼段和已解碼視頻數(shù)據(jù)顯示代碼段之間加入互斥鎖,避免這兩段代碼同時被 中央處理器調(diào)度,從而避免因中央處理器高速緩存命中率降低,導(dǎo)致的視頻軟解碼性能不 高的問題。
[0112] 采用本實施例中技術(shù)方案,視頻軟解碼的性能可以提升20%以上,在暫停視頻軟 解碼時,中央處理器的占用率幾乎降低到0,避免了中央處理器的空轉(zhuǎn)現(xiàn)象,從而延長了設(shè) 備電池的待機時間。
[0113] 在相同硬件配置的設(shè)備下軟解碼相同的視頻時,中央處理器的占用率明顯降低, 從而降低設(shè)備功耗,延長設(shè)備電池的待機時間;另外,對于一些配置較差的設(shè)備,能順暢軟 解碼的視頻碼率明顯提高,提高了用戶體驗。
[0114] 實施例三
[0115] 詳細(xì)介紹本發(fā)明實施例提供的一種設(shè)備的視頻軟解碼方法。
[0116] 參照圖3,示出了本發(fā)明實施例中一種設(shè)備的視頻軟解碼方法流程圖。
[0117] 在本實施例中,為實現(xiàn)高效的視頻軟解碼,可以把整個過程分解成數(shù)據(jù)傳輸及音 視頻數(shù)據(jù)分離、音頻數(shù)據(jù)解碼及播放、視頻數(shù)據(jù)解碼、已解碼視頻數(shù)據(jù)顯示及同步控制四個 主要任務(wù),每個任務(wù)由單獨的線程實現(xiàn),四個線程并發(fā)運行。同時構(gòu)建未解碼音頻數(shù)據(jù)緩存 隊列、未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列三個隊列,即本發(fā)明實施例中的 設(shè)備可以包括未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音頻數(shù)據(jù)緩存 隊列,以實現(xiàn)音視頻數(shù)據(jù)在四個線程中持續(xù)、流暢的傳遞。
[0118] 為實現(xiàn)四個線程之間無循環(huán)休眠、喚醒方式的等待,每個隊列分別使用兩個資源 信號量進行控制,即所述未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音 頻數(shù)據(jù)緩存隊列中均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊 列中是否存在空閑空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源。所述 第一信號量可以為本隊列中剩余的空閑空間的數(shù)量;所述第二信號量可以為本隊列中已存 儲的數(shù)據(jù)資源的數(shù)量。初始化時,每個隊列的空閑空間的數(shù)量就是此隊列能存儲的最大資 源量,已存入資源的數(shù)量都為0,每個隊列里的兩個信號量分別用這兩個值進行初始化。
[0119] 步驟300,判斷獲取到的音視頻數(shù)據(jù)包是音頻數(shù)據(jù)包還是視頻數(shù)據(jù)包。當(dāng)是音頻數(shù) 據(jù)包時,執(zhí)行步驟302 ;當(dāng)是視頻數(shù)據(jù)包時,執(zhí)行步驟306。
[0120] 可以使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程從網(wǎng)絡(luò)或者本地獲取音視頻數(shù)據(jù)包,并 進一步判斷音視頻數(shù)據(jù)包是音頻數(shù)據(jù)包還是視頻數(shù)據(jù)包。
[0121] 步驟302,將音頻數(shù)據(jù)包存入未解碼音頻數(shù)據(jù)緩存隊列。
[0122] 如果未解碼音頻數(shù)據(jù)緩存隊列中的第一信號量指示未解碼音頻數(shù)據(jù)緩存隊列有 空閑空間,則把音頻數(shù)據(jù)包存入未解碼音頻數(shù)據(jù)緩存隊列,將未解碼音頻數(shù)據(jù)緩存隊列中 的第二信號量加1。此時,如果音頻數(shù)據(jù)解碼及播放線程被阻塞睡眠,則喚醒音頻數(shù)據(jù)解碼 及播放線程,執(zhí)行步驟304。
[0123] 如果未解碼音頻數(shù)據(jù)緩存隊列中的第一信號量指示未解碼音頻數(shù)據(jù)緩存隊列沒 有空閑空間,則阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0124] 步驟304,對音頻數(shù)據(jù)包進行解碼及播放。
[0125] 音頻數(shù)據(jù)解碼及播放線程從未解碼音頻數(shù)據(jù)緩存隊列中讀取出音頻數(shù)據(jù)包,將未 解碼音頻數(shù)據(jù)緩存隊列的第二信號量減1,將未解碼音頻數(shù)據(jù)緩存隊列的第一信號量加1, 此時如果數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程被阻塞睡眠,則喚醒數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離 線程。使用音頻數(shù)據(jù)解碼及播放線程對讀取出的音頻數(shù)據(jù)包進行解碼及播放。其中,音視 頻數(shù)據(jù)的同步由已解碼視頻數(shù)據(jù)顯示及同步控制線程控制。
[0126] 如果未解碼音頻數(shù)據(jù)緩存隊列的第二信號量為0,指示未解碼音頻數(shù)據(jù)緩存隊列 中沒有音頻數(shù)據(jù)包,則阻塞音頻數(shù)據(jù)解碼及播放線程。
[0127] 步驟306,將視頻數(shù)據(jù)包存入未解碼視頻數(shù)據(jù)緩存隊列。
[0128] 如果未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示未解碼視頻數(shù)據(jù)緩存隊列有空 閑空間,則把視頻數(shù)據(jù)包存入未解碼視頻數(shù)據(jù)緩存隊列,將未解碼視頻數(shù)據(jù)緩存隊列的第 二信號量加1,將未解碼視頻數(shù)據(jù)緩存隊列的第一信號量減1。此時如果視頻數(shù)據(jù)解碼線程 被阻塞睡眠,則喚醒視頻數(shù)據(jù)解碼線程,執(zhí)行步驟308。
[0129] 如果未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示未解碼視頻數(shù)據(jù)緩存隊列沒有 空閑空間,則阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。
[0130] 步驟308,對視頻數(shù)據(jù)包進行解碼。
[0131] 視頻數(shù)據(jù)解碼線程從未解碼視頻數(shù)據(jù)緩存隊列中讀取出視頻數(shù)據(jù)包,將未解碼視 頻數(shù)據(jù)緩存隊列的第二信號量減1,將未解碼視頻數(shù)據(jù)緩存隊列的第一信號量加1,此時如 果數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程被阻塞睡眠,則喚醒數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程。 使用視頻數(shù)據(jù)解碼線程對讀取出的視頻數(shù)據(jù)包進行解碼,執(zhí)行步驟310。
[0132] 如果未解碼視頻數(shù)據(jù)緩存隊列的第二信號量為0,指示未解碼視頻數(shù)據(jù)緩存隊列 中沒有視頻數(shù)據(jù)包,則阻塞視頻數(shù)據(jù)解碼線程。
[0133] 步驟310,將解碼后的視頻數(shù)據(jù)包存入已解碼視頻數(shù)據(jù)緩存隊列。
[0134] 如果已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示已解碼視頻數(shù)據(jù)緩存隊列有空 閑空間,則把解碼后的視頻數(shù)據(jù)包存入已解碼視頻數(shù)據(jù)緩存隊列,將存入已解碼視頻數(shù)據(jù) 緩存隊列的第二信號量加1,將存入已解碼視頻數(shù)據(jù)緩存隊列的第一信號量減1。此時如果 已解碼視頻數(shù)據(jù)顯示及同步控制線程被阻塞睡眠,則喚醒已解碼視頻數(shù)據(jù)顯示及同步控制 線程,執(zhí)行步驟312。
[0135] 如果已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示已解碼視頻數(shù)據(jù)緩存隊列沒有 空閑空間,則阻塞視頻數(shù)據(jù)解碼線程。
[0136] 步驟312,對已解碼的視頻數(shù)據(jù)包進行顯示及同步控制。
[0137] 已解碼視頻數(shù)據(jù)顯示及同步控制線程從已解碼視頻數(shù)據(jù)緩存隊列中讀取出已解 碼的視頻數(shù)據(jù)包,將已解碼視頻數(shù)據(jù)緩存隊列的第二信號量減1,將已解碼視頻數(shù)據(jù)緩存隊 列的第一信號量加1,此時如果視頻數(shù)據(jù)解碼線程被阻塞,則喚醒視頻數(shù)據(jù)解碼線程。使用 已解碼視頻數(shù)據(jù)顯示及同步控制線程對讀取出的已解碼的視頻數(shù)據(jù)包進行顯示及同步控 制。
[0138] 如果已解碼視頻數(shù)據(jù)緩存隊列的第二信號量為0,指示已解碼視頻數(shù)據(jù)緩存隊列 中沒有已解碼的視頻數(shù)據(jù)包,則阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0139] 上文對音頻數(shù)據(jù)和視頻數(shù)據(jù)的一次處理過程進行了描述,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)明 了,在實際使用中,上述對音視頻數(shù)據(jù)的處理均是循環(huán)進行,直至本次所有的待處理音視頻 數(shù)據(jù)全部解碼播放完成。
[0140] 優(yōu)選地,在上述視頻數(shù)據(jù)解碼線程和上述已解碼視頻數(shù)據(jù)顯示及同步控制線程之 間設(shè)置有互斥鎖,可以根據(jù)所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示及同步控制 線程之間的互斥鎖的當(dāng)前狀態(tài),互斥調(diào)度所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯 示及同步控制線程。目的是避免上述視頻數(shù)據(jù)解碼線程和上述已解碼視頻數(shù)據(jù)顯示及同步 控制線程同時被中央處理器調(diào)度,從而避免因中央處理器的高速緩存命中率降低導(dǎo)致的軟 解碼性能低的問題。但在實際使用中,即使不使用互斥鎖互斥調(diào)度所述視頻數(shù)據(jù)解碼線程 和所述已解碼視頻數(shù)據(jù)顯示及同步控制線程,使用信號量來喚醒或阻塞上述過程中涉及的 線程的方式,仍然優(yōu)于傳統(tǒng)方式,提高了視頻軟解碼性能。
[0141] 綜上所述,本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存 隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號 量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量 用于指示本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼 和播放過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0142] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
[0143] 另外,在視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同步控制線程中,可以分別 在視頻解碼代碼段和已解碼視頻數(shù)據(jù)顯示代碼段之間加入互斥鎖,避免這兩段代碼同時被 中央處理器調(diào)度,從而避免因中央處理器高速緩存命中率降低,導(dǎo)致的視頻軟解碼性能不 高的問題。
[0144] 采用本實施例中技術(shù)方案,視頻軟解碼的性能可以提升20%以上,在暫停視頻軟 解碼時,中央處理器的占用率幾乎降低到0,避免了中央處理器的空轉(zhuǎn)現(xiàn)象,從而延長了設(shè) 備電池的待機時間。
[0145] 在相同硬件配置的設(shè)備下軟解碼相同的視頻時,中央處理器的占用率明顯降低, 從而降低設(shè)備功耗,延長設(shè)備電池的待機時間;另外,對于一些配置較差的設(shè)備,能順暢軟 解碼的視頻碼率明顯提高,提高了用戶體驗。
[0146] 實施例四
[0147] 詳細(xì)介紹本發(fā)明實施例提供的一種設(shè)備的視頻軟解碼裝置。
[0148] 參照圖4,示出了本發(fā)明實施例中一種設(shè)備的視頻軟解碼裝置結(jié)構(gòu)圖。
[0149] 所述設(shè)備可以包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列,所述未 解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均可以包括各自的第一信號量和第 二信號量,所述第一信號量可以用于指示本隊列中是否存在空閑空間,所述第二信號量可 以用于指示本隊列中是否存在已存儲的資源。
[0150] 所述裝置可以包括:功能操作模塊400,第一決定模塊402,第二決定模塊404,第 三決定模塊406。
[0151] 下面分別詳細(xì)介紹各模塊的功能以及各模塊之間的關(guān)系。
[0152] 功能操作模塊400,用于使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程 和已解碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和 播放。
[0153] 第一決定模塊402,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分 離線程。
[0154] 第二決定模塊404,用于根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/ 或,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0155] 第三決定模塊406,用于根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是 否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0156] 綜上所述,本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存 隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號 量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量 用于指示本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼 和播放過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0157] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
[0158] 實施例五
[0159] 詳細(xì)介紹本發(fā)明實施例提供的一種設(shè)備的視頻軟解碼裝置。
[0160] 參照圖5,示出了本發(fā)明實施例中一種設(shè)備的視頻軟解碼裝置結(jié)構(gòu)圖。
[0161] 在本實施例中,為實現(xiàn)高效的視頻軟解碼,可以把整個過程分解成數(shù)據(jù)傳輸及音 視頻數(shù)據(jù)分離、音頻數(shù)據(jù)解碼及播放、視頻數(shù)據(jù)解碼、已解碼視頻數(shù)據(jù)顯示及同步控制四個 主要任務(wù),每個任務(wù)由單獨的線程實現(xiàn),四個線程并發(fā)運行。同時構(gòu)建未解碼音頻數(shù)據(jù)緩存 隊列、未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列三個隊列,即本發(fā)明實施例中的 設(shè)備可以包括未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音頻數(shù)據(jù)緩存 隊列,以實現(xiàn)音視頻數(shù)據(jù)在四個線程中持續(xù)、流暢的傳遞。
[0162] 為實現(xiàn)四個線程之間無循環(huán)休眠、喚醒方式的等待,每個隊列分別使用兩個資源 信號量進行控制,即所述未解碼視頻數(shù)據(jù)緩存隊列、已解碼視頻數(shù)據(jù)緩存隊列和未解碼音 頻數(shù)據(jù)緩存隊列中均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊 列中是否存在空閑空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源。所述 第一信號量還可以用于指示本隊列中剩余的空閑空間的數(shù)量;所述第二信號量還可以用于 指示本隊列中已存儲的數(shù)據(jù)資源的數(shù)量。初始化時,每個隊列的空閑空間的數(shù)量就是此隊 列能存儲的最大資源量,已存入資源的數(shù)量都為〇,每個隊列里的兩個信號量分別用這兩個 值進行初始化。
[0163] 所述裝置可以包括:功能操作模塊500,第一決定模塊502,第二決定模塊504,第 三決定模塊506,第四決定模塊508,第五決定模塊510,互斥調(diào)度模塊512。
[0164] 下面分別詳細(xì)介紹各模塊的功能以及各模塊之間的關(guān)系。
[0165] 功能操作模塊500,用于使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程 和已解碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和 播放。
[0166] 第一決定模塊502,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分 離線程。
[0167] 優(yōu)選地,所述第一決定模塊502可以用于在所述功能操作模塊進行所述分離、解 碼和播放過程中,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼視頻 數(shù)據(jù)緩存隊列是否存在空閑空間;在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述 未解碼視頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程; 在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在空 閑空間時,使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,將分離出的視 頻數(shù)據(jù)存入所述未解碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第一信 號量和第二信號量;以及,根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù) 判斷所述未解碼視頻緩存隊列是否存在空閑空間。
[0168] 第二決定模塊504,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼視頻數(shù)據(jù)緩存隊列 的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程。
[0169] 優(yōu)選地,所述第二決定模塊504可以用于根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第 二信號量,判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;和/或,根據(jù)所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號,判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在空閑空 間;當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列不存 在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已解 碼視頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述視頻數(shù)據(jù)解碼線程;當(dāng)所述未解碼視頻 數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在已存儲的資源時,和/ 或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列存在 空閑空間時,使用所述視頻數(shù)據(jù)解碼線程對所述未解碼視頻數(shù)據(jù)緩存隊列中存儲的視頻數(shù) 據(jù)資源進行視頻解碼,并將解碼后的視頻數(shù)據(jù)存入所述已解碼視頻數(shù)據(jù)緩存隊列,并更新 所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,以及,所述已解碼視頻數(shù)據(jù)緩存隊列的第一 信號量和第二信號量;以及,根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,繼 續(xù)判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;和/或,根據(jù)更新后的所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在 空閑空間。
[0170] 第三決定模塊506,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同 步控制線程。
[0171] 優(yōu)選地,所述第三決定模塊506可以用于根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第 二信號量,判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;在所述已解碼視頻 數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列不存在已存儲的資源時,阻 塞所述已解碼視頻數(shù)據(jù)顯示及同步控制線程;在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號 量指示所述已解碼視頻數(shù)據(jù)緩存隊列存在已存儲的資源時,使用所述已解碼視頻數(shù)據(jù)顯示 及同步控制線程顯示所述已解碼視頻數(shù)據(jù)緩存隊列中存儲的已解碼視頻數(shù)據(jù),并控制顯示 的所述已解碼視頻數(shù)據(jù)與已解碼的音頻數(shù)據(jù)的同步播放,并更新所述已解碼視頻數(shù)據(jù)緩存 隊列的第二信號量;以及,根據(jù)更新后的所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,繼續(xù) 判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
[0172] 第四決定模塊508,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分 離線程。
[0173] 優(yōu)選地,所述第四決定模塊508可以用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第 一信號量,判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在空閑空間;在所述未解碼音頻數(shù)據(jù) 緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述數(shù) 據(jù)傳輸及音視頻數(shù)據(jù)分離線程;在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述 未解碼音頻數(shù)據(jù)緩存隊列存在空閑空間時,使用所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收 并分離音視頻數(shù)據(jù)后,將分離出的音頻數(shù)據(jù)存入所述未解碼音頻數(shù)據(jù)緩存隊列,并更新所 述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼 音頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在空閑空 間。
[0174] 第五決定模塊510,用于在所述功能操作模塊進行所述分離、解碼和播放過程中, 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞音頻數(shù)據(jù)解碼和播放線 程。
[0175] 優(yōu)選地,所述第五決定模塊510可以用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第 二信號量,判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;在所述未解碼音頻 數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不存在已存儲的資源時,阻 塞所述音頻數(shù)據(jù)解碼和播放線程;在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述 未解碼音頻數(shù)據(jù)緩存隊列存在已存儲的資源時,使用所述音頻數(shù)據(jù)解碼和播放線程對所述 未解碼音頻數(shù)據(jù)緩存隊列中存儲的音頻數(shù)據(jù)資源進行音頻解碼和播放,并更新所述未解碼 音頻數(shù)據(jù)緩存隊列的第二信號量;以及,根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第 二信號量,判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
[0176] 互斥調(diào)度模塊512,用于根據(jù)所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示 及同步控制線程之間的互斥鎖的當(dāng)前狀態(tài),互斥調(diào)度所述視頻數(shù)據(jù)解碼線程和所述已解碼 視頻數(shù)據(jù)顯示及同步控制線程。
[0177] 綜上所述,本發(fā)明中的設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存 隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中均包括各自的第一信號 量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑空間,所述第二信號量 用于指示本隊列中是否存在已存儲的資源。在對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼 和播放過程中,可以根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳 輸及音視頻數(shù)據(jù)分離線程;根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述 已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程;根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程。
[0178] 在上述多個線程之間進行狀態(tài)同步時,不再使用循環(huán)休眠、喚醒的方式等待需要 的狀態(tài),而采用信號量的設(shè)計方式。信號量可以讓線程一直處于休眠狀態(tài),處于休眠狀態(tài) 時,線程不參與中央處理器的任務(wù)調(diào)度,也不占用中央處理器;當(dāng)線程等待的狀態(tài)為真時, 信號量會主動喚醒此線程,重新參與到中央處理器的任務(wù)調(diào)度,該線程從而可以繼續(xù)被執(zhí) 行,這樣就減少了中央處理器因沒必要的任務(wù)調(diào)度而損失的性能,降低了中央處理器的占 用率和設(shè)備功耗,提高了設(shè)備的續(xù)航時間。
[0179] 另外,在視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同步控制線程中,可以分別 在視頻解碼代碼段和已解碼視頻數(shù)據(jù)顯示代碼段之間加入互斥鎖,避免這兩段代碼同時被 中央處理器調(diào)度,從而避免因中央處理器高速緩存命中率降低,導(dǎo)致的視頻軟解碼性能不 高的問題。
[0180] 采用本實施例中技術(shù)方案,視頻軟解碼的性能可以提升20%以上,在暫停視頻軟 解碼時,中央處理器的占用率幾乎降低到0,避免了中央處理器的空轉(zhuǎn)現(xiàn)象,從而延長了設(shè) 備電池的待機時間。
[0181] 在相同硬件配置的設(shè)備下軟解碼相同的視頻時,中央處理器的占用率明顯降低, 從而降低設(shè)備功耗,延長設(shè)備電池的待機時間;另外,對于一些配置較差的設(shè)備,能順暢軟 解碼的視頻碼率明顯提高,提高了用戶體驗。
[0182] 對于裝置實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān) 之處參見方法實施例的部分說明即可。
[0183] 本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與 其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。
[0184] 以上對本發(fā)明實施例所提供的一種設(shè)備的視頻軟解碼方法和裝置,進行了詳細(xì)介 紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只 是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā) 明的思想,在【具體實施方式】及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理 解為對本發(fā)明的限制。
【權(quán)利要求】
1. 一種設(shè)備的視頻軟解碼方法,其特征在于,所述設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列 和已解碼視頻數(shù)據(jù)緩存隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中 均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑 空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源; 所述方法包括: 使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和已解碼視頻數(shù)據(jù)顯示及同 步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放; 在所述分離、解碼和播放過程中,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決 定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程; 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已解碼視頻數(shù)據(jù)緩存 隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程; 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示 及同步控制線程。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列 的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程的步驟包括: 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼視頻數(shù)據(jù)緩存隊列 是否存在空閑空間; 在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列不 存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程; 在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存 在空閑空間時,使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,將分離出 的視頻數(shù)據(jù)存入所述未解碼視頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第 一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量, 繼續(xù)判斷所述未解碼視頻緩存隊列是否存在空閑空間。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第 二信號量,和/或,所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解 碼線程的步驟包括: 根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼視頻數(shù)據(jù)緩存隊列 是否存在已存儲的資源;和/或, 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號,判斷所述已解碼視頻數(shù)據(jù)緩存隊列是 否存在空閑空間; 當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列不 存在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已 解碼視頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述視頻數(shù)據(jù)解碼線程; 當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存 在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已解 碼視頻數(shù)據(jù)緩存隊列存在空閑空間時,使用所述視頻數(shù)據(jù)解碼線程對所述未解碼視頻數(shù)據(jù) 緩存隊列中存儲的視頻數(shù)據(jù)資源進行視頻解碼,并將解碼后的視頻數(shù)據(jù)存入所述已解碼視 頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,以及,所述已解碼視 頻數(shù)據(jù)緩存隊列的第一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩 存隊列的第二信號量,繼續(xù)判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;和 /或,根據(jù)更新后的所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述已解碼視頻 數(shù)據(jù)緩存隊列是否存在空閑空間。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,所述根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列 的第二信號量,決定是否阻塞已解碼視頻數(shù)據(jù)顯示及同步控制線程的步驟包括: 根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述已解碼視頻數(shù)據(jù)緩存隊列 是否存在已存儲的資源; 在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列不 存在已存儲的資源時,阻塞所述已解碼視頻數(shù)據(jù)顯示及同步控制線程; 在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列存 在已存儲的資源時,使用所述已解碼視頻數(shù)據(jù)顯示及同步控制線程顯示所述已解碼視頻數(shù) 據(jù)緩存隊列中存儲的已解碼視頻數(shù)據(jù),并控制顯示的所述已解碼視頻數(shù)據(jù)與已解碼的音頻 數(shù)據(jù)的同步播放,并更新所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量;以及,根據(jù)更新后的 所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,繼續(xù)判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否 存在已存儲的資源。
5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 根據(jù)所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示及同步控制線程之間的互斥 鎖的當(dāng)前狀態(tài),互斥調(diào)度所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示及同步控制線 程。
6. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述設(shè)備還包括未解碼音頻數(shù)據(jù)緩存隊 列,所述未解碼音頻數(shù)據(jù)緩存隊列也具有第一信號量和第二信號量; 在所述分離、解碼和播放過程中,所述方法還包括: 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù) 據(jù)分離線程;以及, 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞音頻數(shù)據(jù)解碼和播放 線程。
7. 根據(jù)權(quán)利要求6所述的方法,其特征在于, 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù) 據(jù)分離線程的步驟包括: 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼音頻數(shù)據(jù)緩存隊列 是否存在空閑空間; 在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不 存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程; 在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列存 在空閑空間時,使用所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,將分 離出的音頻數(shù)據(jù)存入所述未解碼音頻數(shù)據(jù)緩存隊列,并更新所述未解碼音頻數(shù)據(jù)緩存隊列 的第一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第一信 號量,繼續(xù)判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在空閑空間; 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞音頻數(shù)據(jù)解碼和播放 線程的步驟包括: 根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼音頻數(shù)據(jù)緩存隊列 是否存在已存儲的資源; 在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不 存在已存儲的資源時,阻塞所述音頻數(shù)據(jù)解碼和播放線程; 在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列存 在已存儲的資源時,使用所述音頻數(shù)據(jù)解碼和播放線程對所述未解碼音頻數(shù)據(jù)緩存隊列中 存儲的音頻數(shù)據(jù)資源進行音頻解碼和播放,并更新所述未解碼音頻數(shù)據(jù)緩存隊列的第二信 號量;以及,根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼音 頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
8. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第一信號量還用于指示本隊列中剩 余的空閑空間的數(shù)量;所述第二信號量還用于指示本隊列中已存儲的數(shù)據(jù)資源的數(shù)量。
9. 一種設(shè)備的視頻軟解碼裝置,其特征在于,所述設(shè)備包括未解碼視頻數(shù)據(jù)緩存隊列 和已解碼視頻數(shù)據(jù)緩存隊列,所述未解碼視頻數(shù)據(jù)緩存隊列和已解碼視頻數(shù)據(jù)緩存隊列中 均包括各自的第一信號量和第二信號量,所述第一信號量用于指示本隊列中是否存在空閑 空間,所述第二信號量用于指示本隊列中是否存在已存儲的資源; 所述裝置包括: 功能操作模塊,用于使用數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程、視頻數(shù)據(jù)解碼線程和已解 碼視頻數(shù)據(jù)顯示及同步控制線程分別對接收的音視頻數(shù)據(jù)進行相應(yīng)的分離、解碼和播放; 第一決定模塊,用于在所述功能操作模塊進行所述分離、解碼和播放過程中,根據(jù)所述 未解碼視頻數(shù)據(jù)緩存隊列的第一信號量決定是否阻塞數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程; 第二決定模塊,用于根據(jù)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,和/或,所述已 解碼視頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞視頻數(shù)據(jù)解碼線程; 第三決定模塊,用于根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞 已解碼視頻數(shù)據(jù)顯示及同步控制線程。
10. 根據(jù)權(quán)利要求9所述的裝置,其特征在于, 所述第一決定模塊,用于在所述功能操作模塊進行所述分離、解碼和播放過程中,根據(jù) 所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在 空閑空間;在所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊 列不存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程;在所述未解碼視頻數(shù)據(jù) 緩存隊列的第一信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在空閑空間時,使用數(shù)據(jù)傳輸 及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后,將分離出的視頻數(shù)據(jù)存入所述未解碼視 頻數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量和第二信號量;以及, 根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述未解碼視頻緩存 隊列是否存在空閑空間。
11. 根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述第二決定模塊,用于根據(jù)所述未解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的 資源;和/或,根據(jù)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號,判斷所述已解碼視頻數(shù)據(jù)緩 存隊列是否存在空閑空間;當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼 視頻數(shù)據(jù)緩存隊列不存在已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第 一信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述視頻數(shù)據(jù)解碼線 程;當(dāng)所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼視頻數(shù)據(jù)緩存隊列存在 已存儲的資源時,和/或,當(dāng)所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量指示所述已解碼 視頻數(shù)據(jù)緩存隊列存在空閑空間時,使用所述視頻數(shù)據(jù)解碼線程對所述未解碼視頻數(shù)據(jù)緩 存隊列中存儲的視頻數(shù)據(jù)資源進行視頻解碼,并將解碼后的視頻數(shù)據(jù)存入所述已解碼視頻 數(shù)據(jù)緩存隊列,并更新所述未解碼視頻數(shù)據(jù)緩存隊列的第二信號量,以及,所述已解碼視頻 數(shù)據(jù)緩存隊列的第一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼視頻數(shù)據(jù)緩存 隊列的第二信號量,繼續(xù)判斷所述未解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;和/ 或,根據(jù)更新后的所述已解碼視頻數(shù)據(jù)緩存隊列的第一信號量,繼續(xù)判斷所述已解碼視頻 數(shù)據(jù)緩存隊列是否存在空閑空間。
12. 根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述第三決定模塊,用于根據(jù)所述已解 碼視頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的 資源;在所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列不 存在已存儲的資源時,阻塞所述已解碼視頻數(shù)據(jù)顯示及同步控制線程;在所述已解碼視頻 數(shù)據(jù)緩存隊列的第二信號量指示所述已解碼視頻數(shù)據(jù)緩存隊列存在已存儲的資源時,使用 所述已解碼視頻數(shù)據(jù)顯示及同步控制線程顯示所述已解碼視頻數(shù)據(jù)緩存隊列中存儲的已 解碼視頻數(shù)據(jù),并控制顯示的所述已解碼視頻數(shù)據(jù)與已解碼的音頻數(shù)據(jù)的同步播放,并更 新所述已解碼視頻數(shù)據(jù)緩存隊列的第二信號量;以及,根據(jù)更新后的所述已解碼視頻數(shù)據(jù) 緩存隊列的第二信號量,繼續(xù)判斷所述已解碼視頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
13. 根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述裝置還包括: 互斥調(diào)度模塊,用于根據(jù)所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù)顯示及同步控 制線程之間的互斥鎖的當(dāng)前狀態(tài),互斥調(diào)度所述視頻數(shù)據(jù)解碼線程和所述已解碼視頻數(shù)據(jù) 顯示及同步控制線程。
14. 根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述設(shè)備還包括未解碼音頻數(shù)據(jù)緩存隊 列,所述未解碼音頻數(shù)據(jù)緩存隊列也具有第一信號量和第二信號量; 所述裝置還包括: 第四決定模塊,用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,決定是否阻塞 數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程;以及, 第五決定模塊,用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,決定是否阻塞 音頻數(shù)據(jù)解碼和播放線程。
15. 根據(jù)權(quán)利要求14所述的裝置,其特征在于, 所述第四決定模塊,用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量,判斷所述 未解碼音頻數(shù)據(jù)緩存隊列是否存在空閑空間;在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號 量指示所述未解碼音頻數(shù)據(jù)緩存隊列不存在空閑空間時,阻塞所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù) 分離線程;在所述未解碼音頻數(shù)據(jù)緩存隊列的第一信號量指示所述未解碼音頻數(shù)據(jù)緩存隊 列存在空閑空間時,使用所述數(shù)據(jù)傳輸及音視頻數(shù)據(jù)分離線程接收并分離音視頻數(shù)據(jù)后, 將分離出的音頻數(shù)據(jù)存入所述未解碼音頻數(shù)據(jù)緩存隊列,并更新所述未解碼音頻數(shù)據(jù)緩存 隊列的第一信號量和第二信號量;以及,根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第 一信號量,繼續(xù)判斷所述未解碼音頻數(shù)據(jù)緩存隊列是否存在空閑空間; 所述第五決定模塊,用于根據(jù)所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述 未解碼音頻數(shù)據(jù)緩存隊列是否存在已存儲的資源;在所述未解碼音頻數(shù)據(jù)緩存隊列的第二 信號量指示所述未解碼音頻數(shù)據(jù)緩存隊列不存在已存儲的資源時,阻塞所述音頻數(shù)據(jù)解碼 和播放線程;在所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量指示所述未解碼音頻數(shù)據(jù)緩存 隊列存在已存儲的資源時,使用所述音頻數(shù)據(jù)解碼和播放線程對所述未解碼音頻數(shù)據(jù)緩存 隊列中存儲的音頻數(shù)據(jù)資源進行音頻解碼和播放,并更新所述未解碼音頻數(shù)據(jù)緩存隊列的 第二信號量;以及,根據(jù)更新后的所述未解碼音頻數(shù)據(jù)緩存隊列的第二信號量,判斷所述未 解碼音頻數(shù)據(jù)緩存隊列是否存在已存儲的資源。
16.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述第一信號量還用于指示本隊列中剩 余的空閑空間的數(shù)量;所述第二信號量還用于指示本隊列中已存儲的數(shù)據(jù)資源的數(shù)量。
【文檔編號】H04N21/433GK104159142SQ201410384909
【公開日】2014年11月19日 申請日期:2014年8月6日 優(yōu)先權(quán)日:2014年8月6日
【發(fā)明者】石學(xué)會, 張演龍 申請人:樂視網(wǎng)信息技術(shù)(北京)股份有限公司