Skip to content

Commit

Permalink
Merge pull request xbmc#24331 from ksooo/video-versions-fix-thumbnail…
Browse files Browse the repository at this point in the history
…-load-perf

[video][dialogs] Video versions: Fix delay before "Convert to version" video select dialog opens
  • Loading branch information
ksooo authored Dec 27, 2023
2 parents fa125a3 + 01a6ecb commit 526f21f
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 84 deletions.
24 changes: 11 additions & 13 deletions xbmc/BackgroundInfoLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@

#include <mutex>

CBackgroundInfoLoader::CBackgroundInfoLoader() : m_thread (NULL)
{
m_bStop = true;
m_pObserver=NULL;
m_pProgressCallback=NULL;
m_pVecItems = NULL;
m_bIsLoading = false;
}
CBackgroundInfoLoader::CBackgroundInfoLoader() = default;

CBackgroundInfoLoader::~CBackgroundInfoLoader()
{
StopThread();
}

void CBackgroundInfoLoader::Reset()
{
m_pVecItems = nullptr;
m_vecItems.clear();
m_bIsLoading = false;
}

void CBackgroundInfoLoader::Run()
{
try
Expand Down Expand Up @@ -83,13 +83,13 @@ void CBackgroundInfoLoader::Run()
}

OnLoaderFinish();
m_bIsLoading = false;
}
catch (...)
{
m_bIsLoading = false;
CLog::Log(LOGERROR, "{} - Unhandled exception", __FUNCTION__);
}

Reset();
}

void CBackgroundInfoLoader::Load(CFileItemList& items)
Expand Down Expand Up @@ -129,9 +129,7 @@ void CBackgroundInfoLoader::StopThread()
delete m_thread;
m_thread = NULL;
}
m_vecItems.clear();
m_pVecItems = NULL;
m_bIsLoading = false;
Reset();
}

bool CBackgroundInfoLoader::IsLoading()
Expand Down
15 changes: 9 additions & 6 deletions xbmc/BackgroundInfoLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,18 @@ class CBackgroundInfoLoader : public IRunnable
virtual void OnLoaderStart() {}
virtual void OnLoaderFinish() {}

CFileItemList *m_pVecItems;
CFileItemList* m_pVecItems{nullptr};
std::vector<CFileItemPtr> m_vecItems; // FileItemList would delete the items and we only want to keep a reference.
CCriticalSection m_lock;

volatile bool m_bIsLoading;
volatile bool m_bStop;
CThread *m_thread;
volatile bool m_bIsLoading{false};
volatile bool m_bStop{true};
CThread* m_thread{nullptr};

IBackgroundLoaderObserver* m_pObserver;
IProgressCallback* m_pProgressCallback;
IBackgroundLoaderObserver* m_pObserver{nullptr};
IProgressCallback* m_pProgressCallback{nullptr};

private:
void Reset();
};

3 changes: 1 addition & 2 deletions xbmc/dialogs/GUIDialogSelect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,8 @@ int CGUIDialogSelect::Add(const CFileItem& item)

void CGUIDialogSelect::SetItems(const CFileItemList& pList)
{
// need to make internal copy of list to be sure dialog is owner of it
m_vecList->Clear();
m_vecList->Copy(pList);
m_vecList->Append(pList);

m_viewControl.SetItems(*m_vecList);
}
Expand Down
4 changes: 2 additions & 2 deletions xbmc/video/dialogs/GUIDialogVideoManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ void CGUIDialogVideoManager::Remove()

void CGUIDialogVideoManager::Rename()
{
const int idAsset{SelectVideoAsset(m_videoAsset)};
const int idAsset{ChooseVideoAsset(m_videoAsset)};
if (idAsset != -1)
{
//! @todo db refactor: should not be version, but asset
Expand Down Expand Up @@ -338,7 +338,7 @@ void CGUIDialogVideoManager::SetSelectedVideoAsset(const std::shared_ptr<CFileIt
UpdateControls();
}

int CGUIDialogVideoManager::SelectVideoAsset(const std::shared_ptr<CFileItem>& item)
int CGUIDialogVideoManager::ChooseVideoAsset(const std::shared_ptr<CFileItem>& item)
{
if (!item || !item->HasVideoInfoTag())
return -1;
Expand Down
2 changes: 1 addition & 1 deletion xbmc/video/dialogs/GUIDialogVideoManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class CGUIDialogVideoManager : public CGUIDialog

void UpdateControls();

static int SelectVideoAsset(const std::shared_ptr<CFileItem>& item);
static int ChooseVideoAsset(const std::shared_ptr<CFileItem>& item);

CVideoDatabase m_database;
std::shared_ptr<CFileItem> m_videoAsset;
Expand Down
109 changes: 49 additions & 60 deletions xbmc/video/dialogs/GUIDialogVideoManagerVersions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ void CGUIDialogVideoManagerVersions::AddVideoVersion()
CURL::GetRedacted(item.GetPath()));
}

const int idNewVideoVersion{SelectVideoAsset(m_videoAsset)};
const int idNewVideoVersion{ChooseVideoAsset(m_videoAsset)};
if (idNewVideoVersion != -1)
m_database.AddPrimaryVideoVersion(itemType, dbId, idNewVideoVersion, item);

Expand Down Expand Up @@ -372,6 +372,52 @@ int CGUIDialogVideoManagerVersions::ManageVideoVersionContextMenu(
return button;
}

bool CGUIDialogVideoManagerVersions::ChooseVideoAndConvertToVideoVersion(
CFileItemList& items,
VideoDbContentType itemType,
const std::string& mediaType,
int dbId,
CVideoDatabase& videoDb)
{
// choose a video
CGUIDialogSelect* dialog{CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(
WINDOW_DIALOG_SELECT)};
if (!dialog)
{
CLog::LogF(LOGERROR, "Unable to get WINDOW_DIALOG_SELECT instance!");
return {};
}

// Load thumbs async
CVideoThumbLoader loader;
loader.Load(items);

dialog->Reset();
dialog->SetItems(items);
dialog->SetHeading(CVariant{40002});
dialog->SetUseDetails(true);
dialog->Open();

if (loader.IsLoading())
loader.StopThread();

if (!dialog->IsConfirmed())
return false;

const std::shared_ptr<CFileItem> selectedItem{dialog->GetSelectedFileItem()};
if (!selectedItem)
return false;

// choose a video version for the video
const int idVideoVersion{ChooseVideoAsset(selectedItem)};
if (idVideoVersion < 0)
return false;

videoDb.ConvertVideoToVersion(itemType, dbId, selectedItem->GetVideoInfoTag()->m_iDbId,
idVideoVersion);
return true;
}

bool CGUIDialogVideoManagerVersions::ConvertVideoVersion(const std::shared_ptr<CFileItem>& item)
{
if (!item || !item->HasVideoInfoTag())
Expand Down Expand Up @@ -428,41 +474,12 @@ bool CGUIDialogVideoManagerVersions::ConvertVideoVersion(const std::shared_ptr<C
}

// decorate the items
CVideoThumbLoader loader;
for (const auto& item : list)
{
loader.LoadItem(item.get());
item->SetLabel2(item->GetVideoInfoTag()->m_strFileNameAndPath);
}

// choose the target video
CGUIDialogSelect* dialog{CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(
WINDOW_DIALOG_SELECT)};
if (!dialog)
{
CLog::LogF(LOGERROR, "Unable to get WINDOW_DIALOG_SELECT instance!");
return false;
}

dialog->Reset();
dialog->SetItems(list);
dialog->SetHeading(CVariant{40002});
dialog->SetUseDetails(true);
dialog->Open();

if (!dialog->IsConfirmed())
return false;

const std::shared_ptr<CFileItem> selectedItem{dialog->GetSelectedFileItem()};

// choose a video version
const int idVideoVersion{SelectVideoAsset(selectedItem)};
if (idVideoVersion < 0)
return false;

videodb.ConvertVideoToVersion(itemType, dbId, selectedItem->GetVideoInfoTag()->m_iDbId,
idVideoVersion);
return true;
return ChooseVideoAndConvertToVideoVersion(list, itemType, mediaType, dbId, videodb);
}

bool CGUIDialogVideoManagerVersions::ProcessVideoVersion(VideoDbContentType itemType, int dbId)
Expand Down Expand Up @@ -509,38 +526,10 @@ bool CGUIDialogVideoManagerVersions::ProcessVideoVersion(VideoDbContentType item
}

// decorate the items
CVideoThumbLoader loader;
for (const auto& item : list)
{
loader.LoadItem(item.get());
item->SetLabel2(item->GetVideoInfoTag()->m_strFileNameAndPath);
}

CGUIDialogSelect* dialog{CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(
WINDOW_DIALOG_SELECT)};
if (!dialog)
{
CLog::LogF(LOGERROR, "Unable to get WINDOW_DIALOG_SELECT instance!");
return false;
}

dialog->Reset();
dialog->SetItems(list);
dialog->SetHeading(CVariant{40002});
dialog->SetUseDetails(true);
dialog->Open();

if (!dialog->IsConfirmed())
return false;

const std::shared_ptr<CFileItem> selectedItem{dialog->GetSelectedFileItem()};

// choose a video version
const int idVideoVersion{SelectVideoAsset(selectedItem)};
if (idVideoVersion < 0)
return false;

videodb.ConvertVideoToVersion(itemType, dbId, selectedItem->GetVideoInfoTag()->m_iDbId,
idVideoVersion);
return true;
return ChooseVideoAndConvertToVideoVersion(list, itemType, mediaType, dbId, videodb);
}
6 changes: 6 additions & 0 deletions xbmc/video/dialogs/GUIDialogVideoManagerVersions.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,11 @@ class CGUIDialogVideoManagerVersions : public CGUIDialogVideoManager
void SetDefault();
void UpdateDefaultVideoVersionSelection();

static bool ChooseVideoAndConvertToVideoVersion(CFileItemList& items,
VideoDbContentType itemType,
const std::string& mediaType,
int dbId,
CVideoDatabase& videoDb);

std::shared_ptr<CFileItem> m_defaultVideoVersion;
};

0 comments on commit 526f21f

Please sign in to comment.