Commit d42a8b0b authored by Stefan Westerfeld's avatar Stefan Westerfeld

Reuse last value for speed compare bits start search (performance).

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 09fd6a9b
...@@ -136,7 +136,7 @@ private: ...@@ -136,7 +136,7 @@ private:
void prepare_mags (const SpeedScanParams& scan_params); void prepare_mags (const SpeedScanParams& scan_params);
void compare (double relative_speed); void compare (double relative_speed);
template<bool B2> template<bool B2>
void compare_bits (BitValue *bit_values, double relative_speed, int offset); void compare_bits (BitValue *bit_values, double relative_speed, int *start_mi, int offset);
std::mutex mutex; std::mutex mutex;
vector<Score> result_scores; vector<Score> result_scores;
...@@ -283,25 +283,24 @@ SpeedSync::prepare_mags (const SpeedScanParams& scan_params) ...@@ -283,25 +283,24 @@ SpeedSync::prepare_mags (const SpeedScanParams& scan_params)
} }
template<bool B2> void template<bool B2> void
SpeedSync::compare_bits (BitValue *bit_values, double relative_speed, int offset) SpeedSync::compare_bits (BitValue *bit_values, double relative_speed, int *start_mi, int offset)
{ {
const int steps_per_frame = Params::frame_size / Params::sync_search_step; const int steps_per_frame = Params::frame_size / Params::sync_search_step;
const double relative_speed_inv = 1 / relative_speed; const double relative_speed_inv = 1 / relative_speed;
/* search start */ /* search start */
auto si = sync_bits.begin(); int mi = *start_mi;
while (si != sync_bits.end()) while (mi > 0)
{ {
int index = offset + si->frame * steps_per_frame; int index = offset + sync_bits[mi - 1].frame * steps_per_frame;
if (index < 0)
if (index >= 0)
break; break;
si++; mi--;
} }
int mi = si - sync_bits.begin(); *start_mi = mi;
while (si != sync_bits.end()) for (auto si = sync_bits.begin() + mi; si != sync_bits.end(); si++)
{ {
int index = offset + si->frame * steps_per_frame; int index = offset + si->frame * steps_per_frame;
...@@ -323,7 +322,6 @@ SpeedSync::compare_bits (BitValue *bit_values, double relative_speed, int offset ...@@ -323,7 +322,6 @@ SpeedSync::compare_bits (BitValue *bit_values, double relative_speed, int offset
} }
bv.count++; bv.count++;
si++;
mi++; mi++;
} }
} }
...@@ -337,12 +335,14 @@ SpeedSync::compare (double relative_speed) ...@@ -337,12 +335,14 @@ SpeedSync::compare (double relative_speed)
assert (steps_per_frame * Params::sync_search_step == Params::frame_size); assert (steps_per_frame * Params::sync_search_step == Params::frame_size);
int start_mi1 = sync_bits.size();
int start_mi2 = sync_bits.size();
for (int offset = -pad_start; offset < 0; offset++) for (int offset = -pad_start; offset < 0; offset++)
{ {
BitValue bit_values[Params::sync_bits]; BitValue bit_values[Params::sync_bits];
compare_bits<false> (bit_values, relative_speed, offset); compare_bits<false> (bit_values, relative_speed, &start_mi1, offset);
compare_bits<true> (bit_values, relative_speed, offset + frames_per_block * steps_per_frame); compare_bits<true> (bit_values, relative_speed, &start_mi2, offset + frames_per_block * steps_per_frame);
double sync_quality = 0; double sync_quality = 0;
int bit_count = 0; int bit_count = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment