Kaynağa Gözat

change nvenc, add zerobuffer.

yuchuli 3 yıl önce
ebeveyn
işleme
1a44cbb015

+ 16 - 16
src/driver/driver_h264_dec/driver_h264_dec.pro

@@ -36,23 +36,23 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
 
 DEFINES += USE_QSV
 
-
-if(contains(DEFINES,USE_QSV)){
-INCLUDEPATH += /usr/local/include
-INCLUDEPATH += /opt/intel/mediasdk/include
-LIBS += /opt/intel/mediasdk/lib/libmfx.so.1
-LIBS += -L/opt/intel/mediasdk/lib -lmfx
-LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavcodec.so.59
-LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavutil.so.57
-LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavdevice.so.59
-LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavformat.so.59
-
-
-} else {
-
-INCLUDEPATH += /usr/include/x86_64-linux-gnu
 LIBS +=  -lavcodec -lavformat -lavutil
-}
+#if(contains(DEFINES,USE_QSV)){
+#INCLUDEPATH += /usr/local/include
+#INCLUDEPATH += /opt/intel/mediasdk/include
+#LIBS += /opt/intel/mediasdk/lib/libmfx.so.1
+#LIBS += -L/opt/intel/mediasdk/lib -lmfx
+#LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavcodec.so.59
+#LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavutil.so.57
+#LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavdevice.so.59
+#LIBS += /home/yuchuli/File1/git/ffmpeg/lib/libavformat.so.59
+
+
+#} else {
+
+#INCLUDEPATH += /usr/include/x86_64-linux-gnu
+#LIBS +=  -lavcodec -lavformat -lavutil
+#}
 
 HEADERS += \
     ../../include/msgtype/rawpic.pb.h

+ 11 - 9
src/driver/driver_h264_dec/main.cpp

@@ -12,9 +12,9 @@ extern "C"
 #include "libavformat/avio.h"
 
 #ifdef USE_QSV
-#include "libavutil/hwcontext_qsv.h"
+//#include "libavutil/hwcontext_qsv.h"
 
-#include "libavutil/hwcontext_vaapi.h"
+//#include "libavutil/hwcontext_vaapi.h"
 #endif
 
 
@@ -156,8 +156,8 @@ static void decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt,
            free it */
         snprintf(buf, sizeof(buf), "%s-%d", filename, dec_ctx->frame_number);
 
-        int cy = 720;
-        int cx = 1280;
+        int cy = 1080;
+        int cx = 1920;
         cv::Mat yuvImg;
         cv::Mat rgbImg(cy, cx,CV_8UC3);
         yuvImg.create(cy*3/2, cx, CV_8UC1);
@@ -231,6 +231,8 @@ int ThreadDec()
     filename    = "/home/yuchuli/testr.mp4";
     outfilename = "/home/yuchuli/testr.yuv";
 
+    av_register_all();
+
     pkt = av_packet_alloc();
     if (!pkt)
         exit(1);
@@ -267,11 +269,11 @@ int ThreadDec()
         exit(1);
     }
 
-    f = fopen(filename, "rb");
-    if (!f) {
-        fprintf(stderr, "Could not open %s\n", filename);
-        exit(1);
-    }
+//    f = fopen(filename, "rb");
+//    if (!f) {
+//        fprintf(stderr, "Could not open %s\n", filename);
+//        exit(1);
+//    }
 
     frame = av_frame_alloc();
     if (!frame) {

+ 4 - 2
src/driver/driver_h264_nvenc/driver_h264_nvenc.pro

@@ -46,11 +46,13 @@ SOURCES += main.cpp \
     ../../common/common/nvenc/classes/NvVideoConverter.cpp \
     ../../common/common/nvenc/classes/NvVideoDecoder.cpp \
     ../../common/common/nvenc/classes/NvVideoEncoder.cpp \
-    ../../include/msgtype/rawpic.pb.cc
+    ../../include/msgtype/rawpic.pb.cc \
+    zerobuffer.cpp
 
 HEADERS += \
     video_encode.h \
-    ../../include/msgtype/rawpic.pb.h
+    ../../include/msgtype/rawpic.pb.h \
+    zerobuffer.h
 
 INCLUDEPATH += ../../common/common/nvenc/include
 

+ 21 - 4
src/driver/driver_h264_nvenc/main.cpp

@@ -16,6 +16,10 @@
 #include <QWaitCondition>
 #include <thread>
 
+#include "zerobuffer.h"
+
+ZeroBuffer * gbuffer;
+
 extern char * gstrbuffer;
 extern QMutex gMutexLock;
 extern bool gbNewData;
@@ -52,7 +56,7 @@ void threadout()
             nout = gnoutsize;
             gbNewOut = false;
             gMutexout.unlock();
-            std::cout<<"send out. "<<std::endl;
+ //           std::cout<<"send out. "<<std::endl;
             iv::modulecomm::ModuleSendMsg(gpaout,strout,nout);
         }
     }
@@ -62,7 +66,7 @@ void Listenpic(const char * strdata,const unsigned int nSize,const unsigned int
 {
     if(nSize<1000)return;
     iv::vision::rawpic pic;
-    std::cout<<"rec. "<<std::endl;
+//    std::cout<<"rec. "<<std::endl;
     if(false == pic.ParseFromArray(strdata,nSize))
     {
         std::cout<<"picview Listenpic fail."<<std::endl;
@@ -85,13 +89,25 @@ void Listenpic(const char * strdata,const unsigned int nSize,const unsigned int
     QTime xTime;
     xTime.start();
     cv::cvtColor(mat, dstYuvImage, CV_BGR2YUV_I420);
-    std::cout<<" cvt time: "<<xTime.elapsed()<<std::endl;
+//    std::cout<<" cvt time: "<<xTime.elapsed()<<std::endl;
+
+//    char * p;
+//    int nrtn = gbuffer->RequireBuffer(&p,1000);
+//    if(nrtn < 0)
+//    {
+//        std::cout<<" Get Zero Buffer Fail."<<std::endl;
+//        return;
+//    }
+//    memcpy(p,(char *)dstYuvImage.data,gnwidth*gnheight*3/2);
+//    gbuffer->UpdateDataSize(gnwidth*gnheight*3/2);
+//    gbuffer->ReleaseBuffer();
+
     gMutexLock.lock();
     memcpy(gstrbuffer,(char *)dstYuvImage.data,gnwidth*gnheight*3/2);
     gbNewData = true;
     gMutexLock.unlock();
     gwc.wakeAll();
-//    xFileYUV.write((char *)dstYuvImage.data,gwidth*gheight*3/2);
+ //   xFileYUV.write((char *)dstYuvImage.data,gwidth*gheight*3/2);
 
 }
 
@@ -100,6 +116,7 @@ int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
 
+    gbuffer = new ZeroBuffer(30000000);
     gstrbuffer = new char[30000000];
     gstrout = new char[10000000];
     gnwidth = atoi(gstrwidth);

+ 11 - 1
src/driver/driver_h264_nvenc/video_encode_main.cpp

@@ -176,6 +176,11 @@ QMutex gMutexout;
 int gnoutsize = 0;
 
 
+#include "zerobuffer.h"
+
+extern ZeroBuffer * gbuffer;
+
+
 int
 read_YUV_frame(NvBuffer & buffer)
 {
@@ -193,6 +198,11 @@ read_YUV_frame(NvBuffer & buffer)
     gbNewData = false;
     gMutexLock.unlock();
 
+//    char * strdata;
+//    static qint64 nlastuptime = 0;
+
+
+
     uint32_t i, j;
     char *data;
     int nstrdatapos = 0;
@@ -1164,7 +1174,7 @@ static int encoder_proc_blocking(context_t &ctx, bool eos)
     while (!ctx.got_error && !ctx.enc->isInError() && !eos)
     {
         static int index =0;
-        std::cout<<"index: "<<index<<std::endl;
+//        std::cout<<"index: "<<index<<std::endl;
         index++;
         struct v4l2_buffer v4l2_buf;
         struct v4l2_plane planes[MAX_PLANES];

+ 57 - 0
src/driver/driver_h264_nvenc/zerobuffer.cpp

@@ -0,0 +1,57 @@
+#include "zerobuffer.h"
+
+#include <thread>
+
+ZeroBuffer::ZeroBuffer(int nbuffersize)
+{
+
+    mbuffer.mbUsed = false;
+    mbuffer.mMaxSize = nbuffersize;
+    mbuffer.mnUpTime = 0;
+    mbuffer.mpstr_ptr = std::shared_ptr<char>(new char[nbuffersize]);
+
+}
+
+int ZeroBuffer::RequireBuffer(char **p, int nWaitms)
+{
+    if((mbuffer.mbUsed == true)&&(nWaitms == 0))
+    {
+        *p = NULL;
+        return -1;
+
+    }
+    if(mbuffer.mbUsed)
+    {
+        mWaitMutex.lock();
+        mwc.wait(&mWaitMutex,nWaitms);
+        mWaitMutex.unlock();
+    }
+    mMutex.lock();
+    mbuffer.mbUsed = true;
+    *p = mbuffer.mpstr_ptr.get();
+    return 0;
+}
+
+void ZeroBuffer::ReleaseBuffer()
+{
+    mbuffer.mbUsed = false;
+    mMutex.unlock();
+}
+
+int ZeroBuffer::UpdateDataSize(int nsize)
+{
+    mbuffer.mnUpTime = QDateTime::currentMSecsSinceEpoch();
+    mbuffer.mdatasize = nsize;
+    return 0;
+}
+
+int ZeroBuffer::GetDataSize()
+{
+    return mbuffer.mdatasize;
+}
+
+qint64 ZeroBuffer::GetUpTime()
+{
+    return mbuffer.mnUpTime;
+}
+

+ 45 - 0
src/driver/driver_h264_nvenc/zerobuffer.h

@@ -0,0 +1,45 @@
+#ifndef ZEROBUFFER_H
+#define ZEROBUFFER_H
+
+#include <QMutex>
+#include <memory>
+#include <vector>
+#include <QThread>
+#include <QWaitCondition>
+#include <QDateTime>
+
+namespace  iv {
+class buffer {
+public:
+    buffer(){}
+    std::shared_ptr<char> mpstr_ptr;
+    int mdatasize;
+    int mMaxSize;
+    bool mbUsed;
+    qint64 mnUpTime;
+};
+}
+
+class ZeroBuffer
+{
+public:
+    ZeroBuffer(int nbuffersize);
+
+public:
+    //-1 Get Fail,  0 buffer 1   1 buffer 2
+    int RequireBuffer(char ** p,int nWaitms);
+    int UpdateDataSize(int nsize);
+    int GetDataSize();
+    qint64 GetUpTime();
+
+    void ReleaseBuffer();
+
+    iv::buffer mbuffer;
+    QMutex mMutex;
+    QWaitCondition mwc;
+    QMutex mWaitMutex;
+
+
+};
+
+#endif // ZEROBUFFER_H

+ 2 - 2
src/tool/picview/mainwindow.cpp

@@ -321,7 +321,7 @@ void MainWindow::paintEvent(QPaintEvent *)
 
         qDebug("jpg");
         std::vector<unsigned char> buff(pic.picdata().data(),pic.picdata().data()+pic.picdata().size());
-        mat = cv::imdecode(buff,CV_LOAD_IMAGE_COLOR);
+        mat = cv::imdecode(buff,1);
     }
  //   qDebug("pic len is %d ",strpic.length());
 
@@ -562,7 +562,7 @@ void MainWindow::SaveOnePic(QString strpath,int index)
 
         qDebug("save jpg");
         std::vector<unsigned char> buff(mrawpics[index].picdata().data(),mrawpics[index].picdata().data()+mrawpics[index].picdata().size());
-        mat = cv::imdecode(buff,CV_LOAD_IMAGE_COLOR);
+        mat = cv::imdecode(buff,1);//mat = cv::imdecode(buff,CV_LOAD_IMAGE_COLOR);
     }
 
     cv::imwrite(strpath.toStdString(),mat);