海康yv12转码与异步流处理


#include "opencv2/opencv.hpp"

//yv12 转码 到指定分辨率
unsigned char *  YV12RGBpixel(unsigned char * yv12,  int W, int H, int newW, int newH)
{   
	cv::Mat dst(H, W, CV_8UC3);//8UC3表示8bit uchar 无符号类型,3通道值
	cv::Mat src(H + H / 2, W, CV_8UC1, (uchar*)yv12);
	cv::cvtColor(src, dst, CV_YUV2BGR_YV12); //cv::imshow("bgr", dst); cv::waitKey(0);
	W = newW;
	H = newH;
	auto pRbuf = (unsigned char*)malloc(3 * W*H);
	cv::Mat resizeImg(cv::Size(W, H), CV_8UC3, pRbuf); 
	cv::resize(dst, resizeImg, resizeImg.size());
	return pRbuf;
} 


	enum  WHO
	{
		WHO_NULL = -1,
		WHO_read = 0,
		WHO_write = 1
	};
//结构体信息
	struct rgbBuff { 
		int W = 0;
		int H = 0;
		unsigned char* buff=NULL;
	};
	rgbBuff m_rgbBuff[2]; 

//异步--写
void writeBuff(unsigned char * pBuf, int bufflen, int W, int H)
{
	OutputDebugStringA("writeBuff\n");   
	if (m_rgbBuff[WHO_read].buff == NULL)
	{
		m_rgbBuff[WHO_read].W = m_rgbBuff[WHO_write].W;
		m_rgbBuff[WHO_read].H = m_rgbBuff[WHO_write].H;
		m_rgbBuff[WHO_read].buff = m_rgbBuff[WHO_write].buff;
		m_rgbBuff[WHO_write].buff = NULL;
	}
	//更新write buff
	if (m_rgbBuff[WHO_write].buff == NULL)
	{
		int newW = 640, newH = 480;
		m_rgbBuff[WHO_write].W = newW;
		m_rgbBuff[WHO_write].H = newH;
		m_rgbBuff[WHO_write].buff = YV12RGBpixel(pBuf, W, H, newW, newH);
	} 
}

//异步--读
void readBuff()
{ 
	OutputDebugStringA("readBuff\n");   
	if (m_rgbBuff[WHO_read].buff != NULL)
	{   
        //额外处理
        free(m_rgbBuff[WHO_read].buff)
		m_rgbBuff[WHO_read].buff = NULL;
	}   
}

思路:

writeBuff 对 m_rgbBuff  进行写操作,如果 WHO_write 作为 转码后的数据存储区, 在 readBuff操作 WHO_read 后,进行数据赋值,同时进入下一次解码操作。来不及处理的数据流将会被抛弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值