X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=05dc3428ab5ce8e9f2bcb964175b55fceb3557d2;hp=baef9ce191ddeebd7ea2a480e0e4957b19a5d460;hb=5a914348e8c95f92fd7c1c5988d563c5fb472aa2;hpb=a8030bb06fd94fe10a462f84bb8f3a4f51b4a05d diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index baef9ce..05dc342 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -17,6 +17,7 @@ * along with this program; if not, see . */ +#include #include #include @@ -32,6 +33,7 @@ #include #include +using std::forward_list; using std::lock_guard; using std::make_pair; using std::make_shared; @@ -209,6 +211,7 @@ void DecodeSignal::begin_decode() } // Map out all the annotation classes + int row_index = 0; for (const shared_ptr &dec : stack_) { assert(dec); const srd_decoder *const decc = dec->decoder(); @@ -219,7 +222,7 @@ void DecodeSignal::begin_decode() (srd_decoder_annotation_row *)l->data; assert(ann_row); - const Row row(decc, ann_row); + const Row row(row_index++, decc, ann_row); for (const GSList *ll = ann_row->ann_classes; ll; ll = ll->next) @@ -398,7 +401,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 decode_lock(output_mutex_); @@ -406,7 +410,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 } @@ -428,16 +435,17 @@ vector DecodeSignal::visible_rows() const const srd_decoder *const decc = dec->decoder(); assert(dec->decoder()); + int row_index = 0; // Add a row for the decoder if it doesn't have a row list if (!decc->annotation_rows) - rows.emplace_back(decc); + rows.emplace_back(row_index++, decc); // Add the decoder rows for (const GSList *l = decc->annotation_rows; l; l = l->next) { const srd_decoder_annotation_row *const ann_row = (srd_decoder_annotation_row *)l->data; assert(ann_row); - rows.emplace_back(decc, ann_row); + rows.emplace_back(row_index++, decc, ann_row); } } @@ -465,6 +473,33 @@ void DecodeSignal::get_annotation_subset( } } +void DecodeSignal::get_annotation_subset( + vector &dest, + uint32_t segment_id, uint64_t start_sample, uint64_t end_sample) const +{ + // Note: We put all vectors and lists on the heap, not the stack + + const vector rows = visible_rows(); + + // Use forward_lists for faster merging + forward_list *all_ann_list = new forward_list(); + + for (const Row& row : rows) { + vector *ann_vector = new vector(); + get_annotation_subset(*ann_vector, row, segment_id, start_sample, end_sample); + + forward_list *ann_list = + new forward_list(ann_vector->begin(), ann_vector->end()); + delete ann_vector; + + all_ann_list->merge(*ann_list); + delete ann_list; + } + + move(all_ann_list->begin(), all_ann_list->end(), back_inserter(dest)); + delete all_ann_list; +} + void DecodeSignal::save_settings(QSettings &settings) const { SignalBase::save_settings(settings); @@ -902,6 +937,7 @@ void DecodeSignal::logic_mux_proc() logic_mux_cond_.wait(logic_mux_lock); } } + } while (!logic_mux_interrupt_); } @@ -913,17 +949,17 @@ void DecodeSignal::decode_data( const int64_t chunk_sample_count = DecodeChunkLength / unit_size; for (int64_t i = abs_start_samplenum; - !decode_interrupt_ && (i < (abs_start_samplenum + sample_count)); + error_message_.isEmpty() && !decode_interrupt_ && + (i < (abs_start_samplenum + sample_count)); i += chunk_sample_count) { 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 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; @@ -931,14 +967,17 @@ void DecodeSignal::decode_data( input_segment->get_samples(i, chunk_end, chunk); if (srd_session_send(srd_session_, i, chunk_end, chunk, - data_size, unit_size) != SRD_OK) { + data_size, unit_size) != SRD_OK) set_error_message(tr("Decoder reported an error")); - delete[] chunk; - break; - } delete[] chunk; + { + lock_guard 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(); @@ -1151,9 +1190,10 @@ void DecodeSignal::create_decode_segment() const srd_decoder *const decc = dec->decoder(); assert(dec->decoder()); + int row_index = 0; // Add a row for the decoder if it doesn't have a row list if (!decc->annotation_rows) - (segments_.back().annotation_rows)[Row(decc)] = + (segments_.back().annotation_rows)[Row(row_index++, decc)] = decode::RowData(); // Add the decoder rows @@ -1162,7 +1202,7 @@ void DecodeSignal::create_decode_segment() (srd_decoder_annotation_row *)l->data; assert(ann_row); - const Row row(decc, ann_row); + const Row row(row_index++, decc, ann_row); // Add a new empty row data object (segments_.back().annotation_rows)[row] = @@ -1203,7 +1243,7 @@ void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signa row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find((*r).second); else { // Failing that, use the decoder as a key - row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find(Row(decc)); + row_iter = ds->segments_.at(ds->current_segment_id_).annotation_rows.find(Row(0, decc)); } if (row_iter == ds->segments_.at(ds->current_segment_id_).annotation_rows.end()) { @@ -1214,7 +1254,7 @@ void DecodeSignal::annotation_callback(srd_proto_data *pdata, void *decode_signa } // Add the annotation - (*row_iter).second.emplace_annotation(pdata); + (*row_iter).second.emplace_annotation(pdata, &((*row_iter).first)); } void DecodeSignal::on_capture_state_changed(int state)