我是靠谱客的博主 健忘奇迹,最近开发中收集的这篇文章主要介绍c/c++ NV12转I420P,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

NV12及I420格式不再赘述,下面代码只适用width与stride相等的情况。如果stride与width不相等的时候,需要按照步长计算。

  • 思路1:重新new一块I420buff,把nv12中UV分量分别复制到I420对应的位置中。i420Frame 是传入的指针,在函数内部申请buffer,并且拷贝yuv值进去。

    i420Frame为2级指针,一般用于内部会修改指针指向的场景,如申请buff。

#include <cstdint>
void Nv12toI420(uint8_t nv12[], int width, int height, uint8_t** i420Frame)
{
	int yByteSize = width * height;
	int uvByteSize = width * height / 2;
	i420Frame = new uint8_t[yByteSize + uvByteSize];
	//copy y
	memcpy(i420Frame, nv12, yByteSize);
	//分别拷贝uv分量
	for (int i = 0; i < uvByteSize / 2; i++)
	{
		//copy u
		i420Frame[i420Frame + yByteSize + i] = nv12[yByteSize + 2i];
		//copy v
		i420Frame[i420Frame + yByteSize + uvByteSize / 2 + i] = nv12[yByteSize + 2i + 1];
	}
}
  • 思路2:交换NV12中V分量及U分量。input —>output 都是nv12 []
void Nv12toI420BySwap(uint8_t nv12[], int width, int height)
{
	int yByteSize = width * height;
	int uvByteSize = width * height / 2;
	
	//分别找到需要交换的u v分量 index,执行swap
	for (int i = 0; i < uvByteSize / 2; i++)
	{
		//v index   所有需要交换v的index
		int vindex = nv12[yByteSize + 2 * i + 1]; 
		//u index   所有需要交换 u
		int uindex = nv12[yByteSize + uvByteSize / 2 + 2i];
		//swap
		std::swap(nv12[vindex], nv12[uindex]);
	}
}

最后

以上就是健忘奇迹为你收集整理的c/c++ NV12转I420P的全部内容,希望文章能够帮你解决c/c++ NV12转I420P所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部