千家信息网

YUV420 Planar 转换为 YUV422 Packed

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。Packed 格式将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel),比如相邻两个
千家信息网最后更新 2026年11月01日YUV420 Planar 转换为 YUV422 Packed



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
}
}


格式 分量 像素 三个 函数 地址 数组 跨度 两个 任务 低位 场合 大类 字节 平面 指令 结果 交叉 处理 存储 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技股互联网 互联网 科技创新 青岛互联网科技公司 北京互联网络科技有限公司 顺玮阁互联网科技 苏州大垚互联网科技 大白互联网科技 现代科技和互联网有关系吗 互联网还是高科技吗 互联网科技革命什么开始 移动互联网年度科技创新 互联网保险科技创业 上海创道互联网络科技有限公司 工业互联网科技成果转化 广东鹅鹅鹅互联网科技有限公司 普陀区互联网教育科技管理办法 艺电能源互联网科技有限公司招聘 互联网金融运营模式中的金融科技 张家口科技产业互联网平台 盐城市攀科互联网科技有限公司 广州万易互联网科技有限公司 唐信互联网科技 科技互联网创业计划书 玖二柒互联网科技公司待遇 互联网金融科技公司干啥的 互联网科技项目计划书材料类 来此购互联网科技有限公司 厦门千工互联网科技有限公司 互联网公司属于科技吗 北京品多多互联网科技有限公司
0