真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

YUV420Planar轉(zhuǎn)換為YUV422Packed

YUV格式通常有兩大類:打包(packed)格式和平面(planar)格式。

網(wǎng)站設計、網(wǎng)站建設的關(guān)注點不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)公司一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。


Packed 格式將YUV分量存放在同一個數(shù)組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel),

比如相鄰兩個像素組成一個宏像素,UYVY

Planar 格式使用三個數(shù)組分開存放YUV三個分量。

在使用 FFMPEG avcodec_decode_video() 函數(shù)解碼H.264碼流后,得到 planar 格式存儲的YUV分量

data[0], linesize[0], 描述Y分量的地址和跨度(stride)
data[1], data[2], linesize[1], 描述U,V分量的地址和跨度(stride)

在某些場合下,我們需要將YUV420 Planar格式轉(zhuǎn)化成 YUV422 Packed格式,以方便顯示或處理。下面這個函數(shù)使用MMX指令完成這個任務。


void YUV420toUYVY422(unsigned char *pszSrcY, int iSrcPitchY, unsigned char *pszSrcU,
                     unsigned char *pszSrcV, int iSrcPitchUV, unsigned char *pszDst,
                     int iSrcWidth, int iSrcHeight, int iDstPitch)
{
    int iSrcStride = iSrcPitchY + iSrcPitchY - iSrcWidth;
    int iSrcStrideU = (iSrcPitchY - iSrcWidth) >> 1;
    int iDstStride =(iDstPitch - iSrcWidth) << 1;

    __asm
    {
        push ebx
        mov edi , [pszDst]
        mov esi , [pszSrcY]
        mov eax , [pszSrcU]
        mov ebx , [pszSrcV]
        mov ecx , [iSrcHeight]
        mov edx , [iSrcWidth]
cyc:
        movq mm0, qword ptr[esi] //y1(yyyyyyyy)
        movq mm1, qword ptr[esi + 8] //y2      (yyyyyyyy)
        movq mm2 , qword ptr [eax] //u ( u u u u u u u u)
        movq mm3 , qword ptr [ebx] //v ( v v v v v v v v)
        movq mm4 , mm2

        //push eax
        //xor eax, eax
        //movd mm2, eax //u ( u u u u u u u u)
        //movd mm3, eax //v ( v v v v v v v v)
        //movq mm4, mm2
        //pop eax

        //-----------------------------------------------------
        //punpcklbw mmDST, mmSRC
        //交叉組合 mmDST 與 mmSRC 低位雙字(4B)中的字節(jié),
        //結(jié)果(8B)放入 mmDST
        //-----------------------------------------------------
        //before:
        //MM0 == 01 02 03 04 _ 05 06 07 08 hex
        //MM1 == 09 0a 0b 0c _ 0d 0e 0f 00 hex
        //punpcklbw MM0, MM1, after:
        //MM0 = 0d 05 0e 06 0f 07 00 08 h  (64bit full)
        //-----------------------------------------------------
        //when write MM0 to memory: 08 00 07 0f 06 0e 05 0d h
        //-----------------------------------------------------
        punpcklbw mm2 , mm3 // uv1 ( LOW 8B         v u v u v u v u)
        punpckhbw mm4 , mm3 // uv2 (v u v u v u v u         HI 8B  )
        movq mm6 , mm2
        movq mm7 , mm4
        movq mm3 , mm2
        movq mm5 , mm4
        punpcklbw mm2 , mm0 // uyvy1 (                y v y u y v y u)
        punpckhbw mm3 , mm0 // uyvy2 (y v y u y v y u                )
        punpcklbw mm4 , mm1 // uyvy3 (                Y v Y u Y v Y u)
        punpckhbw mm5 , mm1 // uyvy4 (Y v Y u Y v Y u                )
        movq qword ptr [edi] , mm2
        movq qword ptr [edi+8] , mm3
        movq qword ptr [edi+16] , mm4
        movq qword ptr [edi+24] , mm5

        add esi , [iSrcPitchY]
        add edi , [iDstPitch]
        
        movq mm0 , qword ptr [esi]   //y1
        movq mm1 , qword ptr [esi+8] //y2
        movq mm2 , mm6
        movq mm4 , mm7
        movq mm3 , mm2
        movq mm5 , mm4
        punpcklbw mm2 , mm0 // uyvy 1  //low byte mix
        punpckhbw mm3 , mm0 // uyvy 2  //high byte mix
        punpcklbw mm4 , mm1 // uyvy 3
        punpckhbw mm5 , mm1 // uyvy 4
        movq qword ptr [edi] , mm2
        movq qword ptr [edi+8] , mm3
        movq qword ptr [edi+16] , mm4
        movq qword ptr [edi+24] , mm5

        sub esi , [iSrcPitchY]
        sub edi , [iDstPitch]
        add eax , 8    //U
        add ebx , 8    //V
        add esi , 16   //Y
        add edi , 32   //DST
        
        sub edx , 16   //WIDTH
        ja cyc         //repeat until current row completes
        
        mov edx,  [iSrcWidth]   //Reload width at new row
        add esi , [iSrcStride]  //Reload stride at new row
        add eax , [iSrcStrideU] //U stride
        add ebx , [iSrcStrideU] //V stride
        add edi , [iDstStride]  //Y stride

        sub ecx,2       //HEIGHT 480
        ja cyc          //repeat until all rows complete
        
        emms
        pop ebx
    }
}


網(wǎng)站題目:YUV420Planar轉(zhuǎn)換為YUV422Packed
分享鏈接:http://weahome.cn/article/ghpics.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部