X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=12379518acf9bb90dda59e376ee9b0145d5b7b69;hb=13b726cda35835a120ade2d9cc1ab58770d4ef3f;hp=10ef7d1a0b7a5538af7aad9c93c526c43bc9584f;hpb=b2b18d3aabf497666c3cff76d0c6663623539e36;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 10ef7d1a..12379518 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -442,15 +442,13 @@ int64_t DecodeSignal::get_decoded_sample_count(uint32_t segment_id, int64_t result = 0; - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); - if (include_processing) - result = segment->samples_decoded_incl; - else - result = segment->samples_decoded_excl; - } catch (out_of_range&) { - // Do nothing - } + if (segment_id >= segments_.size()) + return result; + + if (include_processing) + result = segments_[segment_id].samples_decoded_incl; + else + result = segments_[segment_id].samples_decoded_excl; return result; } @@ -493,18 +491,16 @@ void DecodeSignal::get_annotation_subset( { lock_guard lock(output_mutex_); - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); - const map *rows = - &(segment->annotation_rows); + if (segment_id >= segments_.size()) + return; - const auto iter = rows->find(row); - if (iter != rows->end()) - (*iter).second.get_annotation_subset(dest, - start_sample, end_sample); - } catch (out_of_range&) { - // Do nothing - } + const DecodeSegment *segment = &(segments_.at(segment_id)); + const map *rows = + &(segment->annotation_rows); + + const auto iter = rows->find(row); + if (iter != rows->end()) + (*iter).second.get_annotation_subset(dest, start_sample, end_sample); } void DecodeSignal::get_annotation_subset( @@ -535,8 +531,11 @@ void DecodeSignal::get_annotation_subset( } uint32_t DecodeSignal::get_binary_data_chunk_count(uint32_t segment_id, - const Decoder* dec, uint8_t bin_class_id) const + const Decoder* dec, uint32_t bin_class_id) const { + if (segments_.size() == 0) + return 0; + try { const DecodeSegment *segment = &(segments_.at(segment_id)); @@ -551,7 +550,7 @@ uint32_t DecodeSignal::get_binary_data_chunk_count(uint32_t segment_id, } void DecodeSignal::get_binary_data_chunk(uint32_t segment_id, - const Decoder* dec, uint8_t bin_class_id, uint32_t chunk_id, + const Decoder* dec, uint32_t bin_class_id, uint32_t chunk_id, const vector **dest, uint64_t *size) { try { @@ -568,8 +567,8 @@ void DecodeSignal::get_binary_data_chunk(uint32_t segment_id, } } -void DecodeSignal::get_binary_data_chunks_merged(uint32_t segment_id, - const Decoder* dec, uint8_t bin_class_id, uint64_t start_sample, +void DecodeSignal::get_merged_binary_data_chunks_by_sample(uint32_t segment_id, + const Decoder* dec, uint32_t bin_class_id, uint64_t start_sample, uint64_t end_sample, vector *dest) const { assert(dest != nullptr); @@ -609,6 +608,63 @@ void DecodeSignal::get_binary_data_chunks_merged(uint32_t segment_id, } } +void DecodeSignal::get_merged_binary_data_chunks_by_offset(uint32_t segment_id, + const data::decode::Decoder* dec, uint32_t bin_class_id, uint64_t start, + uint64_t end, vector *dest) const +{ + assert(dest != nullptr); + + try { + const DecodeSegment *segment = &(segments_.at(segment_id)); + + const DecodeBinaryClass* bin_class = nullptr; + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + bin_class = &bc; + + // Determine overall size before copying to resize dest vector only once + uint64_t size = 0; + uint64_t offset = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { + if (offset >= start) + size += chunk.data.size(); + offset += chunk.data.size(); + if (offset >= end) + break; + } + dest->resize(size); + + offset = 0; + uint64_t dest_offset = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { + if (offset >= start) { + memcpy(dest->data() + dest_offset, chunk.data.data(), chunk.data.size()); + dest_offset += chunk.data.size(); + } + offset += chunk.data.size(); + if (offset >= end) + break; + } + } catch (out_of_range&) { + // Do nothing + } +} + +const DecodeBinaryClass* DecodeSignal::get_binary_data_class(uint32_t segment_id, + const data::decode::Decoder* dec, uint32_t bin_class_id) const +{ + try { + const DecodeSegment *segment = &(segments_.at(segment_id)); + + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + return &bc; + } catch (out_of_range&) { + // Do nothing + } + + return nullptr; +} void DecodeSignal::save_settings(QSettings &settings) const { @@ -1332,11 +1388,11 @@ void DecodeSignal::create_decode_segment() // Prepare our binary output classes for (const shared_ptr& dec : stack_) { - uint8_t n = dec->get_binary_class_count(); + uint32_t n = dec->get_binary_class_count(); - for (uint8_t i = 0; i < n; i++) + for (uint32_t i = 0; i < n; i++) segments_.back().binary_classes.push_back( - {dec.get(), dec->get_binary_class(i), vector()}); + {dec.get(), dec->get_binary_class(i), deque()}); } } @@ -1411,7 +1467,7 @@ void DecodeSignal::binary_callback(srd_proto_data *pdata, void *decode_signal) DecodeBinaryClass* bin_class = nullptr; for (DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder->decoder() == decc) && (bc.info->bin_class_id == pdb->bin_class)) + if ((bc.decoder->decoder() == decc) && (bc.info->bin_class_id == (uint32_t)pdb->bin_class)) bin_class = &bc; if (!bin_class) {