• Dmitry Kovalev's avatar
    Code cleanup. · 2891d70b
    Dmitry Kovalev authored
    Removing redundant code, introducing new functions for better
    decomposition, adding 'clamp' function to vp9_common.h.
    
    Change-Id: Ic3b8ca13bbc38f60f0c9c43910b5802005e31aaf
    2891d70b
lipiworker.cpp 5.83 KiB
/****************************************************************************
**
** Copyright (C) 2015 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://www.qt.io
**
** This file is part of the Qt Virtual Keyboard add-on for Qt Enterprise.
**
** Licensees holding valid Qt Enterprise licenses may use this file in
** accordance with the Qt Enterprise License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
** If you have questions regarding the use of this file, please use
** contact form at http://www.qt.io
****************************************************************************/
#include "lipiworker.h"
#include "virtualkeyboarddebug.h"
#include <QTime>
#include "LTKShapeRecognizer.h"
#include "LTKErrors.h"
void LipiLoadModelDataTask::run()
    VIRTUALKEYBOARD_DEBUG() << "LipiLoadModelDataTask::run()";
#ifdef QT_VIRTUALKEYBOARD_DEBUG
    QTime perf;
    perf.start();
#endif
    int result = shapeRecognizer->loadModelData();
#ifdef QT_VIRTUALKEYBOARD_DEBUG
    VIRTUALKEYBOARD_DEBUG() << "LipiLoadModelDataTask::run(): time:" << perf.elapsed() << "ms";
#endif
    if (result != SUCCESS)
        qWarning() << QString("Error %1: %2").arg(result).arg(getErrorMessage(result).c_str());
LipiRecognitionTask::LipiRecognitionTask(const LTKCaptureDevice& deviceInfo,
                                         const LTKScreenContext& screenContext,
                                         const vector<int>& inSubsetOfClasses,
                                         float confThreshold,
                                         int numChoices,
                                         int resultId) :
    LipiTask(),
    deviceInfo(deviceInfo),
    screenContext(screenContext),
    inSubsetOfClasses(inSubsetOfClasses),
    confThreshold(confThreshold),
    numChoices(numChoices),
    resultVector(new vector<LTKShapeRecoResult>()),
    _resultId(resultId),
    stateRunning(false),
    stateCancelled(false)
void LipiRecognitionTask::run()
    VIRTUALKEYBOARD_DEBUG() << "LipiRecognitionTask::run()";
    if (!shapeRecognizer || !resultVector)
        return;
        QMutexLocker stateGuard(&stateLock);
        stateRunning = true;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} resultVector->clear(); resultVector->reserve(numChoices); shapeRecognizer->setDeviceContext(deviceInfo); #ifdef QT_VIRTUALKEYBOARD_DEBUG QTime perf; perf.start(); #endif shapeRecognizer->recognize(traceGroup, screenContext, inSubsetOfClasses, confThreshold, numChoices, *resultVector); #ifdef QT_VIRTUALKEYBOARD_DEBUG int perfElapsed = perf.elapsed(); #endif { QMutexLocker stateGuard(&stateLock); stateRunning = false; if (stateCancelled) resultVector->clear(); #ifdef QT_VIRTUALKEYBOARD_DEBUG VIRTUALKEYBOARD_DEBUG() << "LipiRecognitionTask::run(): time:" << perfElapsed << "ms" << (stateCancelled ? "(cancelled)" : ""); #endif } } bool LipiRecognitionTask::cancelRecognition() { QMutexLocker stateGuard(&stateLock); stateCancelled = true; bool result = (stateRunning && shapeRecognizer); if (result) shapeRecognizer->requestCancelRecognition(); return result; } int LipiRecognitionTask::resultId() const { return _resultId; } LipiRecognitionResultsTask::LipiRecognitionResultsTask(QSharedPointer<vector<LTKShapeRecoResult> > resultVector, const QMap<int, QChar> &unicodeMap, int resultId) : LipiTask(), resultVector(resultVector), unicodeMap(unicodeMap), _resultId(resultId) { } void LipiRecognitionResultsTask::run() { if (!resultVector || unicodeMap.isEmpty()) return; QVariantList resultList; for (vector<LTKShapeRecoResult>::const_iterator i = resultVector->begin(); i != resultVector->end(); i++) { QVariantMap result; int shapeId = i->getShapeId(); result["resultId"] = _resultId; result["shapeId"] = shapeId; result["unicode"] = unicodeMap.value(shapeId); result["confidence"] = i->getConfidence(); resultList.append(result);
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
} if (resultList.isEmpty()) return; emit resultsAvailable(resultList); } LipiWorker::LipiWorker(LTKShapeRecognizer *shapeRecognizer, QObject *parent) : QThread(parent), taskSema(), taskLock(), shapeRecognizer(shapeRecognizer), abort(false) { } LipiWorker::~LipiWorker() { abort = true; taskSema.release(); wait(); if (shapeRecognizer) shapeRecognizer->unloadModelData(); } void LipiWorker::addTask(QSharedPointer<LipiTask> task) { if (task) { QMutexLocker guard(&taskLock); taskList.append(task); taskSema.release(); } } int LipiWorker::removeTask(QSharedPointer<LipiTask> task) { int count = 0; if (task) { QMutexLocker guard(&taskLock); count = taskList.removeAll(task); taskSema.acquire(qMin(count, taskSema.available())); } return count; } int LipiWorker::removeAllTasks() { QMutexLocker guard(&taskLock); int count = taskList.count(); taskList.clear(); if (taskSema.available()) taskSema.acquire(taskSema.available()); return count; } void LipiWorker::run() { while (!abort) { taskSema.acquire(); if (abort) break; QSharedPointer<LipiTask> currentTask; { QMutexLocker guard(&taskLock); if (!taskList.isEmpty()) { currentTask = taskList.front(); taskList.pop_front(); } }
211212213214215216217
if (currentTask) { currentTask->shapeRecognizer = shapeRecognizer; currentTask->run(); } } }