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

}

}

uv422转换为yuv420_YUV420 Planar 转换为 YUV422 Packed相关推荐

  1. 【python】修改文件后缀,将JPG转换为PNG/PNG转换为JPG

    [python]修改文件后缀,将JPG转换为PNG/PNG转换为JPG 前言 os.rename replace 前言 本文只要有两种方法实现将JPG格式图片转换为PNG,第一种为应用os.renam ...

  2. 多层嵌套json转换为Map再转换为单层

    多层嵌套json转换为Map再转换为单层 最近在实习的时候,需要将多层嵌套的json转换为单层的json.并且把json进行格式化.于是参照网上的网上的方法使用谷歌的gson利用递归的实现了多层jso ...

  3. 将字母转换为数字A-Z转换为1-26

    package com.nortl.namacngsg.util;public class CommonUtil {// 将字母转换为数字A-Z转换为1-26public static String ...

  4. pdf转换为html5,PDF转换为HTML5的四种方式

    原标题:PDF转换为HTML5的四种方式 这里有四种方法能让你把一个PDF文件转换为HTML5格式,但选择哪一种方式就取决于你的优先事项.IDR解决方案已经花费超过四年的时间来处理这个问题了.我们发现 ...

  5. android bitmap上传服务器,Android 上传图片到服务器时将bitmap转换为byte[]最后转换为String...

    1. //上传图片到服务器 Bitmap bitmap = ------;//得到图片 ByteArrayOutputStream out=new ByteArrayOutputStream(); t ...

  6. java 转换为maven_Java工程转换为Maven工程

    1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Jav ...

  7. 图片转换为矩阵/矩阵转换为图片

    以下代码实现图片和矩阵相互转换 #!/usr/bin/python # -*- coding: UTF-8 -*- import PIL.Image as Image import numpy as ...

  8. 字符串转换为数字---‘123456’转换为123456--函数中嵌套函数

    自己写一个函数,实现字符串转换为整数     {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}     例如: '123456 ...

  9. swf2exe,Flash2exe,SWF to Exe转换器,FLV视频打包,SWF转换为Exe,Flash转换为Exe视频

    一款flash(swf)文件的转换软件,目的是让用户可以将自己的swf文件转为独立的exe可执行程序,而不再需要在网页等容器中运行swf.将一个.swf文件打包成为一个独立的.exe文件后,双击打包后 ...

  10. 用HTML转换为PDF,html转换为pdf批量

    如何将html转换成pdf文件 如果你的md文件使用chrome预览,就比较简单了. 点打印,目标,选本地另存为pdf,即可. 如果你的浏览器有虚拟的PDF打印机的,请你PDF虚拟打印机打印你要输出的 ...

最新文章

  1. 手把手教你STM8单片机标准库移植
  2. xcode 自带的git工具创建项目流程
  3. javascript json_爬虫里总要用到的 JSON 是什么?
  4. Linux网络编程(一):Linux内核
  5. Tomcat 是怎么处理js file access request的
  6. 程序员的思考--终于确定了自己的技术发展方向
  7. 【Spring5.x】对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean
  8. mem考试能用计算机吗,分享自己MEM考试经验
  9. 第六章第三十题(游戏:双骰子赌博)(Game: craps)
  10. 均方根误差(RMSE),平均绝对误差(MAE),标准差(Standard Deviation)的对比
  11. 【爬虫】 Squid 3.5.20 安装与配置 高匿代理
  12. Web 攻防之业务安全:越权访问漏洞 测试.
  13. linux系统可以用autocad吗,在Linux操作系统下最佳的五款CAD软件
  14. 利用随机森林算法实现Bank风险预测
  15. 数据分析入门之好莱坞百万级评论数据分析
  16. 除铜树脂CH-90NA电镀废水回收硫酸铜技术
  17. acr38u PHP调用,ACR38智能卡读写器驱动下载
  18. git commit -amend报错 ! [remote rejected] HEAD -> refs/for/master (duplicate request) error: failed to
  19. 前端 简单实现应用商店list
  20. 马斯洛的的五层需求完美吗 不

热门文章

  1. adminlte php,adminLTE 教程 -1 基础
  2. 网页可以播放RTMP视频流?支持RTMP的网页播放器
  3. LintCode 17. 子集
  4. 用SyncToy进行两台服务器之间文件同步
  5. 苹果电脑怎么安装计算机一级,苹果系统安装教程,详细教您苹果电脑怎么重装系统...
  6. 极限编程和极限编程方法采用的有效的开发实践
  7. 【测试报告】模板:迭代测试报告
  8. 【Chapter 1】什么是软件架构
  9. 12306 官网硬卧下铺的选择
  10. 最新BT面板静态文件镜像库v7.1.1