YUYV(YUV422)转YUV420算法

最近需要将摄像头采集到的YUYV数据转换为YUV420,在网上找了很多算法,发现写的比较复杂,因此自己写了两个,仅供参考:

void YUV422To420P(char *yuv422, char *yuv420,int i32Height ,int i32Width  )  
{          
    if( yuv422 == nullptr || yuv420 == nullptr )
    {
        return;
    }

    char *y = nullptr;
    char *u = nullptr;
    char *v = nullptr;
    int i = 0, j = 0,z = 0,GetUvFlag = 0;

    char* start = yuv422;

    y = yuv420;
    u = y + i32Height * i32Width;
    v = u + i32Height * i32Width / 4;

    for (int row = 0; row < i32Width * i32Height * 2; )
    {
        y[i++]      = start[row];        
        y[i++]      = start[row+2];

        if(GetUvFlag%2 == 0)
		{
			u[j++]  = start[row+1];//u
			v[z++]  = start[row+3];//v
		}

		row+=4;

        if(row%(i32Width*2) == 0)
		{
			GetUvFlag++;
		}
    }

          
}  
void YUV422TO420SP(char *yuv422, char *yuv420,int i32Height ,int i32Width )
{
	
	 if( yuv422 == nullptr || yuv420 == nullptr )
    {
        return;
    }
    
    char *y = yuv420;
    char *uv = yuv420+ i32Width * i32Height ;
    char *start = yuv422;

    int i = 0, j = 0, GetUvFlag = 0;

    for (int row = 0; row < i32Width * i32Height * 2; )
    {
        y[i++]      = start[row];        
        y[i++]      = start[row+2];

        //只取偶数行
        if(GetUvFlag%2 == 0)
		{
			uv[j]     = start[row+1];//u
			uv[j+1]     	= start[row+3];//v
			j+=2;
		}

		row+=4;

        if(row%(i32Width*2) == 0)
		{
			GetUvFlag++;
		}
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值