widgets/geometryval_ui.ui
widgets/wizardstandard_ui.ui
widgets/wizardextra_ui.ui
+ widgets/wizardcapture_ui.ui
widgets/wizardcheck_ui.ui
widgets/wizardmltcheck_ui.ui
widgets/spacerdialog_ui.ui
{
}
-QString BmdCaptureHandler::getDeviceName(QString)
+QString BmdCaptureHandler::getDeviceName(QString, int *, int *)
{
return QString();
}
void showOverlay(QImage img, bool transparent = true);
void hideOverlay();
void hidePreview(bool hide);
- QString getDeviceName(QString);
+ QString getDeviceName(QString, int *, int *);
private:
IDeckLinkIterator *deckLinkIterator;
m_configCapture.setupUi(p4);
V4lCaptureHandler v4l(NULL);
+ int width;
+ int height;
// 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);
+ QString deviceName = v4l.getDeviceName(path.toUtf8().constData(), &width, &height);
+ m_configCapture.kcfg_detectedv4ldevices->addItem(deviceName, path);
+ if (width > 0) m_configCapture.kcfg_detectedv4ldevices->setItemData(m_configCapture.kcfg_detectedv4ldevices->count() - 1, QString("%1x%2").arg(width).arg(height), Qt::UserRole + 1);
}
}
connect(m_configCapture.kcfg_detectedv4ldevices, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lDevice()));
{
QString device = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex()).toString();
if (!device.isEmpty()) m_configCapture.kcfg_video4vdevice->setText(device);
+ QString size = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex(), Qt::UserRole + 1).toString();
+ if (!size.isEmpty()) m_configCapture.kcfg_video4size->setText(size);
}
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;
+ virtual QString getDeviceName(QString input, int *width, int *height) = 0;
static void yuv2rgb(unsigned char *yuv_buffer, unsigned char *rgb_buffer, int width, int height);
protected:
}
if (QFile::exists(KdenliveSettings::video4vdevice())) {
if (m_bmCapture == NULL) m_bmCapture = new V4lCaptureHandler(m_layout);
- capture_device->addItem(m_bmCapture->getDeviceName(KdenliveSettings::video4vdevice()), "v4l");
+ capture_device->addItem(m_bmCapture->getDeviceName(KdenliveSettings::video4vdevice(), 0, 0), "v4l");
}
connect(m_bmCapture, SIGNAL(frameSaved(const QString)), this, SLOT(slotNewThumb(const QString)));
return 0;
}
-const char *src_query(src_t *src, char *source)
+const char *src_query(src_t *src, char *source, int *width, int *height)
{
src->source = source;
- return src_v4l2.query(src);
+ return src_v4l2.query(src, width, height);
}
int src_close(src_t *src)
int (*open)(src_t *);
int (*close)(src_t *);
int (*grab)(src_t *);
- const char *(*query)(src_t *);
+ const char *(*query)(src_t *, int*, int*);
} src_mod_t;
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 const char *src_query(src_t *src, char *source, int *width, int *height);
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);
return(0);
}
-static const char *src_v4l2_query(src_t *src)
+static const char *src_v4l2_query(src_t *src, int *width, int *height)
{
if(!src->source)
{
fprintf(stderr, "Cannot get capabilities.");
return NULL;
}
- char * res = (char*) s->cap.card;
+ char * res = (char*) s->cap.card;
+ if(!s->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) {
+ width = 0;
+ height = 0;
+ }
+ else {
+ struct v4l2_format format;
+ memset(&format,0,sizeof(format));
+ format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ if (ioctl(s->fd,VIDIOC_G_FMT,&format) < 0) {
+ fprintf(stderr, "Cannot get format.");
+ }
+ else {
+ *width = format.fmt.pix.width;
+ *height = format.fmt.pix.height;
+ fprintf(stderr, "Size: %d, %d.", width, height);
+ }
+ }
src_v4l2_close(src);
return res;
}
lay->addWidget(m_display);
}
-QString V4lCaptureHandler::getDeviceName(QString input)
+QString V4lCaptureHandler::getDeviceName(QString input, int *width, int *height)
{
fswebcam_config_t *config;
/* Prepare the configuration structure. */
v4lsrc.fps = config->fps;
v4lsrc.option = config->option;
char *source = config->device;
-
- QString deviceName = src_query(&v4lsrc, source);
+ QString deviceName = src_query(&v4lsrc, source, width, height);
kDebug() << "DEVIE NAME: " << deviceName << ".";
return deviceName.isEmpty() ? input : deviceName;
}
void showOverlay(QImage img, bool transparent = true);
void hideOverlay();
void hidePreview(bool hide);
- QString getDeviceName(QString input);
+ QString getDeviceName(QString input, int *width, int *height);
private:
bool m_update;
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WizardCapture_UI</class>
+ <widget class="QWidget" name="WizardCapture_UI">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>273</width>
+ <height>153</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Autodetected capture devices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QPushButton" name="button_reload">
+ <property name="text">
+ <string>Check</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4">
+ <widget class="QTreeWidget" name="device_list">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text">
+ <string>Device Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Capacities</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>1</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" colspan="4">
+ <widget class="QLabel" name="v4l_status">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
#include "wizard.h"
#include "kdenlivesettings.h"
#include "profilesdialog.h"
+#include "v4l/v4lcapture.h"
#include "kdenlive-config.h"
#include <KStandardDirs>
static const char kdenlive_version[] = VERSION;
Wizard::Wizard(bool upgrade, QWidget *parent) :
- QWizard(parent)
+ QWizard(parent)
{
setWindowTitle(i18n("Config Wizard"));
setPixmap(QWizard::WatermarkPixmap, QPixmap(KStandardDirs::locate("appdata", "banner.png")));
slotCheckThumbs();
addPage(page3);
+ QWizardPage *page6 = new QWizardPage;
+ page6->setTitle(i18n("Webcam"));
+ m_capture.setupUi(page6);
+ connect(m_capture.button_reload, SIGNAL(clicked()), this, SLOT(slotDetectWebcam()));
+ connect(m_capture.device_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateCaptureParameters()));
+ m_capture.button_reload->setIcon(KIcon("view-refresh"));
+
+ addPage(page6);
+
QWizardPage *page5 = new QWizardPage;
page5->setTitle(i18n("Checking system"));
listViewDelegate = new WizardDelegate(m_check.programList);
m_check.programList->setItemDelegate(listViewDelegate);
-
+ slotDetectWebcam();
QTimer::singleShot(500, this, SLOT(slotCheckMlt()));
}
+void Wizard::slotDetectWebcam()
+{
+ m_capture.device_list->clear();
+
+ // Video 4 Linux device detection
+ V4lCaptureHandler v4l(NULL);
+ int width = 0;
+ int height = 0;
+ for (int i = 0; i < 10; i++) {
+ QString path = "/dev/video" + QString::number(i);
+ if (QFile::exists(path)) {
+ QString deviceName = v4l.getDeviceName(path.toUtf8().constData(), &width, &height);
+ QString captureSize;
+ if (width > 0) captureSize = QString::number(width) + "x" + QString::number(height);
+ if (!deviceName.isEmpty()) {
+ QTreeWidgetItem *item = new QTreeWidgetItem(m_capture.device_list, QStringList() << deviceName << captureSize);
+ item->setData(0, Qt::UserRole, path);
+ if (!captureSize.isEmpty()) item->setData(0, Qt::UserRole + 1, captureSize);
+ }
+ }
+ }
+ if (m_capture.device_list->topLevelItemCount() > 0) {
+ m_capture.v4l_status->setText(i18n("Select your default video4linux device"));
+ // select default device
+ bool found = false;
+ for (int i = 0; i < m_capture.device_list->topLevelItemCount(); i++) {
+ QTreeWidgetItem * item = m_capture.device_list->topLevelItem(i);
+ if (item && item->data(0, Qt::UserRole).toString() == KdenliveSettings::video4vdevice()) {
+ m_capture.device_list->setCurrentItem(item);
+ found = true;
+ break;
+ }
+ }
+ if (!found) m_capture.device_list->setCurrentItem(m_capture.device_list->topLevelItem(0));
+ } else m_capture.v4l_status->setText(i18n("No device found, plug your webcam and refresh."));
+}
+
+void Wizard::slotUpdateCaptureParameters()
+{
+ QTreeWidgetItem * item = m_capture.device_list->currentItem();
+ if (!item) return;
+ QString device = item->data(0, Qt::UserRole).toString();
+ if (!device.isEmpty()) KdenliveSettings::setVideo4vdevice(device);
+
+ QString size = item->data(0, Qt::UserRole + 1).toString();
+ if (!size.isEmpty()) KdenliveSettings::setVideo4size(size);
+}
void Wizard::checkMltComponents()
{
} else {
QStringList extensions = mime->patterns();
QString comment = mime->comment();
- foreach(const QString &glob, globs) {
+ foreach(const QString & glob, globs) {
if (!extensions.contains(glob)) extensions << glob;
}
kDebug() << "EXTS: " << extensions;
writer.writeEndElement(); // comment
}
- foreach(const QString& pattern, extensions) {
+ foreach(const QString & pattern, extensions) {
writer.writeStartElement(nsUri, "glob");
writer.writeAttribute("pattern", pattern);
writer.writeEndElement(); // glob
#include "ui_wizardextra_ui.h"
#include "ui_wizardcheck_ui.h"
#include "ui_wizardmltcheck_ui.h"
+#include "ui_wizardcapture_ui.h"
class WizardDelegate: public QItemDelegate
{
Ui::WizardStandard_UI m_standard;
Ui::WizardExtra_UI m_extra;
Ui::WizardMltCheck_UI m_mltCheck;
+ Ui::WizardCapture_UI m_capture;
Ui::WizardCheck_UI m_check;
QVBoxLayout *m_startLayout;
bool m_systemCheckIsOk;
void slotCheckSelectedItem();
void slotCheckMlt();
void slotShowWebInfos();
+ void slotDetectWebcam();
+ void slotUpdateCaptureParameters();
};
#endif