全志okt507cedarx编码nv21
encoderhard.h
#ifndef ENCODERHARD_H
#define ENCODERHARD_H
#include <QObject>
#include <QDateTime>
#include <QByteArray>
//#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#include "sunxiMemInterface.h"
#include "AWVideoEncoder.h"
//#include "myencodercallback.h"
#include "digitalData.h"
#include "vencoder.h"
#include <memoryAdapter.h>
#include <linux/videodev2.h>
class encoderhard : public QObject
{
Q_OBJECT
public:
explicit encoderhard(QObject *parent = nullptr);
~encoderhard();
void encode(char *data,int len);
signals:
public slots:
private:
int m_frameIndex;
char m_pps[1024];
int m_ppslen;
char* m_encodeout;
FILE* m_File;
QDateTime m_start_filetime;
VideoEncoder *gVideoEnc;
VencBaseConfig baseConfig;
VencHeaderData sps_pps_data;
VencH264Param h264Param;
struct buffer *buffers ;
FILE* m_file;
VencInputBuffer inputBuffer;
VencOutputBuffer outputBuffer;
VencAllocateBufferParam bufferParam;
bool isSDCardMount;
};
#endif // ENCODERHARD_H
encoderhard.cpp
encoderhard::encoderhard(QObject *parent) : QObject(parent)
{
h264Param.bEntropyCodingCABAC = 1;
h264Param.nBitrate = 1 * 1024 * 1024;
h264Param.nFramerate = 15;
h264Param.nCodingMode = VENC_FRAME_CODING;
//h264Param.nCodingMode = VENC_FIELD_CODING;
h264Param.nMaxKeyInterval = 30;
h264Param.sProfileLevel.nProfile = VENC_H264ProfileMain;
h264Param.sProfileLevel.nLevel = VENC_H264Level31;
h264Param.sQPRange.nMinqp = 10;
h264Param.sQPRange.nMaxqp = 40;
memset(&baseConfig, 0, sizeof(VencBaseConfig));
if (baseConfig.memops == NULL)
{
baseConfig.memops = MemAdapterGetOpsS();
if (baseConfig.memops == NULL)
{
printf("MemAdapterGetOpsS failed\n");
return ;
}
CdcMemOpen(baseConfig.memops);
}
baseConfig.nInputWidth = 1280;
baseConfig.nInputHeight = 720;
baseConfig.nStride = 1280;
baseConfig.nDstWidth = 1280;
baseConfig.nDstHeight = 720;
baseConfig.eInputFormat = VENC_PIXEL_YVU420SP;//VENC_PIXEL_YVU420SP
if (gVideoEnc == NULL)
{
printf("get SPS PPS\n");
gVideoEnc = VideoEncCreate((VENC_CODEC_TYPE)VENC_CODEC_H264);
VideoEncSetParameter(gVideoEnc, VENC_IndexParamH264Param, &h264Param);
int value = 0;
VideoEncSetParameter(gVideoEnc, VENC_IndexParamIfilter, &value);
value = 0; //degree
VideoEncSetParameter(gVideoEnc, VENC_IndexParamRotation, &value);
value = 0;
VideoEncSetParameter(gVideoEnc, VENC_IndexParamSetPSkip, &value);
VideoEncInit(gVideoEnc, &baseConfig);
}
VideoEncGetParameter(gVideoEnc, VENC_IndexParamH264SPSPPS, &sps_pps_data);
memset(&bufferParam, 0, sizeof(VencAllocateBufferParam));
memset(&inputBuffer, 0, sizeof(VencInputBuffer));
bufferParam.nSizeY = baseConfig.nInputWidth * baseConfig.nInputHeight;
bufferParam.nSizeC = baseConfig.nInputWidth * baseConfig.nInputHeight /2 ;
bufferParam.nBufferNum = 1;
AllocInputBuffer(gVideoEnc, &bufferParam);
}
void encoderhard::encode(char * data,int len)
{
GetOneAllocInputBuffer(gVideoEnc, &inputBuffer);
memcpy(inputBuffer.pAddrVirY, data, baseConfig.nInputWidth * baseConfig.nInputHeight);
memcpy(inputBuffer.pAddrVirC, data+1280*720, baseConfig.nInputWidth * baseConfig.nInputHeight /2 );
std::string str =QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toStdString();
char *datatime = &str[0];
overinfo(datatime,1,1,inputBuffer.pAddrVirY,1280,720,10,10);
inputBuffer.bEnableCorp = 0;
inputBuffer.sCropInfo.nLeft = 0;
inputBuffer.sCropInfo.nTop = 0;
inputBuffer.sCropInfo.nWidth = 0;
inputBuffer.sCropInfo.nHeight = 0;
FlushCacheAllocInputBuffer(gVideoEnc, &inputBuffer);
AddOneInputBuffer(gVideoEnc, &inputBuffer);
if (VENC_RESULT_OK != VideoEncodeOneFrame(gVideoEnc))
{
printf("VideoEncodeOneFrame failed.\n");
return ;
}
AlreadyUsedInputBuffer(gVideoEnc, &inputBuffer);
ReturnOneAllocInputBuffer(gVideoEnc, &inputBuffer);
ReleaseAllocInputBuffer(gVideoEnc);
int num=ValidBitstreamFrameNum(gVideoEnc);
for(int i =0;i<num;i++){
GetOneBitstreamFrame(gVideoEnc, &outputBuffer);
}
if(isSDCardMount){
create:
if(m_File==nullptr){
m_start_filetime =QDateTime::currentDateTime();
QString filename = QString("/run/media/mmcblk1p1/av360/av360_%1.h264").arg(m_start_filetime.toString("yyyy_MM_dd__hh_mm_ss"));
QByteArray ba = filename.toLatin1(); // must
m_File = fopen(ba.data(), "wb");
if(m_File == nullptr){
printf("MyEncoderCallback open m_File error");
goto freeoutput;
}else{
qDebug()<<"MyEncoderCallback open m_File:"<<ba;
fwrite(sps_pps_data.pBuffer, 1, sps_pps_data.nLength, m_File);
}
}else{
if(m_start_filetime.secsTo(QDateTime::currentDateTime())>600&&outputBuffer.pData0[4]== 0x65){
fclose(m_File);
m_File =nullptr;
goto create;
}
}
if (outputBuffer.nSize0 > 0)
{
fwrite(outputBuffer.pData0, 1, outputBuffer.nSize0, m_File);
}
if (outputBuffer.nSize1 > 0)
{
fwrite(outputBuffer.pData1, 1, outputBuffer.nSize1, m_File);
}
}
freeoutput:
FreeOneBitStreamFrame(gVideoEnc, &outputBuffer);
}