Sketch implementation of setKeyFrameMap
This commit is contained in:
@@ -47,6 +47,7 @@ R3StretcherImpl::R3StretcherImpl(Parameters parameters,
|
|||||||
m_studyInputDuration(0),
|
m_studyInputDuration(0),
|
||||||
m_totalTargetDuration(0),
|
m_totalTargetDuration(0),
|
||||||
m_processInputDuration(0),
|
m_processInputDuration(0),
|
||||||
|
m_lastKeyFrameSurpassed(0),
|
||||||
m_totalOutputDuration(0),
|
m_totalOutputDuration(0),
|
||||||
m_mode(ProcessMode::JustCreated)
|
m_mode(ProcessMode::JustCreated)
|
||||||
{
|
{
|
||||||
@@ -287,8 +288,59 @@ void
|
|||||||
R3StretcherImpl::updateRatioFromMap()
|
R3StretcherImpl::updateRatioFromMap()
|
||||||
{
|
{
|
||||||
if (m_keyFrameMap.empty()) return;
|
if (m_keyFrameMap.empty()) return;
|
||||||
//!!! auto itr = m_keyFrameMap.upper_bound(m_processInputDuration);
|
|
||||||
|
|
||||||
|
if (m_processInputDuration == 0) {
|
||||||
|
m_timeRatio = double(m_keyFrameMap.begin()->second) /
|
||||||
|
double(m_keyFrameMap.begin()->first);
|
||||||
|
std::cout << "initial key-frame map entry " << m_keyFrameMap.begin()->first << " -> " << m_keyFrameMap.begin()->second << " gives initial ratio " << m_timeRatio << std::endl;
|
||||||
|
calculateHop();
|
||||||
|
m_lastKeyFrameSurpassed = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto i0 = m_keyFrameMap.upper_bound(m_lastKeyFrameSurpassed);
|
||||||
|
|
||||||
|
if (i0 == m_keyFrameMap.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_processInputDuration >= i0->first) {
|
||||||
|
|
||||||
|
std::cout << "at " << m_processInputDuration << " (output = " << m_totalOutputDuration << ") we have passed " << i0->first << ", looking ahead to next key frame" << std::endl;
|
||||||
|
|
||||||
|
auto i1 = m_keyFrameMap.upper_bound(m_processInputDuration);
|
||||||
|
|
||||||
|
size_t keyFrameAtInput, keyFrameAtOutput;
|
||||||
|
|
||||||
|
if (i1 != m_keyFrameMap.end()) {
|
||||||
|
keyFrameAtInput = i1->first;
|
||||||
|
keyFrameAtOutput = i1->second;
|
||||||
|
} else {
|
||||||
|
keyFrameAtInput = m_studyInputDuration;
|
||||||
|
keyFrameAtOutput = m_totalTargetDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
// size_t toKeyFrameAtInput = keyFrameAtInput - i0->first;
|
||||||
|
// size_t toKeyFrameAtOutput = keyFrameAtOutput - i0->second;
|
||||||
|
size_t toKeyFrameAtInput = keyFrameAtInput - m_processInputDuration;
|
||||||
|
size_t toKeyFrameAtOutput = 0;
|
||||||
|
|
||||||
|
if (keyFrameAtOutput > m_totalOutputDuration) {
|
||||||
|
toKeyFrameAtOutput = keyFrameAtOutput - m_totalOutputDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
double ratio = double(toKeyFrameAtOutput) / double(toKeyFrameAtInput);
|
||||||
|
|
||||||
|
std::cout << "keyFrameAtInput = " << keyFrameAtInput << ", keyFrameAtOutput = " << keyFrameAtOutput << std::endl;
|
||||||
|
std::cout << "currently at input = " << m_processInputDuration << ", currently at output = " << m_totalOutputDuration << std::endl;
|
||||||
|
std::cout << "toKeyFrameAtInput = " << toKeyFrameAtInput << ", toKeyFrameAtOutput = " << toKeyFrameAtOutput << std::endl;
|
||||||
|
std::cout << "ratio = " << ratio << std::endl;
|
||||||
|
|
||||||
|
m_timeRatio = ratio;
|
||||||
|
calculateHop();
|
||||||
|
|
||||||
|
m_lastKeyFrameSurpassed = i0->first;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
double
|
||||||
@@ -346,6 +398,7 @@ R3StretcherImpl::reset()
|
|||||||
m_studyInputDuration = 0;
|
m_studyInputDuration = 0;
|
||||||
m_totalTargetDuration = 0;
|
m_totalTargetDuration = 0;
|
||||||
m_processInputDuration = 0;
|
m_processInputDuration = 0;
|
||||||
|
m_lastKeyFrameSurpassed = 0;
|
||||||
m_totalOutputDuration = 0;
|
m_totalOutputDuration = 0;
|
||||||
m_keyFrameMap.clear();
|
m_keyFrameMap.clear();
|
||||||
|
|
||||||
@@ -399,6 +452,7 @@ R3StretcherImpl::process(const float *const *input, size_t samples, bool final)
|
|||||||
m_totalTargetDuration =
|
m_totalTargetDuration =
|
||||||
size_t(round(m_studyInputDuration * getEffectiveRatio()));
|
size_t(round(m_studyInputDuration * getEffectiveRatio()));
|
||||||
}
|
}
|
||||||
|
updateRatioFromMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (final) {
|
if (final) {
|
||||||
@@ -589,8 +643,10 @@ R3StretcherImpl::consume()
|
|||||||
auto &cd = m_channelData.at(c);
|
auto &cd = m_channelData.at(c);
|
||||||
if (m_resampler) {
|
if (m_resampler) {
|
||||||
cd->outbuf->write(cd->resampled.data(), resampledCount);
|
cd->outbuf->write(cd->resampled.data(), resampledCount);
|
||||||
|
if (c == 0) m_totalOutputDuration += resampledCount;
|
||||||
} else {
|
} else {
|
||||||
cd->outbuf->write(cd->mixdown.data(), outhop);
|
cd->outbuf->write(cd->mixdown.data(), outhop);
|
||||||
|
if (c == 0) m_totalOutputDuration += outhop;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readSpace = cd->inbuf->getReadSpace();
|
int readSpace = cd->inbuf->getReadSpace();
|
||||||
|
|||||||
@@ -288,6 +288,7 @@ protected:
|
|||||||
size_t m_studyInputDuration;
|
size_t m_studyInputDuration;
|
||||||
size_t m_totalTargetDuration;
|
size_t m_totalTargetDuration;
|
||||||
size_t m_processInputDuration;
|
size_t m_processInputDuration;
|
||||||
|
size_t m_lastKeyFrameSurpassed;
|
||||||
size_t m_totalOutputDuration;
|
size_t m_totalOutputDuration;
|
||||||
std::map<size_t, size_t> m_keyFrameMap;
|
std::map<size_t, size_t> m_keyFrameMap;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user