videocollection/videocollectionwrapper/src/videothumbnaildata_p.cpp
changeset 15 cf5481c2bc0b
child 17 69946d1824c4
equal deleted inserted replaced
2:dec420019252 15:cf5481c2bc0b
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  VideoThumbnailDataPrivate class implementation
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include <qapplication.h>
       
    20 #include <qpixmap.h>
       
    21 #include <qtimer.h>
       
    22 #include <mpxmediageneraldefs.h>
       
    23 #include <hbicon.h>
       
    24 
       
    25 #include <vcxmyvideosdefs.h>
       
    26 
       
    27 #include "videothumbnaildata_p.h"
       
    28 #include "videocollectionwrapper.h"
       
    29 #include "videosortfilterproxymodel.h"
       
    30 #include "videothumbnailfetcher.h"
       
    31 
       
    32 // Maximum thumbnails kept in memory.
       
    33 const int THUMBNAIL_CACHE_SIZE = 60;
       
    34 // Maximum of thumbnail fetches done at one background fetch round.
       
    35 const int THUMBNAIL_BACKGROUND_FETCH_AMOUNT = 20;
       
    36 // Milliseconds for the background fetch timer.
       
    37 const int THUMBNAIL_BACKGROUND_TIMEOUT = 100;
       
    38 // Milliseconds while thumbnail ready events are gathered before they 
       
    39 // are signaled.
       
    40 const int THUMBNAIL_READY_SIGNAL_TIMEOUT = 50;
       
    41 // Priority for background thumbnail fetches.
       
    42 const int BACKGROUND_FETCH_PRIORITY = 3000;
       
    43 
       
    44 /**
       
    45  * global qHash function required fo creating hash values for TMPXItemId -keys
       
    46  */
       
    47 inline uint qHash(TMPXItemId key) 
       
    48 { 
       
    49     QPair<uint, uint> keyPair(key.iId1, key.iId2); 
       
    50 
       
    51     return qHash(keyPair);
       
    52 }
       
    53 
       
    54 // ================= MEMBER FUNCTIONS =======================
       
    55 //
       
    56 
       
    57 // -----------------------------------------------------------------------------
       
    58 // VideoThumbnailDataPrivate::VideoThumbnailDataPrivate()
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 VideoThumbnailDataPrivate::VideoThumbnailDataPrivate() :
       
    62     mThumbnailFetcher(0),
       
    63     mCurrentModel(0),
       
    64     mCurrentFetchIndex(0),
       
    65     mCurrentBackgroundFetchCount(0),
       
    66     mBgFetchTimer(0),
       
    67     mTbnReportTimer(0),
       
    68     mSignalsConnected(false),
       
    69     mBackgroundFetchingEnabled(true)
       
    70 {
       
    71     initialize();
       
    72 }
       
    73 
       
    74 // -----------------------------------------------------------------------------
       
    75 // VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
       
    76 // -----------------------------------------------------------------------------
       
    77 //
       
    78 VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
       
    79 {
       
    80     cleanup();
       
    81 }
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // VideoThumbnailDataPrivate::initialize()
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 int VideoThumbnailDataPrivate::initialize()
       
    88 {
       
    89     mThumbnailData.setMaxCost(THUMBNAIL_CACHE_SIZE);
       
    90     
       
    91     if(!mThumbnailFetcher)
       
    92     {
       
    93         mThumbnailFetcher = new VideoThumbnailFetcher();        
       
    94     }
       
    95 
       
    96     if(!mBgFetchTimer)
       
    97     {
       
    98         mBgFetchTimer = new QTimer();
       
    99     }
       
   100     
       
   101     if(!mTbnReportTimer)
       
   102     {
       
   103         mTbnReportTimer = new QTimer();
       
   104     }
       
   105 
       
   106     if(connectSignals() < 0)
       
   107     {
       
   108         cleanup();
       
   109         return -1;
       
   110     }
       
   111     
       
   112     return 0;
       
   113 }
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // VideoThumbnailDataPrivate::cleanup()
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 void VideoThumbnailDataPrivate::cleanup()
       
   120 {
       
   121     disconnectSignals();
       
   122 
       
   123     delete mThumbnailFetcher;
       
   124     mThumbnailFetcher = 0;
       
   125     
       
   126     freeThumbnailData();
       
   127     
       
   128     if(mTbnReportTimer)
       
   129     {
       
   130         mTbnReportTimer->stop();
       
   131         delete mTbnReportTimer;
       
   132         mTbnReportTimer = 0;
       
   133     }
       
   134     
       
   135     if(mBgFetchTimer)
       
   136     {
       
   137         mBgFetchTimer->stop();
       
   138         delete mBgFetchTimer;
       
   139         mBgFetchTimer = 0;
       
   140     }
       
   141 }
       
   142 
       
   143 // -----------------------------------------------------------------------------
       
   144 // VideoThumbnailDataPrivate::disconnectSignals()
       
   145 // -----------------------------------------------------------------------------
       
   146 //
       
   147 void VideoThumbnailDataPrivate::disconnectSignals()
       
   148 {
       
   149     if(mSignalsConnected)
       
   150     {
       
   151         VideoSortFilterProxyModel *model = 
       
   152                 VideoCollectionWrapper::instance().getModel(VideoCollectionWrapper::EAllVideos);
       
   153         if(model)
       
   154             {
       
   155             disconnect(model->sourceModel(), SIGNAL(modelReady()), this, SLOT(modelChangedSlot()));
       
   156             disconnect(model->sourceModel(), SIGNAL(modelChanged()), this, SLOT(modelChangedSlot()));
       
   157             }
       
   158 		disconnect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , void *, int )),
       
   159                     this, SLOT(thumbnailReadySlot( QPixmap , void *, int )));
       
   160         disconnect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
       
   161                  this, SLOT(allThumbnailsFetchedSlot()));          
       
   162         disconnect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching()));
       
   163         disconnect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot()));
       
   164     }
       
   165     mSignalsConnected = false;
       
   166 }
       
   167 
       
   168 // -----------------------------------------------------------------------------
       
   169 // VideoThumbnailDataPrivate::connectSignals()
       
   170 // -----------------------------------------------------------------------------
       
   171 //
       
   172 int VideoThumbnailDataPrivate::connectSignals()
       
   173 {
       
   174     if(!mSignalsConnected)
       
   175     {
       
   176         VideoSortFilterProxyModel *model = 
       
   177                 VideoCollectionWrapper::instance().getModel(VideoCollectionWrapper::EAllVideos);
       
   178         if(!model)
       
   179             return -1;
       
   180         if(!connect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , void *, int )),
       
   181                     this, SLOT(thumbnailReadySlot( QPixmap , void *, int))) ||
       
   182             !connect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
       
   183                      this, SLOT(allThumbnailsFetchedSlot())) ||
       
   184            !connect(model->sourceModel(), SIGNAL(modelReady()), this, SLOT(modelChangedSlot())) ||
       
   185            !connect(model->sourceModel(), SIGNAL(modelChanged()), this, SLOT(modelChangedSlot())) ||
       
   186            !connect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching())) ||
       
   187            !connect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot())))
       
   188         {
       
   189             return -1;
       
   190         }
       
   191         
       
   192         QApplication *app = qApp;
       
   193         if(!connect(app, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuitSlot())))
       
   194         {
       
   195             return -1;
       
   196         }
       
   197         
       
   198         mSignalsConnected = true;
       
   199     }
       
   200     return 0;
       
   201 }
       
   202 
       
   203 // -----------------------------------------------------------------------------
       
   204 // VideoThumbnailDataPrivate::getThumbnail()
       
   205 // -----------------------------------------------------------------------------
       
   206 //
       
   207 const QIcon* VideoThumbnailDataPrivate::getThumbnail(TMPXItemId mediaId)
       
   208 {
       
   209     const QIcon *thumbnail = mThumbnailData[mediaId];
       
   210     if(!thumbnail)
       
   211     {
       
   212         return defaultThumbnail(mediaId);
       
   213     }
       
   214     return thumbnail;
       
   215 }
       
   216 
       
   217 // -----------------------------------------------------------------------------
       
   218 // VideoThumbnailDataPrivate::startFetchingThumbnails()
       
   219 // -----------------------------------------------------------------------------
       
   220 //
       
   221 int VideoThumbnailDataPrivate::startFetchingThumbnails(const QList<QModelIndex> &indexes, int priority)
       
   222 {
       
   223     if(!mCurrentModel || !mThumbnailFetcher)
       
   224     {
       
   225         return -1;
       
   226     }
       
   227     if(indexes.count() == 0)
       
   228     {
       
   229         return 0;
       
   230     }
       
   231     
       
   232     mThumbnailFetcher->pauseFetching();
       
   233 
       
   234     int fetchCountBefore = mThumbnailFetcher->fetchCount();
       
   235     
       
   236     // Fetch the thumbnails
       
   237     for(int i = 0; i < indexes.count(); i++)
       
   238     {
       
   239         startFetchingThumbnail(mCurrentModel->getMediaIdAtIndex(indexes[i]), priority--);
       
   240     }
       
   241     
       
   242     int started = mThumbnailFetcher->fetchCount() - fetchCountBefore;
       
   243     
       
   244     mThumbnailFetcher->continueFetching();
       
   245     
       
   246     return started;
       
   247 }
       
   248 
       
   249 // -----------------------------------------------------------------------------
       
   250 // VideoThumbnailDataPrivate::startFetchingThumbnail()
       
   251 // -----------------------------------------------------------------------------
       
   252 //
       
   253 int VideoThumbnailDataPrivate::startFetchingThumbnail(TMPXItemId mediaId, int priority)
       
   254 {
       
   255     if(!mCurrentModel || !mThumbnailFetcher)
       
   256     {
       
   257         return -1;
       
   258     }
       
   259 
       
   260     // Check that it's not fetched before.
       
   261     if(mThumbnailData.contains(mediaId))
       
   262     {
       
   263         return 0;
       
   264     }
       
   265 
       
   266     QString fileName = mCurrentModel->getMediaFilePathForId(mediaId);
       
   267     
       
   268     // object containing media id to be passed throught
       
   269     // thumbnail generation process.
       
   270     TMPXItemId *internal = new TMPXItemId(mediaId.iId1, mediaId.iId2);
       
   271     
       
   272     // Thumbnail fetcher signals into thumbnailReadySlot when thumbnail ready
       
   273     if(fileName.length() > 0)
       
   274     {
       
   275         mThumbnailFetcher->addFetch(fileName, internal, priority);
       
   276     }
       
   277 
       
   278     return 0;
       
   279 }
       
   280 
       
   281 // -----------------------------------------------------------------------------
       
   282 // VideoThumbnailDataPrivate::doBackgroundFetching()
       
   283 // -----------------------------------------------------------------------------
       
   284 //
       
   285 void VideoThumbnailDataPrivate::doBackgroundFetching()
       
   286 {
       
   287     if(!mCurrentModel || !mThumbnailFetcher)
       
   288     {
       
   289         return;
       
   290     }
       
   291 
       
   292     if(mCurrentBackgroundFetchCount >= THUMBNAIL_CACHE_SIZE)
       
   293     {
       
   294         return;
       
   295     }
       
   296     
       
   297     int maxIndex = mCurrentModel->rowCount();
       
   298     if(maxIndex == 0)
       
   299     {
       
   300         return;
       
   301     }
       
   302 
       
   303     // Delta to UI index where fetch has been done already.  
       
   304     int currentDelta = mCurrentBackgroundFetchCount/2;
       
   305     
       
   306     // How many will be fetched.  
       
   307     const int fetchAmount = THUMBNAIL_BACKGROUND_FETCH_AMOUNT/2;
       
   308 
       
   309     QList<QModelIndex> indexes;
       
   310 
       
   311     // Items after the current fetch index.
       
   312     int startIndex = mCurrentFetchIndex+currentDelta;
       
   313     int endIndex = mCurrentFetchIndex+currentDelta+fetchAmount;
       
   314     getModelIndexes(indexes, startIndex, endIndex);
       
   315 
       
   316     // Items before the current fetch index.
       
   317     startIndex = mCurrentFetchIndex-currentDelta-fetchAmount;
       
   318     endIndex = mCurrentFetchIndex-currentDelta;
       
   319     getModelIndexes(indexes, startIndex, endIndex);
       
   320     
       
   321     mCurrentBackgroundFetchCount += THUMBNAIL_BACKGROUND_FETCH_AMOUNT;
       
   322 
       
   323     int fetchesStarted = startFetchingThumbnails(indexes, BACKGROUND_FETCH_PRIORITY);
       
   324     
       
   325     // No thumbnails to fetch, start again.
       
   326     if(fetchesStarted == 0)
       
   327     {
       
   328         continueBackgroundFetch();
       
   329     }
       
   330 }
       
   331 
       
   332 // -----------------------------------------------------------------------------
       
   333 // VideoThumbnailDataPrivate::getModelIndexes()
       
   334 // -----------------------------------------------------------------------------
       
   335 //
       
   336 void VideoThumbnailDataPrivate::getModelIndexes(QList<QModelIndex> &indexes, int startIndex, int endIndex)
       
   337 {
       
   338     QModelIndex index;
       
   339     for(int i = startIndex; i < endIndex; i++)
       
   340     {
       
   341         if(i >= 0)
       
   342         {
       
   343             index = mCurrentModel->index(i, 0);
       
   344             if(index.isValid())
       
   345             {
       
   346                 indexes.append(index);
       
   347             }
       
   348         }
       
   349     }
       
   350 }
       
   351 
       
   352 // -----------------------------------------------------------------------------
       
   353 // VideoThumbnailDataPrivate::thumbnailReadySlot()
       
   354 // -----------------------------------------------------------------------------
       
   355 //
       
   356 void VideoThumbnailDataPrivate::thumbnailReadySlot(QPixmap tnData, void *internal, int error)
       
   357 {
       
   358     TMPXItemId mediaId(0, 0);
       
   359     if(internal)
       
   360     {
       
   361         mediaId = *(static_cast<TMPXItemId*>(internal));
       
   362         delete internal;
       
   363     }
       
   364     else
       
   365     {
       
   366         return;
       
   367     }
       
   368 
       
   369     if(!error && !tnData.isNull())
       
   370     {
       
   371         mThumbnailData.insert(mediaId, new QIcon(tnData));
       
   372         
       
   373         // Gather list of media ids and emit thumbnailReady signals in larger set
       
   374         // when timer goes off.
       
   375         if(mTbnReportTimer && !mTbnReportTimer->isActive())
       
   376         {
       
   377             mTbnReportTimer->setSingleShot(true);
       
   378             mTbnReportTimer->start(THUMBNAIL_READY_SIGNAL_TIMEOUT);
       
   379         }
       
   380 
       
   381         // Save the media id for the signal.  
       
   382         mReadyThumbnailMediaIds.append(mediaId);
       
   383     }
       
   384 }
       
   385 
       
   386 // -----------------------------------------------------------------------------
       
   387 // VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
       
   388 // -----------------------------------------------------------------------------
       
   389 //
       
   390 void VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
       
   391 {
       
   392     emit thumbnailsFetched(mReadyThumbnailMediaIds);
       
   393     mReadyThumbnailMediaIds.clear();
       
   394 }
       
   395 
       
   396 // -----------------------------------------------------------------------------
       
   397 // VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
       
   398 // -----------------------------------------------------------------------------
       
   399 //
       
   400 void VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
       
   401 {
       
   402     continueBackgroundFetch();
       
   403 }
       
   404 
       
   405 // -----------------------------------------------------------------------------
       
   406 // VideoThumbnailDataPrivate::modelChangedSlot()
       
   407 // -----------------------------------------------------------------------------
       
   408 //
       
   409 void VideoThumbnailDataPrivate::modelChangedSlot()
       
   410 {
       
   411     startBackgroundFetching(mCurrentModel, mCurrentFetchIndex);
       
   412 }
       
   413 
       
   414 // -----------------------------------------------------------------------------
       
   415 // VideoThumbnailDataPrivate::defaultThumbnail()
       
   416 // -----------------------------------------------------------------------------
       
   417 //
       
   418 const QIcon* VideoThumbnailDataPrivate::defaultThumbnail(TMPXItemId mediaId)
       
   419 {
       
   420     const TMPXItemId defaultIdVideo(KMaxTUint32-1, KVcxMvcMediaTypeVideo);
       
   421     const TMPXItemId defaultIdAlbum(KMaxTUint32-1, KVcxMvcMediaTypeAlbum);
       
   422     const TMPXItemId defaultIdDownloads(KVcxMvcCategoryIdDownloads, KVcxMvcMediaTypeCategory);
       
   423     const TMPXItemId defaultIdCaptured(KVcxMvcCategoryIdCaptured, KVcxMvcMediaTypeCategory);
       
   424 
       
   425     // Default thumbnail for video
       
   426     if(mediaId.iId2 == KVcxMvcMediaTypeVideo) 
       
   427     {
       
   428         if(!mDefaultThumbnails.contains(defaultIdVideo))
       
   429         {
       
   430             mDefaultThumbnails[defaultIdVideo] = HbIcon(":/icons/default_thumbnail_video.svg");
       
   431         }
       
   432         return &mDefaultThumbnails[defaultIdVideo].qicon();
       
   433     }
       
   434     else
       
   435     {
       
   436         // Default thumbnail for user defined album.
       
   437         if(mediaId.iId2 == KVcxMvcMediaTypeAlbum)
       
   438         {
       
   439             if(!mDefaultThumbnails.contains(defaultIdAlbum))
       
   440             {
       
   441                 mDefaultThumbnails[defaultIdAlbum] = HbIcon(":/icons/default_thumbnail_collection.svg");
       
   442             }
       
   443             return &mDefaultThumbnails[defaultIdAlbum].qicon();
       
   444         }
       
   445 
       
   446         // Thumbnails for default collections.
       
   447         switch(mediaId.iId1)
       
   448         {
       
   449             case KVcxMvcCategoryIdDownloads:
       
   450             {
       
   451                 if(!mDefaultThumbnails.contains(defaultIdDownloads))
       
   452                 {
       
   453                     mDefaultThumbnails[defaultIdDownloads] = HbIcon("qtg_large_video_download");
       
   454                 }
       
   455                 return &mDefaultThumbnails[defaultIdDownloads].qicon();
       
   456             }
       
   457             
       
   458             case KVcxMvcCategoryIdCaptured:
       
   459             {
       
   460                 if(!mDefaultThumbnails.contains(defaultIdCaptured))
       
   461                 {
       
   462                     mDefaultThumbnails[defaultIdCaptured] = HbIcon("qtg_large_video_capture");
       
   463                 }
       
   464                 return &mDefaultThumbnails[defaultIdCaptured].qicon();
       
   465             }
       
   466 
       
   467             default:
       
   468             {
       
   469                 if(!mDefaultThumbnails.contains(defaultIdAlbum))
       
   470                 {
       
   471                     mDefaultThumbnails[defaultIdAlbum] = HbIcon(":/icons/default_thumbnail_collection.svg");
       
   472                 }
       
   473                 return &mDefaultThumbnails[defaultIdAlbum].qicon();
       
   474             }
       
   475         }
       
   476     }
       
   477 }
       
   478 
       
   479 // -----------------------------------------------------------------------------
       
   480 // VideoThumbnailDataPrivate::removeThumbnail()
       
   481 // -----------------------------------------------------------------------------
       
   482 //
       
   483 bool VideoThumbnailDataPrivate::removeThumbnail(TMPXItemId mediaId)
       
   484 {
       
   485     return mThumbnailData.remove(mediaId);
       
   486 }
       
   487 
       
   488 // -----------------------------------------------------------------------------
       
   489 // VideoThumbnailDataPrivate::enableBackgroundFetching()
       
   490 // -----------------------------------------------------------------------------
       
   491 //
       
   492 void VideoThumbnailDataPrivate::enableBackgroundFetching(bool enable)
       
   493 {
       
   494     mBackgroundFetchingEnabled = enable;
       
   495     startBackgroundFetching(mCurrentModel, 0);
       
   496 }
       
   497 
       
   498 // -----------------------------------------------------------------------------
       
   499 // VideoThumbnailDataPrivate::enableThumbnailCreation()
       
   500 // -----------------------------------------------------------------------------
       
   501 //
       
   502 void VideoThumbnailDataPrivate::enableThumbnailCreation(bool enable)
       
   503 {
       
   504     if(mThumbnailFetcher)
       
   505         mThumbnailFetcher->enableThumbnailCreation(enable);
       
   506 }
       
   507 
       
   508 // -----------------------------------------------------------------------------
       
   509 // VideoThumbnailDataPrivate::freeThumbnailData()
       
   510 // -----------------------------------------------------------------------------
       
   511 //
       
   512 void VideoThumbnailDataPrivate::freeThumbnailData()
       
   513 {
       
   514     // Stop timers.
       
   515     if(mBgFetchTimer)
       
   516         mBgFetchTimer->stop();
       
   517     
       
   518     if(mTbnReportTimer)
       
   519         mTbnReportTimer->stop();
       
   520 
       
   521     if(mThumbnailFetcher)
       
   522         mThumbnailFetcher->cancelFetches();
       
   523     
       
   524     // Clear data.
       
   525     mReadyThumbnailMediaIds.clear();
       
   526     mThumbnailData.clear();
       
   527     mDefaultThumbnails.clear();
       
   528 }
       
   529 
       
   530 // -----------------------------------------------------------------------------
       
   531 // VideoThumbnailDataPrivate::startBackgroundFetching()
       
   532 // -----------------------------------------------------------------------------
       
   533 //
       
   534 void VideoThumbnailDataPrivate::startBackgroundFetching(VideoSortFilterProxyModel *model, int fetchIndex)
       
   535 {
       
   536     if(!mBackgroundFetchingEnabled || !mThumbnailFetcher)
       
   537         return;
       
   538     
       
   539     mThumbnailFetcher->cancelFetches();
       
   540     
       
   541     // If model is null, we continue using the current one. 
       
   542     if(model)
       
   543         mCurrentModel = model;
       
   544     
       
   545     mCurrentFetchIndex = fetchIndex;
       
   546     mCurrentBackgroundFetchCount = 0;
       
   547     doBackgroundFetching();
       
   548 }
       
   549 
       
   550 // -----------------------------------------------------------------------------
       
   551 // VideoThumbnailDataPrivate::continueBackgroundFetch()
       
   552 // -----------------------------------------------------------------------------
       
   553 //
       
   554 void VideoThumbnailDataPrivate::continueBackgroundFetch()
       
   555 {
       
   556     if(!mBackgroundFetchingEnabled)
       
   557         return;
       
   558 
       
   559     if(mBgFetchTimer)
       
   560     {
       
   561         mBgFetchTimer->stop();
       
   562         mBgFetchTimer->setSingleShot(true);
       
   563         mBgFetchTimer->start(THUMBNAIL_BACKGROUND_TIMEOUT);
       
   564     }
       
   565 }
       
   566 
       
   567 // -----------------------------------------------------------------------------
       
   568 // VideoThumbnailDataPrivate::aboutToQuitSlot()
       
   569 // -----------------------------------------------------------------------------
       
   570 //
       
   571 void VideoThumbnailDataPrivate::aboutToQuitSlot()
       
   572 {
       
   573     cleanup();
       
   574 }
       
   575 
       
   576 // End of file