您好,登錄后才能下訂單哦!
本篇文章為大家展示了RGB轉YUV的小優化是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
搞音視頻,相信RGB與YUV之間的轉換,大家都不陌生。不過呢,由于這個轉換的公式是浮點運算,再加上大量像素的密集型運算,導致對資源的消耗比較大,進而效率需要進一步的提升。
首先我們來看看,RGB轉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;
觀察一下,都是浮點型的運算,我們都知道浮點型的乘法運算,在計算機內部要經過階碼和尾數的運算,相對耗時。如果我們能將浮點運算去掉,就可以實現這個目標了。于是,我們可以通過數學上的一些變換,將浮點運算變換為整數運算。變換過程如下:
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;
經過如此轉換,浮點運算就變成了整數乘法和位移運算,而位移運算,效率很高,整數乘法的運算也會較浮點運算的效率高些,所以,此方法是可取的。
由于音視頻數據的處理,是典型的密集型運算。即針對每一個像素,我們的算法和處理方式都是一樣的,這也為我們做進一步優化提供了可能。
比較原始的方式,我們遍歷每一個像素,針對每一個像素做轉換處理,這樣實現功能沒有問題,但效率相對來說會比較低下。由于算法是相同的,所以我們可以一次處理多個像素,這樣就會大大提升效率。
假設原來一次處理一個像素,現在我們一次處理16個像素,這樣我們的效率理論上就會提到16倍,當然這只是理論值,實際上10倍是有把握的,也相當可觀了。而要實現這樣的操作,我們可以借助多媒體指令集,如MMX,SSE等,如此這般,便可實現效率的提升。不過呢,要注意一個對齊的問題,如果我們一次處理16個像素,那么圖片的寬就必須是16的倍數,否則就需要做一些容錯的處理,比如填充。
下面是部分代碼,估計不可以直接使用哦,要根據機器自身CPU支持的指令集做相應的調整哦。
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}}
總結一下,RGB轉YUV是音視頻中常見的一個處理過程,針對其也有一定的優化空間。優化主要分為兩個方向,一個是對轉換公式本身做一些變換,從而避免浮點運算;另外一個就是借助指令集,實現從單一處理到批量處理。
上述內容就是RGB轉YUV的小優化是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。