SVN commit 954938 by gulino: using qimage, starting phonon backend M +1 -1 CMakeLists.txt M +4 -3 mplayervideobackend.cpp M +31 -2 phononbackend.cpp M +12 -0 phononbackend.h M +11 -5 previewingfile.cpp M +3 -1 previewingfile.h M +10 -12 thumbnail.cpp M +5 -5 thumbnail.h M +7 -7 videopreview.cpp --- trunk/kdereview/mplayerthumbs/src/CMakeLists.txt #954937:954938 @@ -9,7 +9,7 @@ kde4_add_plugin(videopreview ${videopreview_PART_SRCS}) -target_link_libraries(videopreview ${KDE4_KIO_LIBS}) +target_link_libraries(videopreview ${KDE4_KIO_LIBS} ${PHONON_LIBRARY} ) install(TARGETS videopreview DESTINATION ${PLUGIN_INSTALL_DIR}) --- trunk/kdereview/mplayerthumbs/src/mplayervideobackend.cpp #954937:954938 @@ -89,7 +89,8 @@ kDebug(DBG_AREA) << "videopreview: No information found, exiting\n"; return false; } - previewingFile->setStreamInformation(findInfos.cap(1).toInt(), findInfos.cap(2).toInt() * 1000); + previewingFile->setTotalTime(findInfos.cap(2).toInt() * 1000); + previewingFile->setFPS(findInfos.cap(1).toInt()); kDebug(DBG_AREA) << "videopreview: find length=" << previewingFile->getMillisecondsLength() << " ms, fps=" << previewingFile->getFPS() << endl; return true; @@ -131,8 +132,8 @@ QString lastframe=QDir(tmpDirPath ).entryList( QStringList("*.jpg") ).last(); kDebug(DBG_AREA) << "videopreview: LastFrame==" << lastframe << endl; - QPixmap *retpix = new QPixmap(tmpDirPath.append( lastframe )); - return new Thumbnail(retpix, previewingFile); + QImage *retImage = new QImage(tmpDirPath.append( lastframe )); + return new Thumbnail(retImage, previewingFile); } --- trunk/kdereview/mplayerthumbs/src/phononbackend.cpp #954937:954938 @@ -20,15 +20,44 @@ #include "phononbackend.h" #include #include +#include +#include "previewingfile.h" +// #include +#include "thumbnail.h" + using namespace Phonon; + +// TODO: it seems that phonon MediaObject is not sync. +// How to handle stream information? + +PhononBackend::PhononBackend(PreviewingFile* previewingFile, MPlayerThumbsCfg* cfg) + : VideoBackendIFace(previewingFile, cfg) +{ + mediaObject=new MediaObject(previewingFile); + mediaObject->setCurrentSource(previewingFile->getFilePath()); + QObject::connect(mediaObject, SIGNAL(totalTimeChanged (qint64)), previewingFile, SLOT(setTotalTime(quint64 ))); +// videoWidget=new Experimental::VideoWidget(); +// videoWidget->setVisible(false); +// createPath(mediaObject, videoWidget); +} + +PhononBackend::~PhononBackend() { +// delete videoWidget; +} + + Thumbnail* PhononBackend::preview(FrameSelector *frameSelector) { - return NULL; + mediaObject->pause(); + mediaObject->seek(frameSelector->framePositionInMilliseconds(previewingFile)); +// return new Thumbnail(new QImage(videoWidget->snapshot()), previewingFile); } bool PhononBackend::readStreamInformation() { - return false; + // FPS unneeded, probably + previewingFile->setTotalTime(mediaObject->totalTime()); + return mediaObject->hasVideo(); } bool PhononBackend::playerCannotPreview() --- trunk/kdereview/mplayerthumbs/src/phononbackend.h #954937:954938 @@ -20,14 +20,26 @@ #ifndef PHONONBACKEND_H #define PHONONBACKEND_H #include "videobackendiface.h" +namespace Phonon { + class MediaObject; + namespace Experimental + { + class VideoWidget; + } +} class PhononBackend : public VideoBackendIFace { public: + PhononBackend(PreviewingFile *previewingFile, MPlayerThumbsCfg* cfg); + virtual ~PhononBackend(); virtual Thumbnail* preview (FrameSelector *frameSelector); virtual bool readStreamInformation (); protected: virtual bool playerCannotPreview (); +private: + Phonon::MediaObject *mediaObject; + Phonon::Experimental::VideoWidget *videoWidget; }; #endif // PHONONBACKEND_H --- trunk/kdereview/mplayerthumbs/src/previewingfile.cpp #954937:954938 @@ -60,11 +60,6 @@ return false; } -void PreviewingFile::setStreamInformation(unsigned int fps, quint64 millisecondsLength) { - d->fps=fps; - d->millisecondsLength=millisecondsLength; -} - Thumbnail* PreviewingFile::getPreview(VideoBackendIFace* videoBackend, uint minVariance, unsigned int maxTries) { kDebug() << "getPreview with minVariance: " << minVariance << " and max tries: " << maxTries << endl; ThumbnailsMap thumbnailsMap; @@ -106,6 +101,17 @@ return d->scalingWidth; } + + +void PreviewingFile::setTotalTime(quint64 totalTime) { + d->millisecondsLength=totalTime; +} + +void PreviewingFile::setFPS(unsigned int fps) { + d->fps=fps; +} + + #include "previewingfile.moc" --- trunk/kdereview/mplayerthumbs/src/previewingfile.h #954937:954938 @@ -31,7 +31,6 @@ PreviewingFile(const QString &filePath, uint scalingWidth, uint scalingHeight, QObject *parent = 0); ~PreviewingFile(); bool isBlacklisted(const QStringList &blacklistedExtensions); - void setStreamInformation(uint fps, quint64 millisecondsLength); quint64 getMillisecondsLength(); uint getFPS(); QString getFilePath() const; @@ -39,6 +38,9 @@ uint getScalingWidth(); uint getScalingHeight(); Thumbnail *getPreview(VideoBackendIFace *videoBackend, uint minVariance, uint maxTries); +public slots: + void setTotalTime(quint64 totalTime); + void setFPS(uint fps); private: PreviewingFilePrivate *d; --- trunk/kdereview/mplayerthumbs/src/thumbnail.cpp #954937:954938 @@ -19,25 +19,24 @@ #include "thumbnail.h" #include "constants.h" -#include #include #include #include -Thumbnail::Thumbnail(QPixmap* pixmap, QObject* parent) : +Thumbnail::Thumbnail(QImage* image, QObject* parent) : QObject(parent) { this->variance=0; - this->pixmap=pixmap; - if(pixmapIsValid() ) calculateVariance(); + this->image=image; + if(imageIsValid() ) calculateVariance(); } Thumbnail::~Thumbnail() { - delete pixmap; + delete image; } -bool Thumbnail::pixmapIsValid() { - return pixmap && ! pixmap->isNull(); +bool Thumbnail::imageIsValid() { + return image && ! image->isNull(); } @@ -45,20 +44,19 @@ return variance; } -QPixmap* Thumbnail::getPixmap() { - return pixmap; +QImage* Thumbnail::getImage() { + return image; } void Thumbnail::calculateVariance() { - QImage image = pixmap->toImage(); uint delta=0; uint avg=0; - uint bytes=image.numBytes(); + uint bytes=image->numBytes(); uint STEPS=bytes/2; QVarLengthArray pivot(STEPS); kDebug(DBG_AREA) << "Using " << STEPS << " steps\n"; - uchar *bits=image.bits(); + uchar *bits=image->bits(); // First pass: get pivots and taking average for( uint i=0; i -class QPixmap; +class QImage; class Thumbnail : public QObject { Q_OBJECT public: - explicit Thumbnail(QPixmap *pixmap, QObject *parent=0); + explicit Thumbnail(QImage *image, QObject *parent=0); ~Thumbnail(); uint getVariance(); - QPixmap *getPixmap(); - bool pixmapIsValid(); + QImage *getImage(); + bool imageIsValid(); private: void calculateVariance(); uint variance; - QPixmap *pixmap; + QImage *image; }; #endif // THUMBNAIL_H --- trunk/kdereview/mplayerthumbs/src/videopreview.cpp #954937:954938 @@ -71,32 +71,32 @@ } Thumbnail *thumbnail=previewingFile->getPreview(videoBackend, 40, 4); - if(!thumbnail || ! thumbnail->pixmapIsValid() ) return false; + if(!thumbnail || ! thumbnail->imageIsValid() ) return false; delete videoBackend; kDebug(DBG_AREA) << "got valid thumbnail, image variance: " << thumbnail->getVariance() << endl; /* From videocreator.cpp - xine_artsplugin Copyright (C) 2002 Simon MacMullen Copyright (C) 2003 Ewald Snel * */ - QPixmap *pix=thumbnail->getPixmap(); + QPixmap pix=QPixmap::fromImage(*(thumbnail->getImage())); if(cfg->createStrips() ) { - QPainter painter( pix ); + QPainter painter( &pix ); QPixmap sprocket; kDebug(DBG_AREA) << "videopreview: using strip image sprocket: " << KStandardDirs::locate( "data", "videothumbnail/sprocket-small.png" ) << endl; - if (pix->height() < 60) + if (pix.height() < 60) sprocket = QPixmap(KStandardDirs::locate( "data", "videothumbnail/sprocket-small.png" )); - else if (pix->height() < 90) + else if (pix.height() < 90) sprocket = QPixmap(KStandardDirs::locate( "data", "videothumbnail/sprocket-medium.png" )); else sprocket = QPixmap(KStandardDirs::locate( "data", "videothumbnail/sprocket-large.png" )); - for (int y = 0; y < pix->height() + sprocket.height(); y += sprocket.height()) { + for (int y = 0; y < pix.height() + sprocket.height(); y += sprocket.height()) { painter.drawPixmap( 0, y, sprocket ); } } // End of xine-artsplugin code - img = pix->toImage(); + img = pix.toImage(); return true; }