videocollection/videocollectionwrapper/src/videothumbnailfetcher.cpp
author hgs
Fri, 16 Apr 2010 18:13:14 +0300
changeset 36 8aed59de29f9
parent 34 bbb98528c666
child 20 b9e04db066d4
permissions -rw-r--r--
201015
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: VideoThumbnailFetcher class implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
36
hgs
parents: 34
diff changeset
    18
// Version : %version: %
hgs
parents: 34
diff changeset
    19
34
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include <qpixmap.h>
hgs
parents:
diff changeset
    22
#include <thumbnailmanager_qt.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "videothumbnailfetcher.h"
36
hgs
parents: 34
diff changeset
    25
#include "videocollectiontrace.h"
34
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    28
//
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    31
// VideoThumbnailFetcher::VideoThumbnailFetcher()
hgs
parents:
diff changeset
    32
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
//
36
hgs
parents: 34
diff changeset
    34
VideoThumbnailFetcher::VideoThumbnailFetcher() 
hgs
parents: 34
diff changeset
    35
    : mThumbnailManager( 0 )
hgs
parents: 34
diff changeset
    36
    , mPaused( false )
hgs
parents: 34
diff changeset
    37
    , mTbnCreationEnabled( true )
34
hgs
parents:
diff changeset
    38
{
36
hgs
parents: 34
diff changeset
    39
	FUNC_LOG;
34
hgs
parents:
diff changeset
    40
    mThumbnailManager = new ThumbnailManager();
hgs
parents:
diff changeset
    41
    mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium);
hgs
parents:
diff changeset
    42
    mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForPerformance);
hgs
parents:
diff changeset
    43
    mThumbnailManager->setMode(ThumbnailManager::CropToAspectRatio);
hgs
parents:
diff changeset
    44
    
hgs
parents:
diff changeset
    45
    connect(mThumbnailManager, SIGNAL(thumbnailReady( QPixmap , void * , int , int )),
hgs
parents:
diff changeset
    46
                this, SLOT(thumbnailReadySlot( QPixmap , void * , int , int )));
hgs
parents:
diff changeset
    47
}
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
// VideoThumbnailFetcher::~VideoThumbnailFetcher()
hgs
parents:
diff changeset
    51
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
//
hgs
parents:
diff changeset
    53
VideoThumbnailFetcher::~VideoThumbnailFetcher()
hgs
parents:
diff changeset
    54
{
36
hgs
parents: 34
diff changeset
    55
	FUNC_LOG;
34
hgs
parents:
diff changeset
    56
    cancelFetches();
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    disconnect(mThumbnailManager, SIGNAL(thumbnailReady( QPixmap , void * , int , int )),
hgs
parents:
diff changeset
    59
                this, SLOT(thumbnailReadySlot( QPixmap , void * , int , int )));
hgs
parents:
diff changeset
    60
    
hgs
parents:
diff changeset
    61
    delete mThumbnailManager;
hgs
parents:
diff changeset
    62
    mThumbnailManager = 0;
hgs
parents:
diff changeset
    63
}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
// VideoThumbnailFetcher::addFetch()
hgs
parents:
diff changeset
    67
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    68
//
hgs
parents:
diff changeset
    69
void VideoThumbnailFetcher::addFetch(const QString fileName, void *internal, int priority)
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    ThumbnailFetchData *fetch = new ThumbnailFetchData;
hgs
parents:
diff changeset
    72
    fetch->mFileName = fileName;
hgs
parents:
diff changeset
    73
    fetch->mInternal = internal;
hgs
parents:
diff changeset
    74
    fetch->mPriority = priority;
hgs
parents:
diff changeset
    75
    mFetchList.append(fetch);
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
// VideoThumbnailFetcher::continueFetching()
hgs
parents:
diff changeset
    80
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
//
hgs
parents:
diff changeset
    82
void VideoThumbnailFetcher::continueFetching()
hgs
parents:
diff changeset
    83
{
36
hgs
parents: 34
diff changeset
    84
	FUNC_LOG;
34
hgs
parents:
diff changeset
    85
    mPaused = false;
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    // First fetch all thumbnails that have been created already, next
hgs
parents:
diff changeset
    88
    // start thumbnail creation for one thumbnail at a time. 
hgs
parents:
diff changeset
    89
    if(!mFetchList.isEmpty())
hgs
parents:
diff changeset
    90
    {
hgs
parents:
diff changeset
    91
        startThumbnailFetches();
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
    else if(!mCreationList.isEmpty())
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
        startThumbnailCreation();
hgs
parents:
diff changeset
    96
    }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    // All thumbnails have been fetched, report it.
hgs
parents:
diff changeset
    99
    if(mFetchList.isEmpty() && mCreationList.isEmpty() && mStartedFetchList.isEmpty())
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
        emit allThumbnailsFetched();
hgs
parents:
diff changeset
   102
    }
hgs
parents:
diff changeset
   103
}
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
// VideoThumbnailFetcher::startThumbnailFetches()
hgs
parents:
diff changeset
   107
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   108
//
hgs
parents:
diff changeset
   109
void VideoThumbnailFetcher::startThumbnailFetches()
hgs
parents:
diff changeset
   110
{
36
hgs
parents: 34
diff changeset
   111
	FUNC_LOG;
34
hgs
parents:
diff changeset
   112
    if(!mThumbnailManager)
36
hgs
parents: 34
diff changeset
   113
    {
34
hgs
parents:
diff changeset
   114
        return;
36
hgs
parents: 34
diff changeset
   115
    }
34
hgs
parents:
diff changeset
   116
    
hgs
parents:
diff changeset
   117
    // Only fetch those thumbnails that are already been created.
hgs
parents:
diff changeset
   118
    mThumbnailManager->setMode(ThumbnailManager::DoNotCreate);
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    // Push all from thumbnail manager.
hgs
parents:
diff changeset
   121
    while(!mFetchList.isEmpty())
hgs
parents:
diff changeset
   122
    {
hgs
parents:
diff changeset
   123
        ThumbnailFetchData *fetch = mFetchList.takeFirst();
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
        int requestId = mThumbnailManager->getThumbnail(fetch->mFileName,
hgs
parents:
diff changeset
   126
               fetch->mInternal, fetch->mPriority);
hgs
parents:
diff changeset
   127
        
hgs
parents:
diff changeset
   128
        if(requestId != -1)
hgs
parents:
diff changeset
   129
        {
hgs
parents:
diff changeset
   130
            // Request succeed, add to list of started fetches.
hgs
parents:
diff changeset
   131
            mStartedFetchList.insert(requestId, fetch);
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
        else
hgs
parents:
diff changeset
   134
        {
hgs
parents:
diff changeset
   135
            // Request failed, free internal data.
hgs
parents:
diff changeset
   136
            delete fetch->mInternal;
hgs
parents:
diff changeset
   137
            delete fetch;
hgs
parents:
diff changeset
   138
        }
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
}
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   143
// VideoThumbnailFetcher::startThumbnailCreation()
hgs
parents:
diff changeset
   144
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   145
//
hgs
parents:
diff changeset
   146
void VideoThumbnailFetcher::startThumbnailCreation()
hgs
parents:
diff changeset
   147
{
36
hgs
parents: 34
diff changeset
   148
	FUNC_LOG;
34
hgs
parents:
diff changeset
   149
    if(!mThumbnailManager || !mTbnCreationEnabled)
36
hgs
parents: 34
diff changeset
   150
    {
34
hgs
parents:
diff changeset
   151
        return;
36
hgs
parents: 34
diff changeset
   152
    }
34
hgs
parents:
diff changeset
   153
    
hgs
parents:
diff changeset
   154
    mThumbnailManager->setMode(ThumbnailManager::CropToAspectRatio);
hgs
parents:
diff changeset
   155
    
hgs
parents:
diff changeset
   156
    // Do nothing if list is empty. 
hgs
parents:
diff changeset
   157
    if(mCreationList.isEmpty())
36
hgs
parents: 34
diff changeset
   158
    {
34
hgs
parents:
diff changeset
   159
        return;
36
hgs
parents: 34
diff changeset
   160
    }
34
hgs
parents:
diff changeset
   161
    
hgs
parents:
diff changeset
   162
    // Find fetch with highest priority. 
hgs
parents:
diff changeset
   163
    int highestPriority = 0;
hgs
parents:
diff changeset
   164
    int indexWithHighestPriority = 0;
hgs
parents:
diff changeset
   165
    
hgs
parents:
diff changeset
   166
    for(int i = 0; i < mCreationList.count(); i++)
hgs
parents:
diff changeset
   167
    {
hgs
parents:
diff changeset
   168
        if(mCreationList.at(i)->mPriority > highestPriority)
hgs
parents:
diff changeset
   169
        {
hgs
parents:
diff changeset
   170
            indexWithHighestPriority = i;
hgs
parents:
diff changeset
   171
            highestPriority = mCreationList.at(i)->mPriority;
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
    ThumbnailFetchData *fetch = mCreationList.takeAt(indexWithHighestPriority);
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    // Do request to thumbnail manager.
hgs
parents:
diff changeset
   178
    int requestId = mThumbnailManager->getThumbnail(fetch->mFileName,
hgs
parents:
diff changeset
   179
            fetch->mInternal, fetch->mPriority);
hgs
parents:
diff changeset
   180
    
hgs
parents:
diff changeset
   181
    // Request failed, free internal data.
hgs
parents:
diff changeset
   182
    if(requestId == -1)
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
        delete fetch->mInternal;
hgs
parents:
diff changeset
   185
        delete fetch;
hgs
parents:
diff changeset
   186
    }
hgs
parents:
diff changeset
   187
    else 
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
        // Don't keep track of fetches when creating thumbnails, if
hgs
parents:
diff changeset
   190
        // it fails with -1 it would be only tried to create again.  
hgs
parents:
diff changeset
   191
        delete fetch;
hgs
parents:
diff changeset
   192
    }
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   196
// VideoThumbnailFetcher::pauseFetching()
hgs
parents:
diff changeset
   197
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   198
//
hgs
parents:
diff changeset
   199
void VideoThumbnailFetcher::pauseFetching()
hgs
parents:
diff changeset
   200
{
36
hgs
parents: 34
diff changeset
   201
	FUNC_LOG;
34
hgs
parents:
diff changeset
   202
    mPaused = true;
hgs
parents:
diff changeset
   203
}
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   206
// VideoThumbnailFetcher::cancelFetches()
hgs
parents:
diff changeset
   207
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   208
//
hgs
parents:
diff changeset
   209
void VideoThumbnailFetcher::cancelFetches()
hgs
parents:
diff changeset
   210
{
36
hgs
parents: 34
diff changeset
   211
	FUNC_LOG;
34
hgs
parents:
diff changeset
   212
    // Clear list of started fetches, thumbnail manager has the internal 
hgs
parents:
diff changeset
   213
    // pointer.
hgs
parents:
diff changeset
   214
    QList<int> keys = mStartedFetchList.keys();
hgs
parents:
diff changeset
   215
    for(int i = 0; i < keys.count(); i++ )
hgs
parents:
diff changeset
   216
    {
hgs
parents:
diff changeset
   217
        delete mStartedFetchList.take(keys[i]);
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    // Merge lists and free data.
hgs
parents:
diff changeset
   221
    mFetchList.append(mCreationList);
hgs
parents:
diff changeset
   222
    mCreationList.clear();
hgs
parents:
diff changeset
   223
    while(!mFetchList.isEmpty())
hgs
parents:
diff changeset
   224
    {
hgs
parents:
diff changeset
   225
        ThumbnailFetchData *fetch = mFetchList.takeFirst();
hgs
parents:
diff changeset
   226
        delete fetch->mInternal;
hgs
parents:
diff changeset
   227
        delete fetch;
hgs
parents:
diff changeset
   228
    }
hgs
parents:
diff changeset
   229
}
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   232
// VideoThumbnailFetcher::fetchCount()
hgs
parents:
diff changeset
   233
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   234
//
hgs
parents:
diff changeset
   235
int VideoThumbnailFetcher::fetchCount()
hgs
parents:
diff changeset
   236
{
hgs
parents:
diff changeset
   237
    return mFetchList.count() + mCreationList.count() + mStartedFetchList.count();
hgs
parents:
diff changeset
   238
}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
// VideoThumbnailFetcher::enableThumbnailCreation()
hgs
parents:
diff changeset
   242
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   243
//
hgs
parents:
diff changeset
   244
void VideoThumbnailFetcher::enableThumbnailCreation(bool enable)
hgs
parents:
diff changeset
   245
{
36
hgs
parents: 34
diff changeset
   246
	FUNC_LOG;
34
hgs
parents:
diff changeset
   247
    mTbnCreationEnabled = enable;
hgs
parents:
diff changeset
   248
}
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   251
// VideoThumbnailFetcher::thumbnailReadySlot()
hgs
parents:
diff changeset
   252
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   253
//
hgs
parents:
diff changeset
   254
void VideoThumbnailFetcher::thumbnailReadySlot(QPixmap tnData, void *internal, int requestId, int error)
hgs
parents:
diff changeset
   255
{
hgs
parents:
diff changeset
   256
    // Thumbnail has not been generated yet, put it into creation list.
hgs
parents:
diff changeset
   257
    if(error == -1 && internal)
hgs
parents:
diff changeset
   258
    {
hgs
parents:
diff changeset
   259
        if(mStartedFetchList.contains(requestId))
hgs
parents:
diff changeset
   260
        {
hgs
parents:
diff changeset
   261
            ThumbnailFetchData *fetch = mStartedFetchList.take(requestId);
hgs
parents:
diff changeset
   262
            mCreationList.append(fetch);
hgs
parents:
diff changeset
   263
        }
hgs
parents:
diff changeset
   264
        else
hgs
parents:
diff changeset
   265
        {
hgs
parents:
diff changeset
   266
            // Fetch data was not found, meaning cancelFetches was called.
hgs
parents:
diff changeset
   267
            delete internal;
hgs
parents:
diff changeset
   268
        }
hgs
parents:
diff changeset
   269
    }
hgs
parents:
diff changeset
   270
    else
hgs
parents:
diff changeset
   271
    {
hgs
parents:
diff changeset
   272
        // Report that thumbnail was fetched.
hgs
parents:
diff changeset
   273
        emit thumbnailReady(tnData, internal, error);
hgs
parents:
diff changeset
   274
        
hgs
parents:
diff changeset
   275
        if(mStartedFetchList.contains(requestId))
36
hgs
parents: 34
diff changeset
   276
        {
34
hgs
parents:
diff changeset
   277
            delete mStartedFetchList.take(requestId);
36
hgs
parents: 34
diff changeset
   278
        }
34
hgs
parents:
diff changeset
   279
    }
hgs
parents:
diff changeset
   280
    
hgs
parents:
diff changeset
   281
    // Continue the fetching process.
hgs
parents:
diff changeset
   282
    if(!mPaused && mStartedFetchList.isEmpty())
36
hgs
parents: 34
diff changeset
   283
    {
34
hgs
parents:
diff changeset
   284
        continueFetching();
36
hgs
parents: 34
diff changeset
   285
    }
34
hgs
parents:
diff changeset
   286
}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
// End of file.