視頻編碼方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明的實施方式涉及視頻編碼,并且具體而言,涉及支持多路編碼通道的視頻編碼中的應(yīng)用層編碼線程喚醒。
【背景技術(shù)】
[0002]當(dāng)前,硬件編碼器件能夠支持多個獨立的編碼通道,從而實現(xiàn)了多路并行編碼,滿足了不同應(yīng)用層編碼線程同時需要進行視頻編碼的需求。
[0003]當(dāng)完成了一個編碼通道上的數(shù)據(jù)編碼后,該編碼通道會產(chǎn)生中斷通知,以通知其驅(qū)動模塊,驅(qū)動模塊需要喚醒應(yīng)用層編碼線程,以讀取該編碼通道的碼流。當(dāng)前,對于多路編碼,多采用線程喚醒后查詢的方式。當(dāng)一次編碼成功后,所有的應(yīng)用層編碼線程都被喚醒,然后通過查詢可以得知分配給自己的編碼通路沒有編碼數(shù)據(jù),然后再次進入休眠等待。這樣使系統(tǒng)浪費在了很多無謂的工作上,使系統(tǒng)效率下降。
[0004]例如,圖1示出了根據(jù)現(xiàn)有技術(shù)的在一個編碼通道編碼完成后、喚醒應(yīng)用層編碼線程的示意圖。硬件編碼器件120可以支持多個編碼通道122-1、122-2、……122_n。硬件編碼器件120的驅(qū)動模塊124針對應(yīng)用層110的編碼線程1 112分配編碼通道1 122-1,針對應(yīng)用層110的編碼線程2 114分配編碼通道2 122-2,并且維持了這樣的分配關(guān)系。如圖1所示,假如在編碼通道1完成數(shù)據(jù)編碼,則編碼通道1將產(chǎn)生中斷以通知驅(qū)動模塊124,如圖中的箭頭130所示,驅(qū)動模塊124將喚醒所有的應(yīng)用層編碼線程,即112和114,如圖中的箭頭132和134所示。之后,應(yīng)用層編碼線程112和114都將向驅(qū)動模塊124查詢分配給它自己的編碼通路有沒有編碼數(shù)據(jù)。如圖1所示,編碼線程2 114在被喚醒后,經(jīng)過查詢,發(fā)現(xiàn)在分配給自己的編碼通道上尚無可用編碼碼流,再次進入休眠等待狀態(tài)。編碼線程2 114的此次喚醒和再次休眠,無疑是系統(tǒng)資源的浪費。
[0005]舉例而言,在硬件編碼器件120的驅(qū)動模塊采用Linux系統(tǒng)進行開發(fā)的情形下,對于多路編碼,多采用select函數(shù)查詢,當(dāng)該函數(shù)被喚醒返回后,通過系統(tǒng)調(diào)用來查詢該路是否有編碼好的數(shù)據(jù)產(chǎn)生,如果有,則將數(shù)據(jù)讀走處理,如果沒有,則將繼續(xù)休眠等待。在驅(qū)動程序中的處理一般為當(dāng)有一路編碼生成后,通過poll函數(shù)喚醒所有在該器件上等待的線程,對于所有的η路編碼,只有一路是真正能獲取數(shù)據(jù)的,其他η-l路都被喚醒,查詢無數(shù)據(jù)后再次休眠。這樣,其他η-l路的被喚醒和查詢都是無效率的和無謂的,加重的系統(tǒng)的負載而沒有實際的效率。
【發(fā)明內(nèi)容】
[0006]因此,本發(fā)明的目的在于解決前述的一個或多個問題,提供一種創(chuàng)新性的支持多路編碼通道的視頻編碼中的應(yīng)用層編碼線程喚醒。
[0007]根據(jù)本發(fā)明的一個方面,提供一種視頻編碼方法,利用硬件編碼器件的多個編碼通道支持對多個應(yīng)用層編碼線程的同時編碼。該方法包括:將所述多個應(yīng)用層編碼線程中的至少一個應(yīng)用層編碼線程與所述多個編碼通道中的一個編碼通道相綁定;激活所述多個編碼通道中的所述被綁定的編碼通道,以便對視頻進行編碼;以及在所述多個編碼通道中的一個編碼通道完成編碼后,喚醒與所述多個編碼通道中的所述一個編碼通道相綁定的至少一個應(yīng)用層編碼線程。
[0008]根據(jù)本發(fā)明的有一個方面,提供一種視頻編碼裝置,利用硬件編碼器件的多個編碼通道支持對多個應(yīng)用層編碼線程的同時編碼。所述視頻編碼裝置包括:綁定模塊,用于將所述多個應(yīng)用層編碼線程中的至少一個應(yīng)用層編碼線程與所述多個編碼通道中的一個編碼通道相綁定;編碼模塊,用于激活所述多個編碼通道中的所述被綁定的編碼通道,以便對視頻進行編碼;以及喚醒模塊,用于在所述多個編碼通道中的一個編碼通道完成編碼后,喚醒與所述多個編碼通道中的所述一個編碼通道相綁定的至少一個應(yīng)用層編碼線程。
[0009]根據(jù)本發(fā)明的實施方式,能夠在硬件編碼器件的編碼通道完成編碼后,精確地喚醒該次編碼所對應(yīng)的應(yīng)用層編碼線程,而不影響其他線程。
【附圖說明】
[0010]結(jié)合附圖并參考以下詳細說明,本發(fā)明各實施方式的特征、優(yōu)點及其他方面將變得更加明顯。在附圖中:
[0011]圖1示出了根據(jù)現(xiàn)有技術(shù)的喚醒應(yīng)用層編碼線程的示意圖;
[0012]圖2示出了根據(jù)本發(fā)明的實施方式的喚醒應(yīng)用層編碼線程的示意圖;
[0013]圖3示出了根據(jù)本發(fā)明的實施方式的視頻編碼方法的流程圖;以及
[0014]圖4示出了根據(jù)本發(fā)明的實施方式的視頻編碼裝置的方框圖。
【具體實施方式】
[0015]下文將結(jié)合附圖參考若干示例性實施方式來描述本發(fā)明的原理和精神。應(yīng)當(dāng)理解,給出這些實施方式僅僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解進而實現(xiàn)本發(fā)明,而并非以任何方式限制本發(fā)明的范圍。
[0016]圖2示出了根據(jù)本發(fā)明的實施方式的在一個編碼通道編碼完成后應(yīng)用層編碼線程被喚醒的示意圖。與圖1所示的現(xiàn)有技術(shù)的處理方式不同,本發(fā)明的實施方式在為一個應(yīng)用層編碼線程打開一個編碼通道時,建立應(yīng)用層編碼線程和硬件編碼通道的綁定關(guān)系。這樣,當(dāng)硬件編碼器件完成一幀碼流的編碼后,驅(qū)動程序根據(jù)該綁定關(guān)系,可以精確地喚醒等待在該路上的線程,以便該編碼線程可以獲取編好的碼流。
[0017]如圖2所示,驅(qū)動模塊124例如可以在接收到應(yīng)用層編碼線程1 112的編碼請求時,為該編碼線程分配并打開編碼通道1 122-1,并且記錄與應(yīng)用層編碼線程1 112的綁定關(guān)系。假如在編碼通道1完成數(shù)據(jù)編碼,則編碼通道1將產(chǎn)生中斷以通知驅(qū)動模塊124,如圖中的箭頭130所示。驅(qū)動模塊124獲悉編碼通道1與應(yīng)用層編碼線程1 112的綁定關(guān)系,則只喚醒該應(yīng)用層編碼線程1 112,而不會去喚醒應(yīng)用層編碼線程2 114。與圖1的現(xiàn)有技術(shù)的喚醒方案相比,也有可能省略應(yīng)用層編碼線程1和2對驅(qū)動模塊124的查詢過程。
[0018]圖3示出了根據(jù)本發(fā)明的實施方式的視頻編碼方法300的流程圖。該方法開始于步驟S300。
[0019]步驟S310,將多個應(yīng)用層編碼線程中的一個應(yīng)用層編碼線程與多個編碼通道中的一個編碼通道相綁定。通常,硬件編碼器件所能支持的最大編碼路數(shù)是固定,例如,如果同時支持16路編碼,那么就有16個編碼通道,一個通道可以支持一個應(yīng)用線程獲取碼流??梢栽隍?qū)動模塊為一個應(yīng)用層編碼線程打開硬件編碼器件中的一個編碼通道時,建立該應(yīng)用層編碼線程與該編碼通道的綁定關(guān)系。
[0020]步驟S320,激活所述多個編碼通道中的所述被綁定的編碼通道,以便對視頻進行編碼。
[0021]步驟S330,在所述多個編碼通道中的一個編碼通道完成編碼后,根據(jù)所述綁定,喚醒與所述多個編碼通道中的所述一個編碼通道相綁定的應(yīng)用層編碼線程。
[0022]至此,方法300在步驟S340結(jié)束。
[0023]在一個實施例中,一個編碼通道只與一個應(yīng)用層編碼線程綁定,在該編碼通道完成編碼后,解除其與該應(yīng)用層編碼線程的綁定。這特別適合于期望同時編碼的應(yīng)用層編碼線程的數(shù)量小于硬件編碼器件所能支持的編碼通道的數(shù)量的情形。
[0024]在一個實施例中,可以針對一個編碼通道建立編碼線程隊列,該編碼通道與多個應(yīng)用層編碼線程綁定,該多個應(yīng)用層編碼線程構(gòu)成了該編碼線程隊列。這特別適合于存活的應(yīng)用層編碼線程的數(shù)量大于硬件編碼器件所能支持的編碼通道的數(shù)量的情形。在此情形下,可以在一個編碼通道上的編碼完成之后,喚醒針對該編碼通道的編碼線程隊列中的所有應(yīng)用層編碼線程。
[0025]編碼線程隊列可以采用先入先出隊列,在隊列頭的應(yīng)用層編碼線程讀取出編碼通道的碼流中,可以將該應(yīng)用層編碼線程從編碼線程隊列中刪除。
[0026]下面描述根據(jù)本發(fā)明實施方式的一個例子,其驅(qū)動模塊采用Linux系統(tǒng)進行開發(fā)。但是,應(yīng)當(dāng)理解,本發(fā)明的實施方式還可以適用于采用其他操作系統(tǒng)或者編程環(huán)境進行開發(fā)的硬件編碼器件的驅(qū)動模塊。
[0027]硬件編碼器件的驅(qū)動工作在Linux內(nèi)核(kernel)部分。硬件編碼器件底層能夠提供多路同時編碼,比如,出16路不同分辨率的碼流。而編碼線程是工作在應(yīng)用層的程序,對應(yīng)于硬件的16路編碼,可以有16個應(yīng)用線程同時運行,來獲取不同分辨率的16路碼流。舉例而言,用戶A啟動了一個應(yīng)用,需要編碼一路640X480的碼流,這算一個編碼線程;用戶B又啟動了一個應(yīng)用,需要編碼一路720X576的碼流,這也算一個編碼線程。這兩個線程看上去是同時在獲取碼流的,它們工作在應(yīng)用層,所以稱為應(yīng)用層的編碼線程。而這兩路編碼都是由底層的編碼驅(qū)動模塊通過一個硬件來完成。
[0028]當(dāng)用戶A啟動應(yīng)用開始編碼時,用戶A的編碼線程需要調(diào)用底層硬件編碼器件,并且從底層硬件編碼器件獲取編碼完畢的碼流。用戶A的編碼線程通過系統(tǒng)調(diào)用函數(shù)OpenO來獲取硬件編碼器件的驅(qū)動模塊分配的句柄,該句柄用于編碼線程和驅(qū)動模塊之間的交互信息,然后,用戶A的編碼線程調(diào)用其自己的select函數(shù)進行等待。例如,驅(qū)動模塊把句柄a分配給用戶A的編碼線程,并且把16路編碼通道中的編碼通道1分配給它。這樣,在驅(qū)動模塊中建立了句柄a和編碼通道1的綁定。換而言之,對于驅(qū)動模塊而言,句柄a就代表了用戶A的應(yīng)用層編碼線程,而硬件編碼器件的編碼通道1就是句柄a綁定的通道。同樣,用戶B