X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkthumb.cpp;h=86dcab93ecdc24cb67459d0181f35cecf560b691;hb=c6137d8358c60b7ad69171053272299dbdc483c1;hp=350f14f46bb8cf65b9fea30de5f14d06dc66039e;hpb=f24c4ea58a463f8934f16f9c2e25e3cde4fffa17;p=kdenlive diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 350f14f4..86dcab93 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -66,7 +66,7 @@ void KThumb::setProducer(Mlt::Producer *producer) if (m_producer) m_clipManager->stopThumbs(m_id); m_intraFramesQueue.clear(); m_intra.waitForFinished(); - m_mutex.lock(); + QMutexLocker lock(&m_mutex); m_producer = producer; // FIXME: the profile() call leaks an object, but trying to free // it leads to a double-free in Profile::~Profile() @@ -75,7 +75,6 @@ void KThumb::setProducer(Mlt::Producer *producer) m_dar = profile->dar(); m_ratio = (double) profile->width() / profile->height(); } - m_mutex.unlock(); } void KThumb::clearProducer() @@ -118,11 +117,18 @@ void KThumb::getThumb(int frame) const int theight = KdenliveSettings::trackheight(); const int swidth = (int)(theight * m_ratio + 0.5); const int dwidth = (int)(theight * m_dar + 0.5); - QImage img = getProducerFrame(frame, swidth, dwidth, theight); emit thumbReady(frame, img); } +void KThumb::getGenericThumb(int frame, int height, int type) +{ + const int swidth = (int)(height * m_ratio + 0.5); + const int dwidth = (int)(height * m_dar + 0.5); + QImage img = getProducerFrame(frame, swidth, dwidth, height); + m_clipManager->projectTreeThumbReady(m_id, frame, img, type); +} + QImage KThumb::extractImage(int frame, int width, int height) { if (m_producer == NULL) { @@ -139,9 +145,6 @@ QPixmap KThumb::getImage(KUrl url, int frame, int width, int height) Mlt::Profile profile(KdenliveSettings::current_profile().toUtf8().constData()); QPixmap pix(width, height); if (url.isEmpty()) return pix; - - //""); - //Mlt::Producer producer(profile, "xml-string", tmp); Mlt::Producer *producer = new Mlt::Producer(profile, url.path().toUtf8().constData()); double swidth = (double) profile.width() / profile.height(); pix = QPixmap::fromImage(getFrame(producer, frame, (int) (height * swidth + 0.5), width, height)); @@ -162,12 +165,14 @@ QImage KThumb::getProducerFrame(int framepos, int frameWidth, int displayWidth, p.fill(QColor(Qt::black).rgb()); return p; } - m_mutex.lock(); + QMutexLocker lock(&m_mutex); m_producer->seek(framepos); Mlt::Frame *frame = m_producer->get_frame(); + frame->set("rescale.interp", "nearest"); + frame->set("deinterlace_method", "onefield"); + frame->set("top_field_first", -1 ); QImage p = getFrame(frame, frameWidth, displayWidth, height); delete frame; - m_mutex.unlock(); return p; } @@ -187,6 +192,9 @@ QImage KThumb::getFrame(Mlt::Producer *producer, int framepos, int frameWidth, i producer->seek(framepos); Mlt::Frame *frame = producer->get_frame(); + frame->set("rescale.interp", "nearest"); + frame->set("deinterlace_method", "onefield"); + frame->set("top_field_first", -1 ); QImage p = getFrame(frame, frameWidth, displayWidth, height); delete frame; return p; @@ -201,17 +209,14 @@ QImage KThumb::getFrame(Mlt::Frame *frame, int frameWidth, int displayWidth, int p.fill(QColor(Qt::red).rgb()); return p; } - + int ow = frameWidth; int oh = height; mlt_image_format format = mlt_image_rgb24a; - frame->set("rescale.interp", "nearest"); - frame->set("deinterlace_method", "onefield"); - frame->set("top_field_first", -1 ); //frame->set("progressive", "1"); if (ow % 2 == 1) ow++; - const uchar* imagedata = frame->get_image(format, ow, oh); QImage image(ow, oh, QImage::Format_ARGB32_Premultiplied); + const uchar* imagedata = frame->get_image(format, ow, oh); memcpy(image.bits(), imagedata, ow * oh * 4);//.byteCount()); //const uchar* imagedata = frame->get_image(format, ow, oh);