qv4l2: add support to stream raw frames into a file.
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 24 Jul 2012 13:51:32 +0000 (15:51 +0200)
committerHans Verkuil <hans.verkuil@cisco.com>
Tue, 24 Jul 2012 14:22:24 +0000 (16:22 +0200)
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
utils/qv4l2/Makefile.am
utils/qv4l2/qv4l2.cpp
utils/qv4l2/qv4l2.h
utils/qv4l2/qv4l2.qrc
utils/qv4l2/saveraw.png [new file with mode: 0644]

index 72df3b9..02d0bcb 100644 (file)
@@ -8,7 +8,8 @@ qv4l2_CPPFLAGS = $(QT_CFLAGS)
 qv4l2_LDFLAGS = $(QT_LIBS)
 
 EXTRA_DIST = exit.png fileopen.png qv4l2_24x24.png qv4l2_64x64.png qv4l2.png qv4l2.svg snapshot.png \
-  video-television.png fileclose.png qv4l2_16x16.png qv4l2_32x32.png qv4l2.desktop qv4l2.qrc record.png qv4l2.pro
+  video-television.png fileclose.png qv4l2_16x16.png qv4l2_32x32.png qv4l2.desktop qv4l2.qrc record.png \
+  saveraw.png qv4l2.pro
 
 clean-local:
        -rm -vf moc_*.cpp qrc_*.cpp qrc_*.o ui_*.h
index a2d9859..4cbff7d 100644 (file)
@@ -84,6 +84,12 @@ ApplicationWindow::ApplicationWindow() :
        m_snapshotAct->setDisabled(true);
        connect(m_snapshotAct, SIGNAL(triggered()), this, SLOT(snapshot()));
 
+       m_saveRawAct = new QAction(QIcon(":/saveraw.png"), "Save Raw Frames", this);
+       m_saveRawAct->setStatusTip("Save raw frames to file.");
+       m_saveRawAct->setCheckable(true);
+       m_saveRawAct->setChecked(false);
+       connect(m_saveRawAct, SIGNAL(toggled(bool)), this, SLOT(saveRaw(bool)));
+
        m_showFramesAct = new QAction(QIcon(":/video-television.png"), "Show &Frames", this);
        m_showFramesAct->setStatusTip("Only show captured frames if set.");
        m_showFramesAct->setCheckable(true);
@@ -105,6 +111,7 @@ ApplicationWindow::ApplicationWindow() :
        fileMenu->addAction(closeAct);
        fileMenu->addAction(m_capStartAct);
        fileMenu->addAction(m_snapshotAct);
+       fileMenu->addAction(m_saveRawAct);
        fileMenu->addAction(m_showFramesAct);
        fileMenu->addSeparator();
        fileMenu->addAction(quitAct);
@@ -114,6 +121,7 @@ ApplicationWindow::ApplicationWindow() :
        toolBar->addAction(openAct);
        toolBar->addAction(m_capStartAct);
        toolBar->addAction(m_snapshotAct);
+       toolBar->addAction(m_saveRawAct);
        toolBar->addAction(m_showFramesAct);
        toolBar->addSeparator();
        toolBar->addAction(quitAct);
@@ -314,6 +322,8 @@ void ApplicationWindow::capFrame()
                }
                if (m_makeSnapshot)
                        makeSnapshot((unsigned char *)m_frameData, s);
+               if (m_saveRaw.openMode())
+                       m_saveRaw.write((const char *)m_frameData, s);
 
                if (!m_showFrames)
                        break;
@@ -347,6 +357,8 @@ void ApplicationWindow::capFrame()
                }
                if (m_makeSnapshot)
                        makeSnapshot((unsigned char *)m_buffers[buf.index].start, buf.bytesused);
+               if (m_saveRaw.openMode())
+                       m_saveRaw.write((const char *)m_buffers[buf.index].start, buf.bytesused);
 
                qbuf(buf);
                break;
@@ -372,6 +384,8 @@ void ApplicationWindow::capFrame()
                }
                if (m_makeSnapshot)
                        makeSnapshot((unsigned char *)buf.m.userptr, buf.bytesused);
+               if (m_saveRaw.openMode())
+                       m_saveRaw.write((const char *)buf.m.userptr, buf.bytesused);
 
                qbuf(buf);
                break;
@@ -754,7 +768,7 @@ void SaveDialog::selected(const QString &s)
 {
        if (!s.isEmpty()) {
                QFile file(s);
-               file.open(QIODevice::WriteOnly);
+               file.open(QIODevice::WriteOnly | QIODevice::Truncate);
                file.write((const char *)m_buf, m_size);
                file.close();
        }
@@ -783,6 +797,41 @@ void ApplicationWindow::snapshot()
        m_makeSnapshot = true;
 }
 
+void ApplicationWindow::rejectedRawFile()
+{
+       m_saveRawAct->setChecked(false);
+}
+
+void ApplicationWindow::openRawFile(const QString &s)
+{
+       if (s.isEmpty())
+               return;
+
+       if (m_saveRaw.openMode())
+               m_saveRaw.close();
+       m_saveRaw.setFileName(s);
+       m_saveRaw.open(QIODevice::WriteOnly | QIODevice::Truncate);
+       m_saveRawAct->setChecked(true);
+}
+
+void ApplicationWindow::saveRaw(bool checked)
+{
+       if (!checked) {
+               if (m_saveRaw.openMode())
+                       m_saveRaw.close();
+               return;
+       }
+
+       SaveDialog *dlg = new SaveDialog(this, "Save Raw Frames");
+       dlg->setAttribute(Qt::WA_DeleteOnClose);
+       dlg->setFileMode(QFileDialog::AnyFile);
+       dlg->setAcceptMode(QFileDialog::AcceptSave);
+       dlg->setModal(false);
+       connect(dlg, SIGNAL(fileSelected(const QString &)), this, SLOT(openRawFile(const QString &)));
+       connect(dlg, SIGNAL(rejected()), this, SLOT(rejectedRawFile()));
+       dlg->show();
+}
+
 void ApplicationWindow::about()
 {
        QMessageBox::about(this, "V4L2 Test Bench",
index 7ab84ba..995d657 100644 (file)
@@ -103,12 +103,15 @@ private slots:
        void capFrame();
        void snapshot();
        void capVbiFrame();
+       void saveRaw(bool);
 
        // gui
 private slots:
        void opendev();
        void openrawdev();
        void ctrlAction(int);
+       void openRawFile(const QString &s);
+       void rejectedRawFile();
 
        void about();
 
@@ -156,6 +159,7 @@ private:
        VbiTab *m_vbiTab;
        QAction *m_capStartAct;
        QAction *m_snapshotAct;
+       QAction *m_saveRawAct;
        QAction *m_showFramesAct;
        QString m_filename;
        QSignalMapper *m_sigMapper;
@@ -176,6 +180,7 @@ private:
        unsigned m_lastFrame;
        unsigned m_fps;
        struct timeval m_tv;
+       QFile m_saveRaw;
 };
 
 extern ApplicationWindow *g_mw;
index 2540ba5..759b445 100644 (file)
@@ -5,6 +5,7 @@
        <file>fileclose.png</file>
        <file>record.png</file>
        <file>snapshot.png</file>
+       <file>saveraw.png</file>
        <file>video-television.png</file>
        <file>qv4l2.png</file>
     </qresource>
diff --git a/utils/qv4l2/saveraw.png b/utils/qv4l2/saveraw.png
new file mode 100644 (file)
index 0000000..575bd87
Binary files /dev/null and b/utils/qv4l2/saveraw.png differ