main.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <QCoreApplication>
  2. #include <opencv2/opencv.hpp>
  3. #include <opencv2/core.hpp>
  4. #include <opencv2/imgproc.hpp>
  5. //#include "opencv2/imgcodecs/legacy/constants_c.h"
  6. #include <opencv2/imgproc/types_c.h>
  7. #include "rawpic.pb.h"
  8. #include "modulecomm.h"
  9. #include <QMutex>
  10. #include <QWaitCondition>
  11. #include <thread>
  12. #include "zerobuffer.h"
  13. ZeroBuffer * gbuffer;
  14. extern char * gstrbuffer;
  15. extern QMutex gMutexLock;
  16. extern bool gbNewData;
  17. extern QWaitCondition gwc;
  18. static char * gstrwidth ="1920";
  19. static char * gstrheight = "1080";
  20. int gnwidth,gnheight;
  21. void StartNVENC(char * strwidth,char * strheight);
  22. extern bool gbNewOut;
  23. extern QWaitCondition gwcout;
  24. extern char * gstrout;
  25. extern QMutex gWaitMutexout;
  26. extern QMutex gMutexout;
  27. extern int gnoutsize ;
  28. void * gpaout;
  29. void threadout()
  30. {
  31. char * strout = new char[10000000];
  32. int nout = 0;
  33. while(1)
  34. {
  35. gWaitMutexout.lock();
  36. gwcout.wait(&gWaitMutexout,10);
  37. gWaitMutexout.unlock();
  38. if(gbNewOut)
  39. {
  40. gMutexout.lock();
  41. memcpy(strout, gstrout,gnoutsize);
  42. nout = gnoutsize;
  43. gbNewOut = false;
  44. gMutexout.unlock();
  45. // std::cout<<"send out. "<<std::endl;
  46. iv::modulecomm::ModuleSendMsg(gpaout,strout,nout);
  47. }
  48. }
  49. }
  50. void Listenpic(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  51. {
  52. if(nSize<1000)return;
  53. iv::vision::rawpic pic;
  54. // std::cout<<"rec. "<<std::endl;
  55. if(false == pic.ParseFromArray(strdata,nSize))
  56. {
  57. std::cout<<"picview Listenpic fail."<<std::endl;
  58. return;
  59. }
  60. cv::Mat mat(pic.height(),pic.width(),pic.mattype());
  61. if(pic.type() == 1)
  62. memcpy(mat.data,pic.picdata().data(),mat.rows*mat.cols*mat.elemSize());
  63. else
  64. {
  65. // qDebug("jpg");
  66. std::vector<unsigned char> buff(pic.picdata().data(),pic.picdata().data()+pic.picdata().size());
  67. mat = cv::imdecode(buff,1);
  68. }
  69. cv::Mat dstYuvImage;
  70. QTime xTime;
  71. xTime.start();
  72. cv::cvtColor(mat, dstYuvImage, CV_BGR2YUV_I420);
  73. // std::cout<<" cvt time: "<<xTime.elapsed()<<std::endl;
  74. char * p;
  75. int nrtn = gbuffer->RequireBuffer(&p,1000);
  76. if(nrtn < 0)
  77. {
  78. std::cout<<" Get Zero Buffer Fail."<<std::endl;
  79. return;
  80. }
  81. memcpy(p,(char *)dstYuvImage.data,gnwidth*gnheight*3/2);
  82. gbuffer->UpdateDataSize(gnwidth*gnheight*3/2);
  83. gbuffer->ReleaseBuffer();
  84. // gMutexLock.lock();
  85. // memcpy(gstrbuffer,(char *)dstYuvImage.data,gnwidth*gnheight*3/2);
  86. // gbNewData = true;
  87. // gMutexLock.unlock();
  88. // gwc.wakeAll();
  89. // xFileYUV.write((char *)dstYuvImage.data,gwidth*gheight*3/2);
  90. }
  91. int main(int argc, char *argv[])
  92. {
  93. QCoreApplication a(argc, argv);
  94. gbuffer = new ZeroBuffer(30000000);
  95. gstrbuffer = new char[30000000];
  96. gstrout = new char[10000000];
  97. gnwidth = atoi(gstrwidth);
  98. gnheight = atoi(gstrheight);
  99. gpaout = iv::modulecomm::RegisterSend("h264frame",1000000,1);
  100. void * pthread = new std::thread(threadout);
  101. void * pa = iv::modulecomm::RegisterRecv("picfront",Listenpic);
  102. StartNVENC(gstrwidth,gstrheight);
  103. return a.exec();
  104. }