全志okt507cedarx编码nv21

   

全志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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值