Skip to content

Commit

Permalink
Merge pull request #644 from Kicer86/crash_fix
Browse files Browse the repository at this point in the history
Fix for crash when loading new photos
  • Loading branch information
Kicer86 committed Jun 3, 2024
2 parents 011cafa + 6394524 commit 4352c4d
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 32 deletions.
8 changes: 3 additions & 5 deletions src/core/task_executor_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,14 @@ class CORE_EXPORT WorkState

// Helper function.
// Run a task and wait for it to be finished.
template<typename R, typename E, typename T>
template<typename E, typename T>
[[nodiscard]]
auto evaluate(E& executor, const T& task)
{
typedef std::packaged_task<R> PTask;

PTask p_task(task);
std::packaged_task p_task(task);

auto result_future = p_task.get_future();
ExecutorTraits<E, PTask>::exec(executor, std::move(p_task));
ExecutorTraits<E, decltype(p_task)>::exec(executor, std::move(p_task));

result_future.wait();

Expand Down
34 changes: 19 additions & 15 deletions src/database/database_tools/implementation/photos_analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,30 +37,32 @@ using namespace PhotosAnalyzerConsts;

namespace
{
void assignGeometry(IMediaInformation& mediaInfo, Photo::DataDelta& data)
// TODO: put some nice concept here which will detect if T is ExplicitDelta and has required fields
void assignGeometry(IMediaInformation& mediaInfo, auto& data)
{
const QString path = data.get<Photo::Field::Path>();
const QString path = data.template get<Photo::Field::Path>();
const auto info = mediaInfo.getInformation(path);

if (info.common.dimension.has_value())
{
data.insert<Photo::Field::Geometry>(info.common.dimension.value());
data.get<Photo::Field::Flags>()[Photo::FlagsE::GeometryLoaded] = GeometryFlagVersion;
data.template insert<Photo::Field::Geometry>(info.common.dimension.value());
data.template get<Photo::Field::Flags>()[Photo::FlagsE::GeometryLoaded] = GeometryFlagVersion;
}
else
throw std::make_pair(Database::CommonGeneralFlags::State, static_cast<int>(Database::CommonGeneralFlags::StateType::Broken));
}

void assignTags(IMediaInformation& mediaInfo, Photo::DataDelta& data)
// TODO: put some nice concept here which will detect if T is ExplicitDelta and has required fields
void assignTags(IMediaInformation& mediaInfo, auto& data)
{
auto& tags = data.get<Photo::Field::Tags>();
const auto path = data.get<Photo::Field::Path>();
auto& tags = data.template get<Photo::Field::Tags>();
const auto path = data.template get<Photo::Field::Path>();

// If media already has date or time update, do not override it.
// Just update ExifLoaded flag. It could be set to previous version, so bump it
if (tags.contains(Tag::Types::Date) || tags.contains(Tag::Types::Time))
{
data.get<Photo::Field::Flags>()[Photo::FlagsE::ExifLoaded] = ExifFlagVersion;
data.template get<Photo::Field::Flags>()[Photo::FlagsE::ExifLoaded] = ExifFlagVersion;
return;
}

Expand All @@ -73,15 +75,16 @@ namespace
tags[Tag::Types::Time] = info.common.creationTime->time();
}

data.get<Photo::Field::Flags>()[Photo::FlagsE::ExifLoaded] = ExifFlagVersion;
data.template get<Photo::Field::Flags>()[Photo::FlagsE::ExifLoaded] = ExifFlagVersion;
}

void assignPHash(Photo::DataDelta& data)
// TODO: put some nice concept here which will detect if T is ExplicitDelta and has required fields
void assignPHash(auto& data)
{
// based on:
// https://docs.opencv.org/3.4/d4/d93/group__img__hash.html

const QString path = data.get<Photo::Field::Path>();
const QString path = data.template get<Photo::Field::Path>();

// NOTE: cv::imread could be used here, however it would be better to have a unique mechanism
// of reading images, so if an image can be displayed in gui, then we also know how to
Expand Down Expand Up @@ -118,7 +121,7 @@ namespace
std::memcpy(rawPHash.data(), phashMat.datastart, DataSize);

Photo::PHashT phash(rawPHash);
data.insert<Photo::Field::PHash>(phash);
data.template insert<Photo::Field::PHash>(phash);
}
}
}
Expand All @@ -135,9 +138,10 @@ namespace

void perform() override
{
auto data = evaluate<Photo::DataDelta(Database::IBackend &)>(*m_storage, [this](Database::IBackend& backend)
auto data = evaluate(*m_storage, [this](Database::IBackend& backend)
{
return backend.getPhotoDelta<Photo::Field::Flags, Photo::Field::PHash>(m_id);
using namespace Photo;
return backend.getPhotoDelta<Field::Flags, Field::PHash, Field::Path, Field::Geometry, Field::Tags>(m_id);
});

std::vector<std::tuple<Photo::Id, QString, int>> bitsToSet;
Expand All @@ -155,7 +159,7 @@ namespace
if (data.get<Photo::Field::Flags>().at(Photo::FlagsE::ExifLoaded) < ExifFlagVersion)
assignTags(m_mediaInfo, data);

if (data.has(Photo::Field::PHash) == false)
if (data.get<Photo::Field::PHash>().valid() == false)
try
{
assignPHash(data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ std::vector<GroupCandidate> SeriesDetector::listCandidates(const Rules& rules) c
timer.start();

const std::deque<ExplicitDelta> candidates =
evaluate<std::deque<ExplicitDelta>(Database::IBackend &)>(m_db, [](Database::IBackend& backend)
evaluate(m_db, [](Database::IBackend& backend)
{
std::vector<GroupCandidate> result;

Expand Down
2 changes: 1 addition & 1 deletion src/database/explicit_photo_delta.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ namespace Photo
}

private:
template<typename Photo::Field... other>
template<typename Photo::Field...>
friend class ExplicitDelta;

DataDelta m_data;
Expand Down
2 changes: 1 addition & 1 deletion src/gui/desktop/quick_items/context_menu_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void ContextMenuManager::manageGroupsAction()
{
Database::IDatabase& db = m_project->getDatabase();

const std::vector<ExplicitDelta> groupMembers = evaluate<std::vector<ExplicitDelta>(Database::IBackend &)>(db, [this](Database::IBackend& backend)
const std::vector<ExplicitDelta> groupMembers = evaluate(db, [this](Database::IBackend& backend)
{
std::vector<ExplicitDelta> members;

Expand Down
10 changes: 5 additions & 5 deletions src/gui/desktop/utils/people_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ namespace

bool wasPhotoAnalyzedAndHasNoFaces(Database::IDatabase& db, const Photo::Id& ph_id)
{
return evaluate<bool(Database::IBackend &)>(db, [ph_id](Database::IBackend& backend)
return evaluate(db, [ph_id](Database::IBackend& backend)
{
const auto analysisState = backend.get(ph_id, FacesAnalysisState);

Expand All @@ -68,7 +68,7 @@ namespace

QString pathFor(Database::IDatabase& db, const Photo::Id& id)
{
return evaluate<QString(Database::IBackend &)>(db, [id](Database::IBackend& backend)
return evaluate(db, [id](Database::IBackend& backend)
{
auto photo = backend.getPhotoDelta(id, {Photo::Field::Path});

Expand Down Expand Up @@ -173,7 +173,7 @@ class Recognizer: public IRecognizePerson
{
typedef std::tuple<std::vector<Person::Fingerprint>, std::vector<Person::Id>> Result;

evaluate<void(Database::IBackend &)>(db, [this](Database::IBackend& backend)
evaluate(db, [this](Database::IBackend& backend)
{
std::vector<Person::Fingerprint> people_fingerprints;
std::vector<Person::Id> people;
Expand Down Expand Up @@ -238,7 +238,7 @@ FaceEditor::PeopleData FaceEditor::findFaces(const OrientedImage& image, const P
// photo not analyzed yet (no records in db) or analyzed and we have data in db
if (facesNotFound == false)
{
result = evaluate<FaceEditor::PeopleData(Database::IBackend &)>(m_db, [id](Database::IBackend& backend)
result = evaluate(m_db, [id](Database::IBackend& backend)
{
return backend.getPhotoDelta<Photo::Field::People>(id);
});
Expand All @@ -262,7 +262,7 @@ FaceEditor::PeopleData FaceEditor::findFaces(const OrientedImage& image, const P
else
{
// store face location and fingerprint in db and update ids
evaluate<void(Database::IBackend &)>(m_db, [&result](Database::IBackend& backend)
evaluate(m_db, [&result](Database::IBackend& backend)
{
backend.update({result});

Expand Down
4 changes: 2 additions & 2 deletions src/gui/desktop/utils/thumbnail_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void ThumbnailManager::fetch(const Photo::Id& id, const QSize& desired_size, con
QByteArray dbThumb;

if (m_db) // load thumbnail from db
dbThumb = evaluate<QByteArray(Database::IBackend &)>(*m_db, [id](Database::IBackend& backend)
dbThumb = evaluate(*m_db, [id](Database::IBackend& backend)
{
return backend.readBlob(id, BlobType);
});
Expand All @@ -78,7 +78,7 @@ void ThumbnailManager::fetch(const Photo::Id& id, const QSize& desired_size, con
if (dbThumb.isNull())
{
// load path to photo
const Photo::DataDelta photoData = evaluate<Photo::DataDelta(Database::IBackend &)>(*m_db, [id](Database::IBackend& backend)
const Photo::DataDelta photoData = evaluate(*m_db, [id](Database::IBackend& backend)
{
return backend.getPhotoDelta<Photo::Field::Path>(id);
});
Expand Down
2 changes: 1 addition & 1 deletion tr/photo_broom_en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@ Error code: %1</source>
<context>
<name>PhotosAnalyzerImpl</name>
<message>
<location filename="../src/database/database_tools/implementation/photos_analyzer.cpp" line="289"/>
<location filename="../src/database/database_tools/implementation/photos_analyzer.cpp" line="293"/>
<source>Extracting data from new photos</source>
<translation type="unfinished"></translation>
</message>
Expand Down
2 changes: 1 addition & 1 deletion tr/photo_broom_pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ Kod błędu: %1</translation>
<context>
<name>PhotosAnalyzerImpl</name>
<message>
<location filename="../src/database/database_tools/implementation/photos_analyzer.cpp" line="+289"/>
<location filename="../src/database/database_tools/implementation/photos_analyzer.cpp" line="+293"/>
<source>Extracting data from new photos</source>
<translatorcomment>Extracting data from new photos</translatorcomment>
<translation>Odczytywanie danych z nowych zdjęć</translation>
Expand Down

0 comments on commit 4352c4d

Please sign in to comment.