X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomtrackview.cpp;h=428612df4ece540b243863d1d2098c9e7564fa1b;hb=492d385f45df2bb1c67dcac7d7c541fa1b52a125;hp=188d18e7adfef4b9bc73ddff282b772f44cea463;hpb=3cf14dfa3d663cb9580b1cad48108f642f5fcaf8;p=kdenlive diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 188d18e7..428612df 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1491,7 +1491,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0); return false; } - if (clip->producer() == NULL) { + if (clip->getProducer() == NULL) { emit displayMessage(i18n("Clip not ready"), ErrorMessage); return false; } @@ -1546,7 +1546,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i); return false; } - if (clip->producer() == NULL) { + if (clip->getProducer() == NULL) { emit displayMessage(i18n("Clip not ready"), ErrorMessage); return false; } @@ -2420,7 +2420,7 @@ void CustomTrackView::dropEvent(QDropEvent * event) ItemInfo clipInfo = info; clipInfo.track = m_document->tracksCount() - item->track(); - int worked = m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT); + int worked = m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->getProducer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT); if (worked == -1) { emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage); brokenClips.append(item); @@ -2663,6 +2663,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix) m_selectionGroup->translate(0, m_tracksHeight); // adjust track number + Mlt::Tractor *tractor = m_document->renderer()->lockService(); QList children = m_selectionGroup->childItems(); for (int i = 0; i < children.count(); i++) { if (children.at(i)->type() == GROUPWIDGET) { @@ -2680,7 +2681,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix) // We add a move clip command so that we get the correct producer for new track number if (clip->clipType() == AV || clip->clipType() == AUDIO) { Mlt::Producer *prod = clip->getProducer(clipinfo.track); - if (m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, (int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod) == false) { // problem updating clip emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage); } @@ -2694,6 +2695,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix) } } resetSelectionGroup(false); + m_document->renderer()->unlockService(tractor); } int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); @@ -2735,6 +2737,7 @@ void CustomTrackView::removeTrack(int ix) // Move graphic items qreal ydiff = 0 - (int) m_tracksHeight; m_selectionGroup->translate(0, ydiff); + Mlt::Tractor *tractor = m_document->renderer()->lockService(); // adjust track number QList children = m_selectionGroup->childItems(); @@ -2752,7 +2755,7 @@ void CustomTrackView::removeTrack(int ix) // We add a move clip command so that we get the correct producer for new track number if (clip->clipType() == AV || clip->clipType() == AUDIO || clip->clipType() == PLAYLIST) { Mlt::Producer *prod = clip->getProducer(clipinfo.track); - if (prod == NULL || !m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod)) { + if (prod == NULL || !m_document->renderer()->mltUpdateClipProducer(tractor, (int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod)) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage); } } @@ -2767,6 +2770,7 @@ void CustomTrackView::removeTrack(int ix) } } resetSelectionGroup(false); + m_document->renderer()->unlockService(tractor); int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22(); for (int i = 0; i < m_guides.count(); i++) { @@ -4123,18 +4127,18 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i return; } - if (baseclip->producer() == NULL) { + if (baseclip->getProducer() == NULL) { // If the clip has no producer, we must wait until it is created... m_mutex.lock(); emit displayMessage(i18n("Waiting for clip..."), InformationMessage); emit forceClipProcessing(clipId); qApp->processEvents(); for (int i = 0; i < 3; i++) { - if (baseclip->producer() == NULL) { + if (baseclip->getProducer() == NULL) { m_producerNotReady.wait(&m_mutex, 500 + 500 * i); } else break; } - if (baseclip->producer() == NULL) { + if (baseclip->getProducer() == NULL) { emit displayMessage(i18n("Cannot insert clip..."), ErrorMessage); m_mutex.unlock(); return; @@ -4171,27 +4175,37 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i void CustomTrackView::slotUpdateClip(const QString &clipId, bool reload) { + QMutexLocker locker(&m_mutex); QList list = scene()->items(); QList clipList; ClipItem *clip = NULL; + DocClipBase *baseClip = NULL; + Mlt::Tractor *tractor = m_document->renderer()->lockService(); for (int i = 0; i < list.size(); ++i) { if (list.at(i)->type() == AVWIDGET) { clip = static_cast (list.at(i)); if (clip->clipProducer() == clipId) { + if (baseClip == NULL) { + baseClip = clip->baseClip(); + } ItemInfo info = clip->info(); Mlt::Producer *prod = NULL; - if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track); - else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer(); - else prod = clip->baseClip()->producer(info.track); - if (reload && !m_document->renderer()->mltUpdateClip(info, clip->xml(), prod)) { + if (clip->isAudioOnly()) prod = baseClip->audioProducer(info.track); + else if (clip->isVideoOnly()) prod = baseClip->videoProducer(); + else prod = baseClip->getProducer(info.track); + if (reload && !m_document->renderer()->mltUpdateClip(tractor, info, clip->xml(), prod)) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage); } else clipList.append(clip); } } } + m_document->renderer()->unlockService(tractor); for (int i = 0; i < clipList.count(); i++) clipList.at(i)->refreshClip(true, true); + if (baseClip) { + baseClip->cleanupProducers(); + } } ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) @@ -5995,13 +6009,15 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, EffectsList ef clip->setSelected(true); ClipItem *audioClip = getClipItemAt(start, info.track); if (audioClip) { + Mlt::Tractor *tractor = m_document->renderer()->lockService(); clip->setVideoOnly(true); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer(info.track)) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer(info.track)) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, info.track), ErrorMessage); } + m_document->renderer()->unlockService(tractor); audioClip->setSelected(true); audioClip->setAudioOnly(true); @@ -6039,10 +6055,11 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, EffectsList ef ItemInfo info = clip->info(); deleteClip(clp->info()); clip->setVideoOnly(false); - - if (!m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, info.startPos.frames(m_document->fps()), clip->baseClip()->producer(info.track))) { + Mlt::Tractor *tractor = m_document->renderer()->lockService(); + if (!m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - info.track, info.startPos.frames(m_document->fps()), clip->baseClip()->getProducer(info.track))) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage); } + m_document->renderer()->unlockService(tractor); // re-add audio effects for (int i = 0; i < effects.count(); ++i) { @@ -6142,28 +6159,30 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool video kDebug() << "// Cannot find clip to split!!!"; return; } + Mlt::Tractor *tractor = m_document->renderer()->lockService(); if (videoOnly) { int start = pos.frames(m_document->fps()); clip->setVideoOnly(true); clip->setAudioOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } } else if (audioOnly) { int start = pos.frames(m_document->fps()); clip->setAudioOnly(true); clip->setVideoOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->audioProducer(track)) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->audioProducer(track)) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } } else { int start = pos.frames(m_document->fps()); clip->setAudioOnly(false); clip->setVideoOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track)) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->getProducer(track)) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } } + m_document->renderer()->unlockService(tractor); clip->update(); setDocumentModified(); }