X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=a2b8906ab09d9e24079a1557720f4059a026b0a0;hb=87e34435cbb42c67c699b0539b5b0d93a4f9ebf9;hp=7ee3f74508b69e953738e318f0ba90073575de2c;hpb=3d462e30dd38caaf2c766221afdfb5589be97cf2;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 7ee3f745..a2b8906a 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -53,7 +53,6 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : m_isCapturing(false), m_didCapture(false), m_isPlaying(false), - m_blackmagicCapturing(false), m_manager(manager), m_captureDevice(NULL), m_analyse(false) @@ -126,8 +125,6 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : #endif control_frame_firewire->setLayout(layout); - - slotVideoDeviceChanged(device_selector->currentIndex()); m_displayProcess = new QProcess; m_captureProcess = new QProcess; @@ -160,6 +157,10 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); kDebug() << "/////// BUILDING MONITOR, ID: " << video_frame->winId(); + slotVideoDeviceChanged(device_selector->currentIndex()); + recording_preview->setToolTip(i18n("Capture preview settings")); + recording_preview->setCurrentIndex(KdenliveSettings::recording_preview()); + connect(recording_preview, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeRecordingPreview(int))); } RecMonitor::~RecMonitor() @@ -191,7 +192,7 @@ void RecMonitor::slotConfigure() emit showConfigDialog(4, device_selector->currentIndex()); } -void RecMonitor::slotUpdateCaptureFolder(const QString currentProjectFolder) +void RecMonitor::slotUpdateCaptureFolder(const QString ¤tProjectFolder) { if (KdenliveSettings::capturetoprojectfolder()) m_capturePath = currentProjectFolder; else m_capturePath = KdenliveSettings::capturefolder(); @@ -212,9 +213,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { QString capturefile; QString capturename; - QString path; - m_videoBox->setHidden(true); - enable_preview->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + recording_preview->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); m_fwdAction->setVisible(ix == FIREWIRE); m_discAction->setVisible(ix == FIREWIRE); m_rewAction->setVisible(ix == FIREWIRE); @@ -227,6 +226,10 @@ void RecMonitor::slotVideoDeviceChanged(int ix) m_captureDevice = NULL; m_manager->clearScopeSource(); } + + // The m_videoBox container has to be shown once before the MLT consumer is build, or preview will fail + m_videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + m_videoBox->setHidden(true); switch (ix) { case SCREENGRAB: m_discAction->setEnabled(false); @@ -245,8 +248,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) case VIDEO4LINUX: m_stopAction->setEnabled(false); m_playAction->setEnabled(true); - path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); - if (checkDeviceAvailability()) buildMltDevice(path); + checkDeviceAvailability(); break; case BLACKMAGIC: m_stopAction->setEnabled(false); @@ -258,8 +260,6 @@ void RecMonitor::slotVideoDeviceChanged(int ix) capturename.append(KdenliveSettings::decklink_extension()); capturefile.append(capturename); video_frame->setPixmap(mergeSideBySide(KIcon("camera-photo").pixmap(QSize(50, 50)), i18n("Plug your camcorder and\npress play button\nto start preview.\nFiles will be saved in:\n%1", capturefile))); - path = KdenliveSettings::current_profile(); - buildMltDevice(path); break; default: // FIREWIRE m_discAction->setEnabled(true); @@ -300,17 +300,12 @@ void RecMonitor::slotVideoDeviceChanged(int ix) } } -void RecMonitor::slotGotBlackmagicFrameNumber(ulong ix) -{ - m_dvinfo.setText(QString::number(ix)); -} - void RecMonitor::slotSetInfoMessage(const QString &message) { m_logger.insertItem(0, message); } -QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString txt) +QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString &txt) { QPainter p; QRect r = QApplication::fontMetrics().boundingRect(QRect(0, 0, video_frame->width(), video_frame->height()), Qt::AlignLeft, txt); @@ -329,16 +324,14 @@ QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString txt) } -bool RecMonitor::checkDeviceAvailability() +void RecMonitor::checkDeviceAvailability() { if (!KIO::NetAccess::exists(KUrl(KdenliveSettings::video4vdevice()), KIO::NetAccess::SourceSide , this)) { m_playAction->setEnabled(false); m_recAction->setEnabled(false); video_frame->setPixmap(mergeSideBySide(KIcon("camera-web").pixmap(QSize(50, 50)), i18n("Cannot read from device %1\nPlease check drivers and access rights.", KdenliveSettings::video4vdevice()))); - return false; } else { video_frame->setPixmap(mergeSideBySide(KIcon("camera-web").pixmap(QSize(50, 50)), i18n("Press play or record button\nto start video capture\nFiles will be saved in:\n%1", m_capturePath))); - return true; } } @@ -396,6 +389,7 @@ void RecMonitor::slotStopCapture() if (m_captureDevice) { m_captureDevice->stop(); } + recording_preview->setEnabled(true); m_isCapturing = false; m_isPlaying = false; m_playAction->setEnabled(true); @@ -490,7 +484,6 @@ void RecMonitor::slotStartPreview(bool play) buildMltDevice(path); profile = ProfilesDialog::getVideoProfile(path); producer = QString("avformat-novalidate:video4linux2:%1?width:%2&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den); - kDebug()<< "PROD: "<slotStartPreview(producer)) { // v4l capture failed to start video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); @@ -552,6 +545,7 @@ void RecMonitor::slotRecord() return; } if (m_captureProcess->state() == QProcess::NotRunning) { + m_logger.clear(); m_recAction->setChecked(true); QString extension = "mpg"; if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); @@ -570,6 +564,7 @@ void RecMonitor::slotRecord() m_displayArgs.clear(); QString args; QString playlist; + QString v4lparameters; MltVideoProfile profile; QString capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; @@ -578,13 +573,43 @@ void RecMonitor::slotRecord() case VIDEO4LINUX: path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); profile = ProfilesDialog::getVideoProfile(path); + m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); buildMltDevice(path); playlist = QString("producer100000pausevideo4linux2:%1?width:%2&height:%3&frame_rate:%4avformat-novalidate").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den); + v4lparameters = KdenliveSettings::v4l_parameters(); + // Add alsa audio capture if (KdenliveSettings::v4l_captureaudio()) { playlist.append(QString("producer100000pausealsa:%50-1avformat").arg(KdenliveSettings::v4l_alsadevicename())); } + else { + // if we do not want audio, make sure that we don't have audio encoding parameters + // this is required otherwise the MLT avformat consumer will not close properly + if (v4lparameters.contains("acodec")) { + QString endParam = v4lparameters.section("acodec", 1); + int vcodec = endParam.indexOf(" vcodec"); + int format = endParam.indexOf(" f="); + int cutPosition = -1; + if (vcodec > -1) { + if (format > -1) { + cutPosition = qMin(vcodec, format); + } + else cutPosition = vcodec; + } + else if (format > -1) { + cutPosition = format; + } + else { + // nothing interesting in end params + endParam.clear(); + } + if (cutPosition > -1) { + endParam.remove(0, cutPosition); + } + v4lparameters = QString(v4lparameters.section("acodec", 0, 0) + "an=1 " + endParam).simplified(); + } + } playlist.append(""); @@ -599,11 +624,12 @@ void RecMonitor::slotRecord() playlist.append(""); - if (m_captureDevice->slotStartCapture(KdenliveSettings::v4l_parameters(), m_captureFile.path(), playlist, enable_preview->isChecked())) { + if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, recording_preview->currentIndex())) { m_videoBox->setHidden(false); m_isCapturing = true; m_recAction->setEnabled(false); m_stopAction->setEnabled(true); + recording_preview->setEnabled(false); } else { video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); @@ -615,16 +641,18 @@ void RecMonitor::slotRecord() case BLACKMAGIC: path = KdenliveSettings::current_profile(); profile = ProfilesDialog::getVideoProfile(path); + m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); buildMltDevice(path); playlist = QString("producer100000pause%1decklink").arg(KdenliveSettings::decklink_capturedevice()); - if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), enable_preview->isChecked(), false)) { + if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), recording_preview->currentIndex(), false)) { m_videoBox->setHidden(false); m_isCapturing = true; slotSetInfoMessage(i18n("Capturing to %1", m_captureFile.fileName())); m_recAction->setEnabled(false); m_stopAction->setEnabled(true); + recording_preview->setEnabled(false); } else { video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); @@ -802,7 +830,19 @@ void RecMonitor::manageCapturedFiles() KUrl url = KUrl(dir.filePath(name)); if (KIO::NetAccess::exists(url, KIO::NetAccess::SourceSide, this)) { KFileItem file(KFileItem::Unknown, KFileItem::Unknown, url, true); - if (file.time(KFileItem::ModificationTime) > m_captureTime) capturedFiles.append(url); + if (file.time(KFileItem::ModificationTime) > m_captureTime) { + // The file was captured in the last batch + if (url.fileName().contains(':')) { + // Several dvgrab options (--timecode,...) use : in the file name, which is + // not supported by MLT, so rename them + QString newUrl = url.directory(KUrl::AppendTrailingSlash) + url.fileName().replace(':', '_'); + if (QFile::rename(url.path(), newUrl)) { + url = KUrl(newUrl); + } + + } + capturedFiles.append(url); + } } } kDebug() << "Found : " << capturedFiles.count() << " new capture files"; @@ -811,10 +851,7 @@ void RecMonitor::manageCapturedFiles() if (capturedFiles.count() > 0) { ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this); if (d->exec() == QDialog::Accepted) { - capturedFiles = d->importFiles(); - foreach(const KUrl & url, capturedFiles) { - emit addProjectClip(url); - } + emit addProjectClipList(d->importFiles()); } delete d; } @@ -832,7 +869,7 @@ void RecMonitor::slotUpdateFreeSpace() { #if KDE_IS_VERSION(4,2,0) KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(m_capturePath); - if (info.isValid()) { + if (info.isValid() && info.size() > 0) { m_freeSpace->setValue(100 * info.used() / info.size()); m_freeSpace->setText(i18n("Free space: %1", KIO::convertSize(info.available()))); m_freeSpace->update(); @@ -890,6 +927,10 @@ void RecMonitor::buildMltDevice(const QString &path) } } +void RecMonitor::slotChangeRecordingPreview(int ix) +{ + KdenliveSettings::setRecording_preview(ix); +} #include "recmonitor.moc"