Преглед изворни кода

change nvenc, use zerobuffer,down copy time.

yuchuli пре 3 година
родитељ
комит
e41d41793f

+ 16 - 16
src/driver/driver_h264_nvenc/main.cpp

@@ -91,22 +91,22 @@ void Listenpic(const char * strdata,const unsigned int nSize,const unsigned int
     cv::cvtColor(mat, dstYuvImage, CV_BGR2YUV_I420);
 //    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();
+    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);
 
 }

+ 24 - 12
src/driver/driver_h264_nvenc/video_encode_main.cpp

@@ -185,21 +185,32 @@ int
 read_YUV_frame(NvBuffer & buffer)
 {
     std::cout<<"read frame."<<std::endl;
-    char * strdata = gstrbuffer;
-    while(gbNewData == false)
+//    char * strdata = gstrbuffer;
+//    while(gbNewData == false)
+//    {
+//        gWaitMutex.lock();
+//        gwc.wait(&gWaitMutex,10);
+//        gWaitMutex.unlock();
+//    }
+
+//    gMutexLock.lock();
+//    memcpy(strdata,gstrbuffer,gndatasize);
+//    gbNewData = false;
+//    gMutexLock.unlock();
+
+    char * strdata;
+    static qint64 nlastuptime = 0;
+    while(nlastuptime == gbuffer->GetUpTime())
     {
-        gWaitMutex.lock();
-        gwc.wait(&gWaitMutex,10);
-        gWaitMutex.unlock();
+        gbuffer->WaitRead(100);
     }
 
-    gMutexLock.lock();
-    memcpy(strdata,gstrbuffer,gndatasize);
-    gbNewData = false;
-    gMutexLock.unlock();
-
-//    char * strdata;
-//    static qint64 nlastuptime = 0;
+    nlastuptime = gbuffer->GetUpTime();
+    int nreq = gbuffer->RequireBuffer(&strdata,1000);
+    while(nreq<0)
+    {
+        nreq = gbuffer->RequireBuffer(&strdata,1000);
+    }
 
 
 
@@ -225,6 +236,7 @@ read_YUV_frame(NvBuffer & buffer)
         }
         plane.bytesused = plane.fmt.stride * plane.fmt.height;
     }
+    gbuffer->ReleaseBuffer();
     std::cout<<"complete read a frame."<<std::endl;
     return 0;
 }

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

@@ -36,12 +36,14 @@ void ZeroBuffer::ReleaseBuffer()
 {
     mbuffer.mbUsed = false;
     mMutex.unlock();
+    mreadwc.wakeAll();
 }
 
 int ZeroBuffer::UpdateDataSize(int nsize)
 {
     mbuffer.mnUpTime = QDateTime::currentMSecsSinceEpoch();
     mbuffer.mdatasize = nsize;
+
     return 0;
 }
 
@@ -54,4 +56,10 @@ qint64 ZeroBuffer::GetUpTime()
 {
     return mbuffer.mnUpTime;
 }
+void ZeroBuffer::WaitRead(int nWaitms)
+{
+    mWaitMutexread.lock();
+    mreadwc.wait(&mWaitMutexread,nWaitms);
+    mWaitMutexread.unlock();
+}
 

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

@@ -34,11 +34,16 @@ public:
 
     void ReleaseBuffer();
 
+    void WaitRead(int nWaitms);
+
     iv::buffer mbuffer;
     QMutex mMutex;
     QWaitCondition mwc;
     QMutex mWaitMutex;
 
+    QWaitCondition mreadwc;
+    QMutex mWaitMutexread;
+
 
 };