]> git.sesse.net Git - kdenlive/commitdiff
webcam capture: Try to get webcam name instead of displaying /dev/video0
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 24 Oct 2010 19:36:31 +0000 (19:36 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 24 Oct 2010 19:36:31 +0000 (19:36 +0000)
svn path=/trunk/kdenlive/; revision=5043

13 files changed:
src/blackmagic/capture.cpp
src/blackmagic/capture.h
src/kdenlivesettings.kcfg
src/kdenlivesettingsdialog.cpp
src/kdenlivesettingsdialog.h
src/stopmotion/capturehandler.h
src/stopmotion/stopmotion.cpp
src/v4l/src.c
src/v4l/src.h
src/v4l/src_v4l2.c
src/v4l/v4lcapture.cpp
src/v4l/v4lcapture.h
src/widgets/configcapture_ui.ui

index 03aac813e04773d07350b92644d5c106b77e9ce5..6aa13cadfc155c5399825ad0a5e56eda18f09a19 100644 (file)
@@ -479,6 +479,11 @@ BmdCaptureHandler::BmdCaptureHandler(QVBoxLayout *lay, QWidget *parent):
 {
 }
 
+QString BmdCaptureHandler::getDeviceName(QString)
+{
+    return QString();
+}
+
 void BmdCaptureHandler::startPreview(int deviceId, int captureMode)
 {
     deckLinkIterator = CreateDeckLinkIteratorInstance();
index 4ccd54248ee30a97ed48b5ad0555b3799a4ace7b..dcf68f81fb62d3fadfed73d1e1e6691edade4cf5 100644 (file)
@@ -53,6 +53,7 @@ public:
     void showOverlay(QImage img, bool transparent = true);
     void hideOverlay();
     void hidePreview(bool hide);
+    QString getDeviceName(QString);
 
 private:
     IDeckLinkIterator       *deckLinkIterator;
index f7ac5bc126b8ac76f13dd943a8290bb16e7f63ce..c7a5bc15bb04e1a075fc7f2a40852ca4b140d6e3 100644 (file)
       <default>false</default>
     </entry>
 
+    <entry name="detectedv4ldevices" type="UInt">
+      <label>Detected v4l devices.</label>
+      <default>0</default>
+    </entry>
+
     <entry name="video4vformat" type="String">
       <label>Default video4linux capture format.</label>
       <default>video4linux2</default>
index e4959223ed7f9dbeabafb525c347716432ee7188..97861f63287184c6be6bdbb74cac207d2eeb8c22 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "kdenlivesettingsdialog.h"
 #include "profilesdialog.h"
+#include "v4l/v4lcapture.h"
 #include "blackmagic/devices.h"
 #include "kdenlivesettings.h"
 
@@ -80,6 +81,18 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) :
 
     QWidget *p4 = new QWidget;
     m_configCapture.setupUi(p4);
+
+    V4lCaptureHandler v4l(NULL);
+    // Video 4 Linux device detection
+    for (int i = 0; i < 10; i++) {
+        QString path = "/dev/video" + QString::number(i);
+        if (QFile::exists(path)) {
+            m_configCapture.kcfg_detectedv4ldevices->addItem(v4l.getDeviceName(path.toUtf8().constData()), path);
+        }
+    }
+    connect(m_configCapture.kcfg_detectedv4ldevices, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lDevice()));
+
+
     m_page4 = addPage(p4, i18n("Capture"), "media-record");
     m_configCapture.tabWidget->setCurrentIndex(KdenliveSettings::defaultcapture());
 #ifdef Q_WS_MAC
@@ -625,6 +638,11 @@ bool KdenliveSettingsDialog::hasChanged()
     return KConfigDialog::hasChanged();
 }
 
+void KdenliveSettingsDialog::slotUpdatev4lDevice()
+{
+    QString device = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex()).toString();
+    if (!device.isEmpty()) m_configCapture.kcfg_video4vdevice->setText(device);
+}
 
 
 #include "kdenlivesettingsdialog.moc"
index 2e265e47d7627dcb36c31519aa71c3a8eba9fb87..05f01c0c2c7c5468fff84c63252507d80d08f5d7 100644 (file)
@@ -67,6 +67,7 @@ private slots:
     void slotDialogModified();
     void slotEnableCaptureFolder();
     void slotUpdateHDMIModes();
+    void slotUpdatev4lDevice();
 
 private:
     KPageWidgetItem *m_page1;
index 29deea04e870bb0bfbf55b7a96bdbe1310476cbe..e8b755ba3318423f7eeabfbec3008b299562e987 100644 (file)
@@ -38,6 +38,7 @@ public:
     virtual void showOverlay(QImage img, bool transparent = true) = 0;
     virtual void hideOverlay() = 0;
     virtual void hidePreview(bool hide) = 0;
+    virtual QString getDeviceName(QString input) = 0;
     static void yuv2rgb(unsigned char *yuv_buffer, unsigned char *rgb_buffer, int width, int height);
 
 protected:
index d6d6786df7735a1f5b5b49f86a6c21c08679e0c5..40372969d94991eec4348dbe7c7491428d5aae45 100644 (file)
@@ -182,7 +182,7 @@ StopmotionWidget::StopmotionWidget(KUrl projectFolder, QWidget *parent) :
     }
     if (QFile::exists(KdenliveSettings::video4vdevice())) {
         if (m_bmCapture == NULL) m_bmCapture = new V4lCaptureHandler(m_layout);
-        capture_device->addItem(KdenliveSettings::video4vdevice(), "v4l");
+        capture_device->addItem(m_bmCapture->getDeviceName(KdenliveSettings::video4vdevice()), "v4l");
     }
 
     connect(m_bmCapture, SIGNAL(frameSaved(const QString)), this, SLOT(slotNewThumb(const QString)));
index a6360cd0b598594b53e125e90d38da6e8b724228..7aadb6cde4d6cadaea27c69b84b7b13094fb3649 100644 (file)
@@ -53,8 +53,6 @@ src_palette_t src_palette[] = {
 int src_open(src_t *src, char *source)
 {
        int i = 0;
-       size_t sl;
-       char *s;
        struct stat st;
        
        if(!source)
@@ -62,15 +60,6 @@ int src_open(src_t *src, char *source)
                fprintf(stderr, "No source was specified.......");
                return(-1);
        }
-       
-       sl = strlen(source) + 1;
-       s = malloc(sl);
-       if(!s)
-       {
-               fprintf(stderr, "Out of memory.");
-               return(-1);
-       }
-       
        src->source = source;
        
        i = 0;
@@ -90,6 +79,12 @@ int src_open(src_t *src, char *source)
        return 0;
 }
 
+const char *src_query(src_t *src, char *source)
+{
+    src->source = source;
+    return src_v4l2.query(src);
+}
+
 int src_close(src_t *src)
 {
        int r;
index cd259c2e97621cd818ce2b6a09b5248bab33bf7e..5f9aba54661f62f73fb410e7a5f66adb55e09764 100644 (file)
@@ -119,6 +119,7 @@ typedef struct {
        int (*open)(src_t *);
        int (*close)(src_t *);
        int (*grab)(src_t *);
+       const char *(*query)(src_t *);
        
 } src_mod_t;
 
@@ -206,6 +207,7 @@ typedef struct {
 extern int src_open(src_t *src, char *source);
 extern int src_close(src_t *src);
 extern int src_grab(src_t *src);
+extern const char *src_query(src_t *src, char *source);
 
 extern int src_set_option(src_option_t ***options, char *name, char *value);
 extern int src_get_option_by_number(src_option_t **opt, int number, char **name, char **value);
index bc4072e4ecd7237c73de5ef3af679a0f5065187d..56c4dbad0ae7e61caf1b7a676533174032fed9dc 100644 (file)
@@ -82,7 +82,7 @@ int src_v4l2_get_capability(src_t *src)
                /*ERROR("%s: Not a V4L2 device?", src->source);*/
                return(-1);
        }
-       
+       fprintf(stderr, "cap.card: \"%s\"", s->cap.card);
        /*DEBUG("%s information:", src->source);
        DEBUG("cap.driver: \"%s\"", s->cap.driver);
        DEBUG("cap.card: \"%s\"", s->cap.card);
@@ -802,6 +802,45 @@ int src_v4l2_set_read(src_t *src)
        return(0);
 }
 
+static const char *src_v4l2_query(src_t *src)
+{
+       if(!src->source)
+       {
+               /*ERROR("No device name specified.");*/
+               fprintf(stderr, "No device name specified.");
+               return NULL;
+       }
+       src_v4l2_t *s;  
+
+       /* Allocate memory for the state structure. */
+       s = calloc(sizeof(src_v4l2_t), 1);
+       if(!s)
+       {
+               fprintf(stderr, "Out of memory.");
+               return NULL;
+       }
+       
+       src->state = (void *) s;
+
+       /* Open the device. */
+       s->fd = open(src->source, O_RDWR | O_NONBLOCK);
+       if(s->fd < 0)
+       {
+               fprintf(stderr, "Cannot open device.");
+               free(s);
+               return NULL;
+       }
+
+       if(ioctl(s->fd, VIDIOC_QUERYCAP, &s->cap) < 0) {
+           src_v4l2_close(src);
+           fprintf(stderr, "Cannot get capabilities.");
+           return NULL;
+       }
+       char * res = (char*) s->cap.card;       
+       src_v4l2_close(src);
+       return res;
+}
+
 static int src_v4l2_open(src_t *src)
 {
        src_v4l2_t *s;
@@ -989,7 +1028,8 @@ src_mod_t src_v4l2 = {
        "v4l2", SRC_TYPE_DEVICE,
        src_v4l2_open,
        src_v4l2_close,
-       src_v4l2_grab
+       src_v4l2_grab,
+       src_v4l2_query
 };
 
 #else /* #ifdef HAVE_V4L2 */
@@ -998,7 +1038,8 @@ src_mod_t src_v4l2 = {
        "", SRC_TYPE_NONE,
         NULL,
         NULL,
-        NULL
+        NULL,
+       NULL
 };
 
 #endif /* #ifdef HAVE_V4L2 */
index 09ba96baf8f0ad3fdc7be41aa697dbda17500b96..51b1993d2c0c286a42dda7700e2bed3ed19a8e60 100644 (file)
@@ -91,10 +91,75 @@ V4lCaptureHandler::V4lCaptureHandler(QVBoxLayout *lay, QWidget *parent):
     CaptureHandler(lay, parent)
     , m_update(false)
 {
+    if (lay == NULL) return;
     m_display = new MyDisplay;
     lay->addWidget(m_display);
 }
 
+QString V4lCaptureHandler::getDeviceName(QString input)
+{
+    fswebcam_config_t *config;
+    /* Prepare the configuration structure. */
+    config = (fswebcam_config_t *) calloc(sizeof(fswebcam_config_t), 1);
+    if (!config) {
+        /*WARN("Out of memory.");*/
+        fprintf(stderr, "Out of MEM....");
+        return input;
+    }
+
+    /* Set the defaults. */
+    config->loop = 0;
+    config->offset = 0;
+    config->background = 0;
+    config->pidfile = NULL;
+    config->logfile = NULL;
+    config->gmt = 0;
+    config->start = 0;
+    config->device = strdup(input.toUtf8().constData());
+    config->input = NULL;
+    config->tuner = 0;
+    config->frequency = 0;
+    config->delay = 0;
+    config->use_read = 0;
+    config->list = 0;
+    config->width = 384;
+    config->height = 288;
+    config->fps = 0;
+    config->frames = 1;
+    config->skipframes = 0;
+    config->palette = SRC_PAL_ANY;
+    config->option = NULL;
+    config->dumpframe = NULL;
+    config->jobs = 0;
+    config->job = NULL;
+
+    /* Set defaults and parse the command line. */
+    /*if(fswc_getopts(config, argc, argv)) return(-1);*/
+
+
+    /* Record the start time. */
+    config->start = time(NULL);
+    /* Set source options... */
+    memset(&v4lsrc, 0, sizeof(v4lsrc));
+    v4lsrc.input      = config->input;
+    v4lsrc.tuner      = config->tuner;
+    v4lsrc.frequency  = config->frequency;
+    v4lsrc.delay      = config->delay;
+    v4lsrc.timeout    = 10; /* seconds */
+    v4lsrc.use_read   = config->use_read;
+    v4lsrc.list       = config->list;
+    v4lsrc.palette    = config->palette;
+    v4lsrc.width      = config->width;
+    v4lsrc.height     = config->height;
+    v4lsrc.fps        = config->fps;
+    v4lsrc.option     = config->option;
+    char *source = config->device;
+
+    QString deviceName = src_query(&v4lsrc, source);
+    kDebug() << "DEVIE NAME: " << deviceName << ".";
+    return deviceName.isEmpty() ? input : deviceName;
+}
+
 void V4lCaptureHandler::startPreview(int /*deviceId*/, int /*captureMode*/)
 {
     m_display->setHidden(false);
index 36bf28d02d1601c6ce233d7b6b368cca19f6fe11..bbcbf8833116a7cfb04c3345d76f76a8eb2fccea 100644 (file)
@@ -44,6 +44,7 @@ public:
     void showOverlay(QImage img, bool transparent = true);
     void hideOverlay();
     void hidePreview(bool hide);
+    QString getDeviceName(QString input);
 
 private:
     bool m_update;
index 66bc1530491452a519902565f5d99ed599be4d33..b8657a80a2afac1b576aa91feeffc2feef685234 100644 (file)
        <string>Video4Linux</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_9">
-       <item row="0" column="0" colspan="2">
+       <item row="1" column="0" colspan="2">
         <widget class="QGroupBox" name="groupBox">
          <property name="title">
           <string>Video</string>
          </layout>
         </widget>
        </item>
-       <item row="1" column="0" colspan="2">
+       <item row="2" column="0" colspan="2">
         <widget class="QGroupBox" name="groupBox_2">
          <property name="title">
           <string>Audio</string>
          </layout>
         </widget>
        </item>
-       <item row="2" column="0" colspan="2">
+       <item row="3" column="0" colspan="2">
         <widget class="QGroupBox" name="groupBox_3">
          <property name="title">
           <string>Container</string>
          </layout>
         </widget>
        </item>
-       <item row="3" column="0">
+       <item row="4" column="0">
         <widget class="QLabel" name="label_11">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
          </property>
         </widget>
        </item>
-       <item row="4" column="0" colspan="2">
+       <item row="5" column="0" colspan="2">
         <widget class="KLineEdit" name="kcfg_video4capture">
          <property name="sizePolicy">
           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
          </property>
         </widget>
        </item>
-       <item row="5" column="0">
+       <item row="6" column="0">
         <widget class="QLabel" name="label_12">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
          </property>
         </widget>
        </item>
-       <item row="6" column="0" colspan="2">
+       <item row="7" column="0" colspan="2">
         <widget class="KLineEdit" name="kcfg_video4encoding"/>
        </item>
-       <item row="7" column="1">
+       <item row="8" column="1">
         <spacer name="verticalSpacer">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
          </property>
         </spacer>
        </item>
+       <item row="0" column="1">
+        <widget class="KComboBox" name="kcfg_detectedv4ldevices">
+         <item>
+          <property name="text">
+           <string>Select device in list</string>
+          </property>
+         </item>
+        </widget>
+       </item>
+       <item row="0" column="0">
+        <widget class="QLabel" name="label_30">
+         <property name="text">
+          <string>Detected devices</string>
+         </property>
+        </widget>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_3">