5#include <QtCore/QElapsedTimer>
6#include <QtCore/QFileInfo>
7#include <QtCore/QFileInfoList>
8#include <QtCore/QFutureWatcher>
11#include <QtCore/QMutex>
12#include <QtCore/QObject>
13#include <QtCore/QString>
14#include <QtPositioning/QGeoCoordinate>
15#include <QtQmlIntegration/QtQmlIntegration>
38 const QList<GeoTagData> &triggers,
39 qint64 timeOffsetSecs,
40 qint64 toleranceSecs);
53 Q_MOC_INCLUDE(
"GeoTagImageModel.h")
77 QString
logFile()
const {
return _logFile; }
81 bool inProgress()
const {
return _stage != Stage::Idle; }
125 static const char* stageName(Stage stage);
128 qint64 timestamp = 0;
129 QString errorMessage;
130 bool success =
false;
137 QGeoCoordinate coordinate;
138 bool success =
false;
146 bool previewMode =
false;
150 void _setErrorMessage(
const QString &errorMsg);
152 void _transitionTo(Stage stage);
153 void _finishWithError(
const QString &errorMsg);
154 void _finishSuccess();
157 void _startLoadImages();
158 void _startParseExif();
159 void _startParseLogs();
160 void _startCalibrate();
161 void _startTagImages();
164 void _onExifProgress(
int value);
165 void _onExifFinished();
166 void _onTagProgress(
int value);
167 void _onTagFinished();
170 bool _loadImages(QString &errorMsg);
171 bool _parseLogs(QString &errorMsg);
172 bool _calibrate(QString &errorMsg);
173 bool _validateOutputDirectory(
const QString &outputDir, QString &errorMsg);
174 QList<TagTask> _buildTagTasks(
const QString &outputDir,
bool preview, QString &errorMsg);
175 qint64 _estimateOutputSize()
const;
177 ExifResult _parseExifForImage(
const QFileInfo &imageInfo);
178 TagResult _tagImage(
const TagTask &task);
181 QByteArray _readImageCached(
const QString &path, QString *
errorString =
nullptr);
182 void _evictUnmatchedImages();
183 void _clearImageCache();
187 QString _imageDirectory;
188 QString _saveDirectory;
189 QString _errorMessage;
190 double _progress = 0.;
191 int _taggedCount = 0;
192 int _skippedCount = 0;
193 int _failedCount = 0;
194 double _timeOffsetSecs = 0.0;
195 double _toleranceSecs = 2.0;
196 bool _previewMode =
false;
197 bool _recursiveScan =
false;
200 struct ProcessingState {
201 QFileInfoList imageList;
202 QList<qint64> imageTimestamps;
203 QList<GeoTagData> triggerList;
204 QList<int> imageIndices;
205 QList<int> triggerIndices;
206 int skippedCount = 0;
211 imageTimestamps.clear();
213 imageIndices.clear();
214 triggerIndices.clear();
221 Stage _stage = Stage::Idle;
222 std::atomic<bool> _cancel{
false};
223 QElapsedTimer _totalTimer;
224 QElapsedTimer _stageTimer;
227 QFutureWatcher<ExifResult> _exifWatcher;
228 QFutureWatcher<TagResult> _tagWatcher;
230 ProcessingState _state;
236 mutable QMutex _bufferMutex;
237 QHash<QString, QByteArray> _imageBuffers;
240 static constexpr double kLoadImagesEnd = 20.0;
241 static constexpr double kParseExifEnd = 40.0;
242 static constexpr double kParseLogsEnd = 60.0;
243 static constexpr double kCalibrateEnd = 80.0;
244 static constexpr double kTagImagesEnd = 100.0;
Controller for GeoTagPage.qml. Supports geotagging images based on logfile camera tags.
QString imageDirectory() const
void setPreviewMode(bool preview)
double timeOffsetSecs() const
void setTimeOffsetSecs(double offset)
QString errorMessage() const
void setLogFile(const QString &file)
void recursiveScanChanged(bool recursiveScan)
void timeOffsetSecsChanged(double timeOffsetSecs)
void previewModeChanged(bool previewMode)
void saveDirectoryChanged(const QString &saveDirectory)
void imageDirectoryChanged(const QString &imageDirectory)
void setRecursiveScan(bool recursive)
bool recursiveScan() const
GeoTagImageModel * imageModel() const
Q_INVOKABLE void cancelTagging()
void toleranceSecsChanged(double toleranceSecs)
void progressChanged(double progress)
~GeoTagController() override
void logFileChanged(const QString &logFile)
QString saveDirectory() const
void errorMessageChanged(const QString &errorMessage)
double toleranceSecs() const
void taggingCompleteChanged()
void setImageDirectory(const QString &dir)
void setSaveDirectory(const QString &dir)
Q_INVOKABLE void startTagging()
void setToleranceSecs(double tolerance)
Model for displaying geotagging image status in QML.
CalibrationResult calibrate(const QList< qint64 > &imageTimestamps, const QList< GeoTagData > &triggers, qint64 timeOffsetSecs, qint64 toleranceSecs)
QString errorMessage(const QNetworkReply *reply)
Result of timestamp-based calibration/matching.
QList< int > imageIndices
Matched image indices (parallel with triggerIndices)
QList< int > triggerIndices
Matched trigger indices (parallel with imageIndices)
int skippedTriggers
Triggers skipped due to invalid data.
QList< int > unmatchedImages
Image indices with no matching trigger.