From fa66a5ae12ef114f4918840c02f9b3dbb2155064 Mon Sep 17 00:00:00 2001 From: Marco Gittler Date: Tue, 18 Mar 2008 16:55:55 +0000 Subject: [PATCH] simplify the getImage methods in kthumb and use it in renderer (to fix random crash on startup) less debug in initeffect svn path=/branches/KDE4/; revision=2077 --- src/initeffects.cpp | 10 +++---- src/kthumb.cpp | 68 +++++++++++++++++++++++++++++---------------- src/kthumb.h | 3 +- src/renderer.cpp | 3 +- 4 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/initeffects.cpp b/src/initeffects.cpp index 81435b07..bbd82d27 100644 --- a/src/initeffects.cpp +++ b/src/initeffects.cpp @@ -329,7 +329,7 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, QDomDocument ret; Mlt::Properties *metadata = repository->metadata(filter_type, filtername.toAscii().data()); - kDebug() << filtername; + //kDebug() << filtername; if (metadata && metadata->is_valid()) { if (metadata->get("title") && metadata->get("identifier")) { QDomElement eff = ret.createElement("effect"); @@ -387,10 +387,10 @@ QDomDocument initEffects::createDescriptionFromMlt(Mlt::Repository* repository, ret.appendChild(eff); } } - QString outstr; - QTextStream str(&outstr); - ret.save(str, 2); - kDebug() << outstr; + /* QString outstr; + QTextStream str(&outstr); + ret.save(str, 2); + kDebug() << outstr;*/ return ret; } diff --git a/src/kthumb.cpp b/src/kthumb.cpp index ec137979..12b84032 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -154,7 +154,7 @@ KThumb::~KThumb() { //static QPixmap KThumb::getImage(KUrl url, int width, int height) { if (url.isEmpty()) return QPixmap(); - QPixmap pix(width, height); + /*QPixmap pix(width, height); kDebug() << "+++++++++++ GET THMB IMG FOR: " << url; char *tmp = Render::decodedString(url.path()); Mlt::Profile prof((char*) KdenliveSettings::current_profile().data()); @@ -180,51 +180,71 @@ QPixmap KThumb::getImage(KUrl url, int width, int height) { } else pix.fill(Qt::black); } if (m_frame) delete m_frame; - return pix; + return pix;*/ + return getImage(url, 0, width, height); } void KThumb::extractImage(int frame, int frame2) { if (m_url.isEmpty()) return; - QPixmap pix(m_width, m_height); + char *tmp = Render::decodedString(m_url.path()); Mlt::Producer m_producer(*m_profile, tmp); delete[] tmp; + QPixmap pix(m_width, m_height); if (m_producer.is_blank()) { + QPixmap pix(m_width, m_height); pix.fill(Qt::black); emit thumbReady(frame, pix); return; } - Mlt::Frame * m_frame; - mlt_image_format format = mlt_image_rgb24a; - Mlt::Filter m_convert(*m_profile, "avcolour_space"); - m_convert.set("forced", mlt_image_rgb24a); - m_producer.attach(m_convert); if (frame != -1) { - m_producer.seek(frame); - m_frame = m_producer.get_frame(); - if (m_frame && m_frame->is_valid()) { - uint8_t *thumb = m_frame->get_image(format, m_width, m_height); - QImage image(thumb, m_width, m_height, QImage::Format_ARGB32); - if (!image.isNull()) { - pix = pix.fromImage(image); - } else pix.fill(Qt::black); - } - if (m_frame) delete m_frame; + QPixmap pix = getFrame(&m_producer, frame, m_width, m_height); emit thumbReady(frame, pix); } - if (frame2 == -1) return; - m_producer.seek(frame2); - m_frame = m_producer.get_frame(); + if (frame2 != -1) { + QPixmap pix = getFrame(&m_producer, frame2, m_width, m_height); + emit thumbReady(frame2, pix); + } + +} + +QPixmap KThumb::getImage(KUrl url, int frame, int width, int height) { + Mlt::Profile profile((char*) KdenliveSettings::current_profile().data()); + QPixmap pix(width, height); + if (url.isEmpty()) return pix; + char *tmp = Render::decodedString(url.path()); + Mlt::Producer producer(profile, tmp); + delete[] tmp; + + if (producer.is_blank()) { + + pix.fill(Qt::black); + return pix; + } + return getFrame(&producer, frame, width, height); + +} + +QPixmap KThumb::getFrame(Mlt::Producer* producer, int frame, int width, int height) { + Mlt::Profile profile((char*) KdenliveSettings::current_profile().data()); + Mlt::Filter m_convert(profile, "avcolour_space"); + m_convert.set("forced", mlt_image_rgb24a); + producer->attach(m_convert); + + producer->seek(frame); + Mlt::Frame * m_frame = producer->get_frame(); + mlt_image_format format = mlt_image_rgb24a; + QPixmap pix(width, height); if (m_frame && m_frame->is_valid()) { - uint8_t *thumb = m_frame->get_image(format, m_width, m_height); - QImage image(thumb, m_width, m_height, QImage::Format_ARGB32); + uint8_t *thumb = m_frame->get_image(format, width, height); + QImage image(thumb, width, height, QImage::Format_ARGB32); if (!image.isNull()) { pix = pix.fromImage(image); } else pix.fill(Qt::black); } if (m_frame) delete m_frame; - emit thumbReady(frame2, pix); + return pix; } /* diff --git a/src/kthumb.h b/src/kthumb.h index a0255210..a8637e90 100644 --- a/src/kthumb.h +++ b/src/kthumb.h @@ -83,7 +83,8 @@ public slots: void stopAudioThumbs(); void removeAudioThumb(); void getAudioThumbs(int channel, double frame, double frameLength, int arrayWidth); - + static QPixmap getImage(KUrl url, int frame, int width, int height); + static QPixmap getFrame(Mlt::Producer* producer, int frame, int width, int height); protected: virtual void customEvent(QEvent * event); diff --git a/src/renderer.cpp b/src/renderer.cpp index c7b0c109..2ddad7c2 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -40,6 +40,7 @@ extern "C" { #include "renderer.h" #include "kdenlivesettings.h" +#include "kthumb.h" static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr) { // detect if the producer has finished playing. Is there a better way to do it ? @@ -402,7 +403,7 @@ void Render::getFileProperties(const QDomElement &xml, int clipId) { filePropertyMap["type"] = "video"; // Generate thumbnail for this frame - QPixmap pixmap = frameThumbnail(frame, width, height, true); + QPixmap pixmap = KThumb::getImage(url, 0, width, height); emit replyGetImage(clipId, 0, pixmap, width, height); -- 2.39.2