]> git.sesse.net Git - kdenlive/commitdiff
Fix possible crash on change clip speed:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 2 Mar 2009 10:03:41 +0000 (10:03 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 2 Mar 2009 10:03:41 +0000 (10:03 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=699

svn path=/branches/KDE4/; revision=3081

src/customtrackview.cpp
src/renderer.cpp

index 00cf0ac2d04b45d2cee9a33641f9858849f33ab1..f5d259a8cf1f729d56100629ba56a0d49eb2c24e 100644 (file)
@@ -2401,12 +2401,14 @@ void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const
     }
     info.track = m_document->tracksCount() - item->track();
     int endPos = m_document->renderer()->mltChangeClipSpeed(info, speed, oldspeed, baseclip->producer());
-    kDebug() << "//CH CLIP SPEED: " << speed << "x" << oldspeed << ", END POS: " << endPos;
-    item->setSpeed(speed);
-    item->updateRectGeometry();
-    if (item->cropDuration().frames(m_document->fps()) > endPos)
-        item->AbstractClipItem::resizeEnd(info.startPos.frames(m_document->fps()) + endPos, speed);
-    m_document->setModified(true);
+    if (endPos >= 0) {
+       item->setSpeed(speed);
+       item->updateRectGeometry();
+       if (item->cropDuration().frames(m_document->fps()) > endPos)
+           item->AbstractClipItem::resizeEnd(info.startPos.frames(m_document->fps()) + endPos, speed);
+       m_document->setModified(true);
+    }
+    else emit displayMessage(i18n("Invalid clip"), ErrorMessage);
 }
 
 void CustomTrackView::cutSelectedClips() {
index 5021b7aa9d093de2425f4b8e3dd4726e925067e9..df1431154abc1c84e914f97f88773c02f24afc32 100644 (file)
@@ -1639,7 +1639,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt
     int newLength = 0;
     Mlt::Service service(m_mltProducer->parent().get_service());
     if (service.type() != tractor_type) kWarning() << "// TRACTOR PROBLEM";
-    kDebug() << "Changing clip speed, set in and out: " << info.cropStart.frames(m_fps) << " to " << (info.endPos - info.startPos).frames(m_fps) - 1;
+    //kDebug() << "Changing clip speed, set in and out: " << info.cropStart.frames(m_fps) << " to " << (info.endPos - info.startPos).frames(m_fps) - 1;
     Mlt::Tractor tractor(service);
     Mlt::Producer trackProducer(tractor.track(info.track));
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
@@ -1648,12 +1648,21 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt
     int clipLength = trackPlaylist.clip_length(clipIndex);
 
     Mlt::Producer clip(trackPlaylist.get_clip(clipIndex));
-    QString serv = clip.parent().get("mlt_service");
-    QString id = clip.parent().get("id");
-    kDebug() << "CLIP SERVICE: " << clip.parent().get("mlt_service");
+    if (!clip.is_valid() || clip.is_blank()) {
+       // invalid clip
+       return -1;
+    }
+    Mlt::Producer clipparent = clip.parent();
+    if (!clipparent.is_valid() || clipparent.is_blank()) {
+       // invalid clip
+       return -1;
+    }
+    QString serv = clipparent.get("mlt_service");
+    QString id = clipparent.get("id");
+    //kDebug() << "CLIP SERVICE: " << serv;
     if (serv == "avformat" && speed != 1.0) {
         mlt_service_lock(service.get_service());
-        QString url = clip.parent().get("resource");
+        QString url = clipparent.get("resource");
         url.append("?" + QString::number(speed));
         Mlt::Producer *slowprod = m_slowmotionProducers.value(url);
         if (!slowprod || slowprod->get_producer() == NULL) {
@@ -1704,7 +1713,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt
 
     } else if (serv == "framebuffer") {
         mlt_service_lock(service.get_service());
-        QString url = clip.parent().get("resource");
+        QString url = clipparent.get("resource");
         url = url.section("?", 0, 0);
         url.append("?" + QString::number(speed));
         Mlt::Producer *slowprod = m_slowmotionProducers.value(url);