91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

YUV420 Planar 轉換為 YUV422 Packed

發布時間:2020-08-01 23:05:34 來源:網絡 閱讀:1768 作者:lsnpurdue 欄目:軟件技術



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


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

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


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

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

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


在某些場合下,我們需要將YUV420 Planar格式轉化成 YUV422 Packed格式,以方便顯示或處理。下面這個函數使用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)中的字節,
        //結果(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
    }
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉善县| 湄潭县| 呼图壁县| 方正县| 涞源县| 丹阳市| 秦皇岛市| 汉阴县| 新蔡县| 双辽市| 岱山县| 嘉峪关市| 宁乡县| 铜陵市| 合江县| 阳朔县| 大同县| 福鼎市| 遂川县| 天全县| 金川县| 凤翔县| 香港| 嘉定区| 田林县| 那曲县| 康定县| 沂源县| 团风县| 庐江县| 上饶市| 靖州| 淅川县| 永和县| 林西县| 旺苍县| 二连浩特市| 黄石市| 江城| 景德镇市| 尼木县|