#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 后,进行数据赋值,同时进入下一次解码操作。来不及处理的数据流将会被抛弃。