Android的MediaCodec解码后,默认输出是原始视频图像格式,一般为YUV420,例如NV12, NV21。则我们需要进行YUV转RGB,以便后续输入至算法库。而如果使用循环单纯用CPU转换是比较慢的,这里使用Opencv来进行转换,Opencv虽然也是用了CPU,但是他内部做了并行计算的优化是比较快的,例如NEON/SSE等。
头文件:
#include "Flow.h"
#include <thread>
#include "DmSyncQueue.h"
#include "InputData.h"
#include <atomic>
using namespace std;
class Yuv2RgbCv : public Flow {
public:
Yuv2RgbCv();
~Yuv2RgbCv();
void Init(int width, int height, int buffNumber=10);
void PushData(const unsigned char *data, int size, int copy, int flag=0);
void ReleaseOuputData(); //当外部使用完缓冲工区时释放
void UnInit();
private:
void Loop();
int imageW;
int imageH;
int mMaxBufferNumber;
int mBufferHead;
int mBufferTail;
atomic<int> mBufferSize;
unsigned char **mOutputBuffer;
};