本篇文章為大家展示了RGB轉(zhuǎn)YUV的小優(yōu)化是什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司專注于慶云企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站建設(shè)。慶云網(wǎng)站建設(shè)公司,為慶云等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
搞音視頻,相信RGB與YUV之間的轉(zhuǎn)換,大家都不陌生。不過呢,由于這個轉(zhuǎn)換的公式是浮點運算,再加上大量像素的密集型運算,導(dǎo)致對資源的消耗比較大,進而效率需要進一步的提升。
首先我們來看看,RGB轉(zhuǎn)YUV的公式:
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.169*R - 0.331*G + 0.5 *B ;
V = 0.5 *R - 0.419*G - 0.081*B;
觀察一下,都是浮點型的運算,我們都知道浮點型的乘法運算,在計算機內(nèi)部要經(jīng)過階碼和尾數(shù)的運算,相對耗時。如果我們能將浮點運算去掉,就可以實現(xiàn)這個目標(biāo)了。于是,我們可以通過數(shù)學(xué)上的一些變換,將浮點運算變換為整數(shù)運算。變換過程如下:
Y = 0.299*R + 0.587*G + 0.114*B = 128 * (0.299*R + 0.587*G + 0.114*B) >> 7 = ( 38 * R + 75 * B + 15 * B) >> 7;
經(jīng)過如此轉(zhuǎn)換,浮點運算就變成了整數(shù)乘法和位移運算,而位移運算,效率很高,整數(shù)乘法的運算也會較浮點運算的效率高些,所以,此方法是可取的。
由于音視頻數(shù)據(jù)的處理,是典型的密集型運算。即針對每一個像素,我們的算法和處理方式都是一樣的,這也為我們做進一步優(yōu)化提供了可能。
比較原始的方式,我們遍歷每一個像素,針對每一個像素做轉(zhuǎn)換處理,這樣實現(xiàn)功能沒有問題,但效率相對來說會比較低下。由于算法是相同的,所以我們可以一次處理多個像素,這樣就會大大提升效率。
假設(shè)原來一次處理一個像素,現(xiàn)在我們一次處理16個像素,這樣我們的效率理論上就會提到16倍,當(dāng)然這只是理論值,實際上10倍是有把握的,也相當(dāng)可觀了。而要實現(xiàn)這樣的操作,我們可以借助多媒體指令集,如MMX,SSE等,如此這般,便可實現(xiàn)效率的提升。不過呢,要注意一個對齊的問題,如果我們一次處理16個像素,那么圖片的寬就必須是16的倍數(shù),否則就需要做一些容錯的處理,比如填充。
下面是部分代碼,估計不可以直接使用哦,要根據(jù)機器自身CPU支持的指令集做相應(yīng)的調(diào)整哦。
int YUV420_RGB32_mmx(uint32_t* rgb, int width, int height, uint8_t* y, uint8_t* u, uint8_t* v){__asm{pushadfinitxor eax, eaxmov ebx, heightmov ecx, widthmov edx, ymov edi, vmov esi, umov ebp, rgbhloop:push ebxmov ebx, ecxwloop :push ebxxor ebx, ebxmov al, [edi]mov bl, [esi]movq mm0, [CoefficientsRGBU + 8*eax]paddw mm0, [CoefficientsRGBV + 8*ebx]mov al, [edx]mov bl, [edx + 1]movq mm1, [CoefficientsRGBY + 8 * eax]movq mm2, [CoefficientsRGBY + 8 * ebx]mov al, [edx + ecx]mov bl, [edx + ecx + 1]movq mm3, [CoefficientsRGBY + 8 * eax]movq mm4, [CoefficientsRGBY + 8 * ebx]paddw mm1, mm0paddw mm2, mm0paddw mm3, mm0paddw mm4, mm0psraw mm1, 6psraw mm2, 6psraw mm3, 6psraw mm4, 6packuswb mm1, mm2packuswb mm3, mm4movq[ebp], mm1movq[ebp + 4 * ecx], mm3add ebp, 8add edx, 2add edi, 1add esi, 1pop ebxsub ebx, 2jnz wlooplea ebp, [ebp + 4*ecx]add edx, ecxpop ebxsub ebx, 2jnz hloopemmspopad}}
總結(jié)一下,RGB轉(zhuǎn)YUV是音視頻中常見的一個處理過程,針對其也有一定的優(yōu)化空間。優(yōu)化主要分為兩個方向,一個是對轉(zhuǎn)換公式本身做一些變換,從而避免浮點運算;另外一個就是借助指令集,實現(xiàn)從單一處理到批量處理。
上述內(nèi)容就是RGB轉(zhuǎn)YUV的小優(yōu)化是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。