53 Q_PROPERTY(QString logFile READ logFile WRITE setLogFile NOTIFY
logFileChanged)
54 Q_PROPERTY(QString imageDirectory READ imageDirectory WRITE setImageDirectory NOTIFY
imageDirectoryChanged)
55 Q_PROPERTY(QString saveDirectory READ saveDirectory WRITE setSaveDirectory NOTIFY
saveDirectoryChanged)
62 Q_PROPERTY(
double timeOffsetSecs READ timeOffsetSecs WRITE setTimeOffsetSecs NOTIFY
timeOffsetSecsChanged)
63 Q_PROPERTY(
double toleranceSecs READ toleranceSecs WRITE setToleranceSecs NOTIFY
toleranceSecsChanged)
64 Q_PROPERTY(
bool previewMode READ previewMode WRITE setPreviewMode NOTIFY
previewModeChanged)
65 Q_PROPERTY(
bool recursiveScan READ recursiveScan WRITE setRecursiveScan NOTIFY
recursiveScanChanged)
72 Q_INVOKABLE
void startTagging();
73 Q_INVOKABLE
void cancelTagging();
75 QString logFile()
const {
return _logFile; }
76 QString imageDirectory()
const {
return _imageDirectory; }
77 QString saveDirectory()
const {
return _saveDirectory; }
78 double progress()
const {
return _progress; }
79 bool inProgress()
const {
return _stage != Stage::Idle; }
80 QString errorMessage()
const {
return _errorMessage; }
81 int taggedCount()
const {
return _taggedCount; }
82 int skippedCount()
const {
return _skippedCount; }
83 int failedCount()
const {
return _failedCount; }
84 double timeOffsetSecs()
const {
return _timeOffsetSecs; }
85 double toleranceSecs()
const {
return _toleranceSecs; }
86 bool previewMode()
const {
return _previewMode; }
87 bool recursiveScan()
const {
return _recursiveScan; }
90 void setLogFile(
const QString &file);
91 void setImageDirectory(
const QString &dir);
92 void setSaveDirectory(
const QString &dir);
93 void setTimeOffsetSecs(
double offset);
94 void setToleranceSecs(
double tolerance);
95 void setPreviewMode(
bool preview);
96 void setRecursiveScan(
bool recursive);
123 static const char* stageName(Stage stage);
126 qint64 timestamp = 0;
127 QString errorMessage;
128 bool success =
false;
135 QGeoCoordinate coordinate;
136 bool success =
false;
144 bool previewMode =
false;
148 void _setErrorMessage(
const QString &errorMsg);
149 void _setProgress(
double progress);
150 void _transitionTo(Stage stage);
151 void _finishWithError(
const QString &errorMsg);
152 void _finishSuccess();
155 void _startLoadImages();
156 void _startParseExif();
157 void _startParseLogs();
158 void _startCalibrate();
159 void _startTagImages();
162 void _onExifProgress(
int value);
163 void _onExifFinished();
164 void _onTagProgress(
int value);
165 void _onTagFinished();
168 bool _loadImages(QString &errorMsg);
169 bool _parseLogs(QString &errorMsg);
170 bool _calibrate(QString &errorMsg);
171 bool _validateOutputDirectory(
const QString &outputDir, QString &errorMsg);
172 QList<TagTask> _buildTagTasks(
const QString &outputDir,
bool preview, QString &errorMsg);
173 qint64 _estimateOutputSize()
const;
175 ExifResult _parseExifForImage(
const QFileInfo &imageInfo);
176 TagResult _tagImage(
const TagTask &task);
179 QByteArray _readImageCached(
const QString &path, QString *
errorString =
nullptr);
180 void _evictUnmatchedImages();
181 void _clearImageCache();
185 QString _imageDirectory;
186 QString _saveDirectory;
187 QString _errorMessage;
188 double _progress = 0.;
189 int _taggedCount = 0;
190 int _skippedCount = 0;
191 int _failedCount = 0;
192 double _timeOffsetSecs = 0.0;
193 double _toleranceSecs = 2.0;
194 bool _previewMode =
false;
195 bool _recursiveScan =
false;
198 struct ProcessingState {
199 QFileInfoList imageList;
200 QList<qint64> imageTimestamps;
201 QList<GeoTagData> triggerList;
202 QList<int> imageIndices;
203 QList<int> triggerIndices;
204 int skippedCount = 0;
209 imageTimestamps.clear();
211 imageIndices.clear();
212 triggerIndices.clear();
219 Stage _stage = Stage::Idle;
220 std::atomic<bool> _cancel{
false};
221 QElapsedTimer _totalTimer;
222 QElapsedTimer _stageTimer;
225 QFutureWatcher<ExifResult> _exifWatcher;
226 QFutureWatcher<TagResult> _tagWatcher;
228 ProcessingState _state;
234 mutable QMutex _bufferMutex;
235 QHash<QString, QByteArray> _imageBuffers;
238 static constexpr double kLoadImagesEnd = 20.0;
239 static constexpr double kParseExifEnd = 40.0;
240 static constexpr double kParseLogsEnd = 60.0;
241 static constexpr double kCalibrateEnd = 80.0;
242 static constexpr double kTagImagesEnd = 100.0;