瀏覽代碼

Change RemoteCtrl_h264. use 4 myview show 4 cameras.

yuchuli 3 年之前
父節點
當前提交
14487157ed

+ 36 - 1
src/driver/driver_h264_dec/ivh264framedecode.cpp

@@ -1,6 +1,16 @@
 #include "ivh264framedecode.h"
 
 
+static void yuvNV12ToI420(char *NV12,int w,int h,char *I420)
+{
+    memcpy(I420,NV12,w*h);//y分量
+    for(int i = 0,j = 0;i<w*h/4;i++,j+=2)
+    {
+         memcpy(I420+w*h+i,NV12+w*h+j,1);//u分量
+         memcpy(I420+w*h+w*h/4+i,NV12+w*h+j+1,1);//v分量
+    }
+}
+
 
 ivh264framedecode::ivh264framedecode(int framewidth,int frameheight)
 {
@@ -151,10 +161,21 @@ void ivh264framedecode::decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket
         int cy = mframeheight;
         int cx = mframewidth;
 
+#ifdef USE_QSV
+//        std::shared_ptr<char> pstr_nv12 = std::shared_ptr<char>(new char[mframeheight*mframewidth*3/2]);
+//        memcpy(pstr_nv12.get(),frame->data[0],cy*cx);
+//        memcpy(pstr_nv12.get()+cy*cx,frame->data[1],cy*cx/2);
+//        yuvNV12ToI420(pstr_nv12.get(),cx,cy,(char *)pbuf->myuvImg.data);
+
+        memcpy(pbuf->myuvImg.data, frame->data[0], cy*cx);
+        memcpy(pbuf->myuvImg.data + cy*cx,frame->data[1],cy*cx/2);
+#endif
+
+#ifndef USE_QSV
         memcpy(pbuf->myuvImg.data, frame->data[0], cy*cx);
         memcpy(pbuf->myuvImg.data + cy*cx,frame->data[1],cy*cx/4);
         memcpy(pbuf->myuvImg.data + cy*cx + cy*cx/4,frame->data[2],cy*cx/4);
-
+#endif
         UnlockWriteBuff(index);
         mcvread.notify_all();
 
@@ -180,7 +201,17 @@ void ivh264framedecode::threaddecode()
     int ret;
     AVPacket *pkt;
 
+#ifndef USE_QSV
     av_register_all();
+#endif
+
+#ifdef USE_QSV
+   AVBufferRef *device_ref = NULL;
+
+//       av_hwdevice_ctx_init();
+    ret = av_hwdevice_ctx_create(&device_ref, AV_HWDEVICE_TYPE_QSV,"auto", NULL, 0);
+    codec = avcodec_find_decoder_by_name("h264_qsv");
+#endif
 
     pkt = av_packet_alloc();
     if (!pkt)
@@ -189,8 +220,12 @@ void ivh264framedecode::threaddecode()
     /* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
     memset(inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
+#ifndef USE_QSV
     /* find the MPEG-1 video decoder */
     codec = avcodec_find_decoder(AV_CODEC_ID_H264);
+
+#endif
+
     if (!codec) {
         fprintf(stderr, "Codec not found\n");
         exit(1);

+ 17 - 0
src/tool/RemoteCtrl_h264/RemoteCtrl_h264.pro

@@ -142,7 +142,24 @@ LIBS += -lgrpc++_unsecure -lgrpc++_reflection -labsl_raw_hash_set -labsl_hashtab
 INCLUDEPATH += $$PWD/../../common/common/md5
 INCLUDEPATH += $$PWD/../../common/common/getinterface
 
+#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
+}
 
 

+ 99 - 13
src/tool/RemoteCtrl_h264/mainwindow.cpp

@@ -312,10 +312,33 @@ void MainWindow::CreateView()
     mmyview = new MyView(ui->centralwidget);
     mmyview->setObjectName(QStringLiteral("graphicsView"));
     mmyview->setGeometry(QRect(30, 30, 600, 600));
-
     mmyview->setCacheMode(mmyview->CacheBackground);
 
+    mmyviewLeft = new MyView(ui->centralwidget);
+    mmyviewLeft->setObjectName(QStringLiteral("graphicsView"));
+    mmyviewLeft->setGeometry(QRect(30, 30, 600, 600));
+    mmyviewLeft->setCacheMode(mmyviewLeft->CacheBackground);
+
+    mmyviewRear = new MyView(ui->centralwidget);
+    mmyviewRear->setObjectName(QStringLiteral("graphicsView"));
+    mmyviewRear->setGeometry(QRect(30, 30, 600, 600));
+    mmyviewRear->setCacheMode(mmyviewRear->CacheBackground);
+
+    mmyviewRight = new MyView(ui->centralwidget);
+    mmyviewRight->setObjectName(QStringLiteral("graphicsView"));
+    mmyviewRight->setGeometry(QRect(30, 30, 600, 600));
+    mmyviewRight->setCacheMode(mmyviewRight->CacheBackground);
+
     mscene = new QGraphicsScene;
+    mpsceneImg[0] = mscene;
+    mpsceneImg[1] = new QGraphicsScene;
+    mpsceneImg[2] = new QGraphicsScene;
+    mpsceneImg[3] = new QGraphicsScene;
+
+    mpviewImg[0] = mmyview;
+    mpviewImg[1] = mmyviewRear;
+    mpviewImg[2] = mmyviewLeft;
+    mpviewImg[3] = mmyviewRight;
 
     ui->radioButton_Null->setChecked(true);
 
@@ -337,6 +360,10 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
 
 void MainWindow::keyReleaseEvent(QKeyEvent *event)
 {
+    if(event->key() == Qt::Key_Escape)
+    {
+        showNormal();
+    }
     if(!event->isAutoRepeat())mPressKeys.remove(event->key());
     qDebug("key count is %d",mPressKeys.count());
 }
@@ -359,6 +386,24 @@ void MainWindow::resizeEvent(QResizeEvent *event)
     int nfrontsize_y = sizemain.height() * 2/3;
     mmyview->setGeometry(nfrontpos_x,nfrontpos_y,nfrontsize_x,nfrontsize_y);
 
+    int nleftpos_x = 0;
+    int nleftpos_y = 0;
+    int nleftsize_x = sizemain.width()/3;
+    int nleftsize_y = sizemain.height()/3;
+    mmyviewLeft->setGeometry(nleftpos_x,nleftpos_y,nleftsize_x,nleftsize_y);
+
+    int nrearpos_x = sizemain.width()/3;
+    int nrearpos_y = 0;
+    int nrearsize_x = sizemain.width()/3;
+    int nrearsize_y = sizemain.height()/3;
+    mmyviewRear->setGeometry(nrearpos_x,nrearpos_y,nrearsize_x,nrearsize_y);
+
+    int nrightpos_x = sizemain.width() * 2/3;
+    int nrightpos_y = 0;
+    int nrightsize_x = sizemain.width()/3;
+    int nrightsize_y = sizemain.height()/3;
+    mmyviewRight->setGeometry(nrightpos_x,nrightpos_y,nrightsize_x,nrightsize_y);
+
 //    mppicshow->SetGeometry(10+sizemain.width()/2+10,10,sizemain.width()/2-30,sizemain.height()*3/5);
 
 //    ui->lineEdit_lat->setGeometry(sizemain.width()-100,10,90,30);
@@ -445,6 +490,15 @@ void MainWindow::resizeEvent(QResizeEvent *event)
     double fscale2 = (sizemain.height()*2/3)/1080.0;
     if(fscale > fscale2) fscale = fscale2;
     mmyview->viewscaleto(fscale);
+
+    int i;
+    for(i=1;i<NUM_CAM;i++)
+    {
+        fscale =  (sizemain.width()*1/3)/1920.0;
+        fscale2 = (sizemain.height()*1/3)/1080.0;
+        if(fscale > fscale2) fscale = fscale2;
+        mpviewImg[i]->viewscaleto(fscale);
+    }
 }
 
 
@@ -779,19 +833,36 @@ void MainWindow::onTimerUpdateView()
 
 void MainWindow::paintEvent(QPaintEvent *)
 {
-    if(mbCamUpdate[0])
+    int i;
+    for(i=0;i<NUM_CAM;i++)
     {
-        std::cout<<" copy image. "<<std::endl;
-        mMutexCam[0].lock();
-        QImage image = mpImageCam[0]->copy();
-        mbCamUpdate[0] = false;
-        mMutexCam[0].unlock();
-        //       QImage image = mpPicView->GetImage();
-        mscene->clear();
-        mscene->addPixmap(QPixmap::fromImage(image));
-        mmyview->setScene(mscene);
-        mmyview->show();
+        if(mbCamUpdate[i])
+        {
+            std::cout<<" copy image. "<<std::endl;
+            mMutexCam[i].lock();
+            QImage image = mpImageCam[i]->copy();
+            mbCamUpdate[i] = false;
+            mMutexCam[i].unlock();
+            //       QImage image = mpPicView->GetImage();
+            mpsceneImg[i]->clear();
+            mpsceneImg[i]->addPixmap(QPixmap::fromImage(image));
+            mpviewImg[i]->setScene(mpsceneImg[i]);
+            mpviewImg[i]->show();
+        }
     }
+//    if(mbCamUpdate[0])
+//    {
+//        std::cout<<" copy image. "<<std::endl;
+//        mMutexCam[0].lock();
+//        QImage image = mpImageCam[0]->copy();
+//        mbCamUpdate[0] = false;
+//        mMutexCam[0].unlock();
+//        //       QImage image = mpPicView->GetImage();
+//        mscene->clear();
+//        mscene->addPixmap(QPixmap::fromImage(image));
+//        mmyview->setScene(mscene);
+//        mmyview->show();
+//    }
     if(!mpPicView->IsHaveNew())
     {
         return;
@@ -1037,7 +1108,12 @@ void MainWindow::threadpic(int ncampos)
         int cx = pbuf->framewidth;
         cv::Mat rgbImg(cy, cx,CV_8UC3);
 
-        cv::cvtColor(pbuf->myuvImg, rgbImg, CV_YUV2RGB_I420);
+#ifndef USE_QSV
+        cv::cvtColor(pbuf->myuvImg, rgbImg,  CV_YUV2RGB_I420);
+#endif
+#ifdef USE_QSV
+        cv::cvtColor(pbuf->myuvImg, rgbImg,  CV_YUV2RGB_NV12);
+#endif
         mph264decode[ncampos]->UnlockReadBuff(nindex);
 
         mMutexCam[ncampos].lock();
@@ -1055,3 +1131,13 @@ void MainWindow::onCamUpdate(int ncampos)
 {
     update();
 }
+
+void MainWindow::on_actionFullScreem_triggered()
+{
+    showFullScreen();
+}
+
+void MainWindow::on_actionNormal_triggered()
+{
+    showNormal();
+}

+ 9 - 0
src/tool/RemoteCtrl_h264/mainwindow.h

@@ -116,6 +116,10 @@ private slots:
 
     void onCamUpdate(int ncampos);
 
+    void on_actionFullScreem_triggered();
+
+    void on_actionNormal_triggered();
+
 signals:
     void CamUpdate(int ncampos);
 public:
@@ -165,6 +169,11 @@ private:
      QGraphicsScene *mscene;
      IVPicView * mpPicView;
 
+     MyView * mmyviewLeft,* mmyviewRear,*mmyviewRight;
+
+     MyView * mpviewImg[NUM_CAM];
+     QGraphicsScene * mpsceneImg[NUM_CAM];
+
      ivpicsave * mpPicSave[4];
 
      void * mpadst;

+ 18 - 0
src/tool/RemoteCtrl_h264/mainwindow.ui

@@ -497,7 +497,15 @@
     <addaction name="actionSet_Query_Pass"/>
     <addaction name="actionSet_Ctrl_Pass"/>
    </widget>
+   <widget class="QMenu" name="menuView">
+    <property name="title">
+     <string>View</string>
+    </property>
+    <addaction name="actionFullScreem"/>
+    <addaction name="actionNormal"/>
+   </widget>
    <addaction name="menuFile"/>
+   <addaction name="menuView"/>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
   <action name="actionSetting">
@@ -515,6 +523,16 @@
     <string>Set Ctrl Pass</string>
    </property>
   </action>
+  <action name="actionFullScreem">
+   <property name="text">
+    <string>FullScreen</string>
+   </property>
+  </action>
+  <action name="actionNormal">
+   <property name="text">
+    <string>Normal</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="remotectrl.qrc"/>