Skip to content

Commit

Permalink
WIP A/B playback sync
Browse files Browse the repository at this point in the history
  • Loading branch information
darbyjohnston committed Mar 8, 2024
1 parent 36e09cc commit 41df516
Show file tree
Hide file tree
Showing 10 changed files with 330 additions and 139 deletions.
54 changes: 37 additions & 17 deletions lib/tlPlayApp/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,16 +489,7 @@ namespace tl
p.filesModel->observeLayers(),
[this](const std::vector<int>& value)
{
//! \todo AB
/*for (size_t i = 0; i < value.size() && i < _p->timelines.size(); ++i)
{
if (auto timeline = _p->timelines[i])
{
auto ioOptions = _getIOOptions();
ioOptions["Layer"] = string::Format("{0}").arg(value[i]);
timeline->setIOOptions(ioOptions);
}
}*/
_layersUpdate(value);
});
p.compareTimeObserver = observer::ValueObserver<timeline::CompareTimeMode>::create(
p.filesModel->observeCompareTime(),
Expand Down Expand Up @@ -912,19 +903,19 @@ namespace tl
p.timelines = timelines;
}

void App::_activeUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >& files)
void App::_activeUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >& activeFiles)
{
TLRENDER_P();
std::shared_ptr<timeline::Player> player;
if (!files.empty())
if (!activeFiles.empty())
{
if (!p.activeFiles.empty() && files[0] == p.activeFiles[0])
if (!p.activeFiles.empty() && activeFiles[0] == p.activeFiles[0])
{
player = p.player->get();
}
else
{
auto i = std::find(p.files.begin(), p.files.end(), files[0]);
auto i = std::find(p.files.begin(), p.files.end(), activeFiles[0]);
if (i != p.files.end())
{
try
Expand All @@ -949,9 +940,9 @@ namespace tl
if (player)
{
std::vector<std::shared_ptr<timeline::Timeline> > compare;
for (size_t i = 1; i < files.size(); ++i)
for (size_t i = 1; i < activeFiles.size(); ++i)
{
auto j = std::find(p.files.begin(), p.files.end(), files[i]);
auto j = std::find(p.files.begin(), p.files.end(), activeFiles[i]);
if (j != p.files.end())
{
auto timeline = p.timelines[j - p.files.begin()];
Expand All @@ -962,16 +953,45 @@ namespace tl
player->setCompareTime(p.filesModel->getCompareTime());
}

p.activeFiles = files;
p.activeFiles = activeFiles;
p.player->setIfChanged(player);
#if defined(TLRENDER_BMD)
p.bmdOutputDevice->setPlayer(player);
#endif // TLRENDER_BMD

_layersUpdate(p.filesModel->observeLayers()->get());
_cacheUpdate();
_audioUpdate();
}

void App::_layersUpdate(const std::vector<int>& value)
{
TLRENDER_P();
if (auto player = p.player->get())
{
int videoLayer = 0;
std::vector<int> compareVideoLayers;
if (!value.empty() && value.size() == p.files.size() && !p.activeFiles.empty())
{
auto i = std::find(p.files.begin(), p.files.end(), p.activeFiles.front());
if (i != p.files.end())
{
videoLayer = value[i - p.files.begin()];
}
for (size_t j = 1; j < p.activeFiles.size(); ++j)
{
i = std::find(p.files.begin(), p.files.end(), p.activeFiles[j]);
if (i != p.files.end())
{
compareVideoLayers.push_back(value[i - p.files.begin()]);
}
}
}
player->setVideoLayer(videoLayer);
player->setCompareVideoLayers(compareVideoLayers);
}
}

void App::_cacheUpdate()
{
TLRENDER_P();
Expand Down
1 change: 1 addition & 0 deletions lib/tlPlayApp/App.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ namespace tl
void _settingsUpdate(const std::string&);
void _filesUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >&);
void _activeUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >&);
void _layersUpdate(const std::vector<int>&);
void _cacheUpdate();
void _viewUpdate(const math::Vector2i& pos, double zoom, bool frame);
void _audioUpdate();
Expand Down
54 changes: 37 additions & 17 deletions lib/tlPlayQtApp/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -495,16 +495,7 @@ namespace tl
p.filesModel->observeLayers(),
[this](const std::vector<int>& value)
{
//! \todo AB
/*for (size_t i = 0; i < value.size() && i < _p->players.size(); ++i)
{
if (_p->players[i])
{
io::Options ioOptions;
ioOptions["Layer"] = string::Format("{0}").arg(value[i]);
_p->players[i]->setIOOptions(ioOptions);
}
}*/
_layersUpdate(value);
});
p.compareTimeObserver = observer::ValueObserver<timeline::CompareTimeMode>::create(
p.filesModel->observeCompareTime(),
Expand Down Expand Up @@ -922,20 +913,20 @@ namespace tl
p.timelines = timelines;
}

void App::_activeUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >& files)
void App::_activeUpdate(const std::vector<std::shared_ptr<play::FilesModelItem> >& activeFiles)
{
TLRENDER_P();

QSharedPointer<qt::TimelinePlayer> player;
if (!files.empty())
if (!activeFiles.empty())
{
if (!p.activeFiles.empty() && files[0] == p.activeFiles[0])
if (!p.activeFiles.empty() && activeFiles[0] == p.activeFiles[0])
{
player = p.player;
}
else
{
auto i = std::find(p.files.begin(), p.files.end(), files[0]);
auto i = std::find(p.files.begin(), p.files.end(), activeFiles[0]);
if (i != p.files.end())
{
try
Expand Down Expand Up @@ -963,9 +954,9 @@ namespace tl
if (player)
{
std::vector<std::shared_ptr<timeline::Timeline> > compare;
for (size_t i = 1; i < files.size(); ++i)
for (size_t i = 1; i < activeFiles.size(); ++i)
{
auto j = std::find(p.files.begin(), p.files.end(), files[i]);
auto j = std::find(p.files.begin(), p.files.end(), activeFiles[i]);
if (j != p.files.end())
{
auto timeline = p.timelines[j - p.files.begin()];
Expand All @@ -976,18 +967,47 @@ namespace tl
player->setCompareTime(p.filesModel->getCompareTime());
}

p.activeFiles = files;
p.activeFiles = activeFiles;
p.player = player;
#if defined(TLRENDER_BMD)
p.bmdOutputDevice->setPlayer(p.player ? p.player->player() : nullptr);
#endif // TLRENDER_BMD

_layersUpdate(p.filesModel->observeLayers()->get());
_cacheUpdate();
_audioUpdate();

Q_EMIT playerChanged(p.player);
}

void App::_layersUpdate(const std::vector<int>& value)
{
TLRENDER_P();
if (auto player = p.player)
{
int videoLayer = 0;
std::vector<int> compareVideoLayers;
if (!value.empty() && value.size() == p.files.size() && !p.activeFiles.empty())
{
auto i = std::find(p.files.begin(), p.files.end(), p.activeFiles.front());
if (i != p.files.end())
{
videoLayer = value[i - p.files.begin()];
}
for (size_t j = 1; j < p.activeFiles.size(); ++j)
{
i = std::find(p.files.begin(), p.files.end(), p.activeFiles[j]);
if (i != p.files.end())
{
compareVideoLayers.push_back(value[i - p.files.begin()]);
}
}
}
player->setVideoLayer(videoLayer);
player->setCompareVideoLayers(compareVideoLayers);
}
}

void App::_cacheUpdate()
{
TLRENDER_P();
Expand Down
1 change: 1 addition & 0 deletions lib/tlPlayQtApp/App.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ namespace tl
void _timerUpdate();
void _filesUpdate(const std::vector<std::shared_ptr<tl::play::FilesModelItem> >&);
void _activeUpdate(const std::vector<std::shared_ptr<tl::play::FilesModelItem> >&);
void _layersUpdate(const std::vector<int>&);
void _cacheUpdate();
void _viewUpdate(const math::Vector2i& pos, double zoom, bool frame);
void _audioUpdate();
Expand Down
52 changes: 44 additions & 8 deletions lib/tlQt/TimelinePlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ namespace tl
std::shared_ptr<observer::ListObserver<std::shared_ptr<timeline::Timeline> > > compareObserver;
std::shared_ptr<observer::ValueObserver<timeline::CompareTimeMode> > compareTimeObserver;
std::shared_ptr<observer::ValueObserver<io::Options> > ioOptionsObserver;
std::shared_ptr<observer::ValueObserver<int> > videoLayerObserver;
std::shared_ptr<observer::ListObserver<int> > compareVideoLayersObserver;
std::shared_ptr<observer::ListObserver<timeline::VideoData> > currentVideoObserver;
std::shared_ptr<observer::ValueObserver<float> > volumeObserver;
std::shared_ptr<observer::ValueObserver<bool> > muteObserver;
Expand Down Expand Up @@ -107,6 +109,20 @@ namespace tl
Q_EMIT ioOptionsChanged(value);
});

p.videoLayerObserver = observer::ValueObserver<int>::create(
p.player->observeVideoLayer(),
[this](int value)
{
Q_EMIT videoLayerChanged(value);
});

p.compareVideoLayersObserver = observer::ListObserver<int>::create(
p.player->observeCompareVideoLayers(),
[this](const std::vector<int>& value)
{
Q_EMIT compareVideoLayersChanged(value);
});

p.currentVideoObserver = observer::ListObserver<timeline::VideoData>::create(
p.player->observeCurrentVideo(),
[this](const std::vector<timeline::VideoData>& value)
Expand Down Expand Up @@ -261,24 +277,24 @@ namespace tl
return _p->player->getCompare();
}

void TimelinePlayer::setCompare(const std::vector<std::shared_ptr<timeline::Timeline> >& value)
timeline::CompareTimeMode TimelinePlayer::compareTime() const
{
_p->player->setCompare(value);
return _p->player->getCompareTime();
}

timeline::CompareTimeMode TimelinePlayer::compareTime() const
const io::Options& TimelinePlayer::ioOptions() const
{
return _p->player->getCompareTime();
return _p->player->observeIOOptions()->get();
}

void TimelinePlayer::setCompareTime(timeline::CompareTimeMode value)
int TimelinePlayer::videoLayer() const
{
_p->player->setCompareTime(value);
return _p->player->getVideoLayer();
}

const io::Options& TimelinePlayer::ioOptions() const
const std::vector<int>& TimelinePlayer::compareVideoLayers() const
{
return _p->player->observeIOOptions()->get();
return _p->player->getCompareVideoLayers();
}

const std::vector<timeline::VideoData>& TimelinePlayer::currentVideo() const
Expand Down Expand Up @@ -414,6 +430,26 @@ namespace tl
_p->player->setIOOptions(value);
}

void TimelinePlayer::setCompare(const std::vector<std::shared_ptr<timeline::Timeline> >& value)
{
_p->player->setCompare(value);
}

void TimelinePlayer::setCompareTime(timeline::CompareTimeMode value)
{
_p->player->setCompareTime(value);
}

void TimelinePlayer::setVideoLayer(int value)
{
_p->player->setVideoLayer(value);
}

void TimelinePlayer::setCompareVideoLayers(const std::vector<int>& value)
{
_p->player->setCompareVideoLayers(value);
}

void TimelinePlayer::setVolume(float value)
{
_p->player->setVolume(value);
Expand Down
Loading

0 comments on commit 41df516

Please sign in to comment.