DecodeSignal: Add and use inclusive/exclusive sample count variant

This is needed because the annotation cache must be operating on the
number of decoded samples WITHOUT the ones being currently processed,
otherwise it'll refuse to refresh the cache, even if more annotations
arrive - it uses the sample count to determine the cache state.

However, the bar showing the undecoded area must operate on the number
of samples WITH the ones being currently processed so that annotations
aren't overlapping with it.

Adding the parameter to DecodeSignal::get_decoded_sample_count() allows
for both.

This relates to e06cf18db7.
This commit is contained in:
Soeren Apel 2018-05-18 22:16:00 +02:00 committed by Uwe Hermann
parent 76f33d4c67
commit b82908abf7
3 changed files with 33 additions and 10 deletions

View File

@ -398,7 +398,8 @@ int64_t DecodeSignal::get_working_sample_count(uint32_t segment_id) const
return (no_signals_assigned ? 0 : count);
}
int64_t DecodeSignal::get_decoded_sample_count(uint32_t segment_id) const
int64_t DecodeSignal::get_decoded_sample_count(uint32_t segment_id,
bool include_processing) const
{
lock_guard<mutex> decode_lock(output_mutex_);
@ -406,7 +407,10 @@ int64_t DecodeSignal::get_decoded_sample_count(uint32_t segment_id) const
try {
const DecodeSegment *segment = &(segments_.at(segment_id));
result = segment->samples_decoded;
if (include_processing)
result = segment->samples_decoded_incl;
else
result = segment->samples_decoded_excl;
} catch (out_of_range&) {
// Do nothing
}
@ -919,11 +923,10 @@ void DecodeSignal::decode_data(
const int64_t chunk_end = min(i + chunk_sample_count,
abs_start_samplenum + sample_count);
// Report this chunk as already decoded so that annotations don't
// appear in an area that we claim to not having been been decoded yet
{
lock_guard<mutex> lock(output_mutex_);
segments_.at(current_segment_id_).samples_decoded = chunk_end;
// Update the sample count showing the samples including currently processed ones
segments_.at(current_segment_id_).samples_decoded_incl = chunk_end;
}
int64_t data_size = (chunk_end - i) * unit_size;
@ -939,6 +942,12 @@ void DecodeSignal::decode_data(
delete[] chunk;
{
lock_guard<mutex> lock(output_mutex_);
// Now that all samples are processed, the exclusive sample count catches up
segments_.at(current_segment_id_).samples_decoded_excl = chunk_end;
}
// Notify the frontend that we processed some data and
// possibly have new annotations as well
new_annotations();

View File

@ -76,7 +76,7 @@ struct DecodeSegment
map<const decode::Row, decode::RowData> annotation_rows;
pv::util::Timestamp start_time;
double samplerate;
int64_t samples_decoded;
int64_t samples_decoded_incl, samples_decoded_excl;
};
class DecodeSignal : public SignalBase
@ -120,7 +120,16 @@ public:
*/
int64_t get_working_sample_count(uint32_t segment_id) const;
int64_t get_decoded_sample_count(uint32_t segment_id) const;
/**
* Returns the number of processed samples. Newly generated annotations will
* have sample numbers greater than this.
*
* If include_processing is true, this number will include the ones being
* currently processed (in case the decoder stack is running). In this case,
* newly generated annotations will have sample numbers smaller than this.
*/
int64_t get_decoded_sample_count(uint32_t segment_id,
bool include_processing) const;
vector<decode::Row> visible_rows() const;

View File

@ -176,8 +176,13 @@ void DecodeTrace::paint_mid(QPainter &p, ViewItemPaintParams &pp)
// Iterate through the rows
int y = get_visual_y();
pair<uint64_t, uint64_t> sample_range = get_sample_range(
pp.left(), pp.right());
pair<uint64_t, uint64_t> sample_range = get_sample_range(pp.left(), pp.right());
// Just because the view says we see a certain sample range it
// doesn't mean we have this many decoded samples, too, so crop
// the range to what has been decoded already
sample_range.second = min((int64_t)sample_range.second,
decode_signal_->get_decoded_sample_count(current_segment_, false));
const vector<Row> rows = decode_signal_->visible_rows();
@ -580,7 +585,7 @@ void DecodeTrace::draw_unresolved_period(QPainter &p, int h, int left, int right
if (sample_count == 0)
return;
const int64_t samples_decoded = decode_signal_->get_decoded_sample_count(current_segment_);
const int64_t samples_decoded = decode_signal_->get_decoded_sample_count(current_segment_, true);
if (sample_count == samples_decoded)
return;