[Digikam-devel] [digikam] [Bug 338176] Face Recognition memory allocation crash application
Gilles Caulier
caulier.gilles at gmail.com
Mon Dec 15 12:51:50 GMT 2014
https://bugs.kde.org/show_bug.cgi?id=338176
--- Comment #28 from Gilles Caulier <caulier.gilles at gmail.com> ---
Git commit f6bcec9d07f0f6530835498370a6042f9b1e1675 by Marcel Wiesweg.
Committed on 14/11/2014 at 09:56.
Pushed by mwiesweg into branch 'master'.
Some fixes in face progress calculation
M +1 -0 utilities/facemanagement/facepipeline.cpp
M +2 -0 utilities/facemanagement/facepipeline.h
M +31 -14 utilities/maintenance/facedetector.cpp
http://commits.kde.org/digikam/f6bcec9d07f0f6530835498370a6042f9b1e1675
diff --git a/utilities/facemanagement/facepipeline.cpp
b/utilities/facemanagement/facepipeline.cpp
index a655385..d512a92 100644
--- a/utilities/facemanagement/facepipeline.cpp
+++ b/utilities/facemanagement/facepipeline.cpp
@@ -1171,6 +1171,7 @@ void
FacePipeline::Private::send(FacePipelineExtendedPackage::Ptr package)
{
start();
++totalPackagesAdded;
+ emit(q->processing(*package));
if (senderFlowControl(package))
{
diff --git a/utilities/facemanagement/facepipeline.h
b/utilities/facemanagement/facepipeline.h
index 4b381ca..45e733a 100644
--- a/utilities/facemanagement/facepipeline.h
+++ b/utilities/facemanagement/facepipeline.h
@@ -292,6 +292,8 @@ Q_SIGNALS:
/// Emitted when processing has started
void started(const QString& message);
+ /// Emitted when one package begins processing
+ void processing(const FacePipelinePackage& package);
/// Emitted when one package has finished processing
void processed(const FacePipelinePackage& package);
void progressValueChanged(float progress);
diff --git a/utilities/maintenance/facedetector.cpp
b/utilities/maintenance/facedetector.cpp
index 7bd8c0e..222652b 100644
--- a/utilities/maintenance/facedetector.cpp
+++ b/utilities/maintenance/facedetector.cpp
@@ -96,18 +96,27 @@ class FaceDetector::Private
public:
Private()
+ : benchmark(false),
+ total(0),
+ progressValue(0),
+ currentProgressChunk(0),
+ currentScheduled(0),
+ currentFinished(0)
{
- benchmark = false;
- total = 0;
}
- bool benchmark;
+ bool benchmark;
- int total;
+ int total;
- AlbumPointerList<> albumTodoList;
- ImageInfoJob albumListing;
- FacePipeline pipeline;
+ AlbumPointerList<> albumTodoList;
+ ImageInfoJob albumListing;
+ FacePipeline pipeline;
+ QMap<Album*,double> relativeProgressValue;
+ double progressValue;
+ double currentProgressChunk;
+ int currentScheduled;
+ int currentFinished;
};
FaceDetector::FaceDetector(const FaceScanSettings& settings, ProgressItem*
const parent)
@@ -275,25 +284,33 @@ void FaceDetector::slotStart()
QApplication::restoreOverrideCursor();
}
- d->total = 0;
-
+ // first, we use the relativeProgressValue map to store absolute counts
foreach(Album* const album, d->albumTodoList)
{
if (album->type() == Album::PHYSICAL)
{
- d->total += palbumCounts.value(album->id());
+ d->relativeProgressValue[album] = palbumCounts.value(album->id());
}
else
// this is possibly broken of course because we do not know if
images have multiple tags,
// but there's no better solution without expensive operation
{
- d->total += talbumCounts.value(album->id());
+ d->relativeProgressValue[album] = talbumCounts.value(album->id());
}
}
-
- kDebug() << "Total is" << d->total;
-
+ // second, calculate (approximate) overall sum
+ d->total = 0;
+ foreach (double count, d->relativeProgressValue)
+ {
+ d->total += (int)count;
+ }
d->total = qMax(1, d->total);
+ kDebug() << "Total is" << d->total;
+ // third, break absolute to relative values
+ for (QMap<Album*,double>::iterator it = d->relativeProgressValue.begin();
it != d->relativeProgressValue.end(); ++it)
+ {
+ it.value() /= double(d->total);
+ }
setUsesBusyIndicator(false);
setTotalItems(d->total);
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the Digikam-devel
mailing list