annotate data/model/BasicCompressedDenseThreeDimensionalModel.h @ 1777:d484490cdf69

Split EditableDenseThreeDimensionalModel into explicitly compressed and uncompressed variants. Simplifies the uncompressed version, and we may want to consider whether we need the compressed one at all.
author Chris Cannam
date Tue, 10 Sep 2019 16:34:47 +0100
parents
children c546429d4c2f
rev   line source
Chris@1777 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1777 2
Chris@1777 3 /*
Chris@1777 4 Sonic Visualiser
Chris@1777 5 An audio file viewer and annotation editor.
Chris@1777 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1777 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@1777 8
Chris@1777 9 This program is free software; you can redistribute it and/or
Chris@1777 10 modify it under the terms of the GNU General Public License as
Chris@1777 11 published by the Free Software Foundation; either version 2 of the
Chris@1777 12 License, or (at your option) any later version. See the file
Chris@1777 13 COPYING included with this distribution for more information.
Chris@1777 14 */
Chris@1777 15
Chris@1777 16 #ifndef SV_BASIC_COMPRESSED_DENSE_THREE_DIMENSIONAL_MODEL_H
Chris@1777 17 #define SV_BASIC_COMPRESSED_DENSE_THREE_DIMENSIONAL_MODEL_H
Chris@1777 18
Chris@1777 19 #include "DenseThreeDimensionalModel.h"
Chris@1777 20
Chris@1777 21 #include <QReadWriteLock>
Chris@1777 22
Chris@1777 23 #include <vector>
Chris@1777 24
Chris@1777 25 class BasicCompressedDenseThreeDimensionalModel : public DenseThreeDimensionalModel
Chris@1777 26 {
Chris@1777 27 Q_OBJECT
Chris@1777 28
Chris@1777 29 public:
Chris@1777 30
Chris@1777 31 // BasicCompressedDenseThreeDimensionalModel supports a basic
Chris@1777 32 // compression method that reduces the size of multirate data
Chris@1777 33 // (e.g. wavelet transform outputs) that are stored as plain 3d
Chris@1777 34 // grids by about 60% or thereabouts. However, it can only be
Chris@1777 35 // used for models whose columns are set in order from 0 and never
Chris@1777 36 // subsequently changed. For a model that is actually going to be
Chris@1777 37 // edited, you need an EditableDenseThreeDimensionalModel.
Chris@1777 38
Chris@1777 39 BasicCompressedDenseThreeDimensionalModel(sv_samplerate_t sampleRate,
Chris@1777 40 int resolution,
Chris@1777 41 int height,
Chris@1777 42 bool notifyOnAdd = true);
Chris@1777 43
Chris@1777 44 bool isOK() const override;
Chris@1777 45 bool isReady(int *completion = 0) const override;
Chris@1777 46 void setCompletion(int completion, bool update = true);
Chris@1777 47 int getCompletion() const override;
Chris@1777 48
Chris@1777 49 sv_samplerate_t getSampleRate() const override;
Chris@1777 50 sv_frame_t getStartFrame() const override;
Chris@1777 51 sv_frame_t getTrueEndFrame() const override;
Chris@1777 52
Chris@1777 53 /**
Chris@1777 54 * Set the frame offset of the first column.
Chris@1777 55 */
Chris@1777 56 virtual void setStartFrame(sv_frame_t);
Chris@1777 57
Chris@1777 58 /**
Chris@1777 59 * Return the number of sample frames covered by each set of bins.
Chris@1777 60 */
Chris@1777 61 int getResolution() const override;
Chris@1777 62
Chris@1777 63 /**
Chris@1777 64 * Set the number of sample frames covered by each set of bins.
Chris@1777 65 */
Chris@1777 66 virtual void setResolution(int sz);
Chris@1777 67
Chris@1777 68 /**
Chris@1777 69 * Return the number of columns.
Chris@1777 70 */
Chris@1777 71 int getWidth() const override;
Chris@1777 72
Chris@1777 73 /**
Chris@1777 74 * Return the number of bins in each column.
Chris@1777 75 */
Chris@1777 76 int getHeight() const override;
Chris@1777 77
Chris@1777 78 /**
Chris@1777 79 * Set the number of bins in each column.
Chris@1777 80 *
Chris@1777 81 * You can set (via setColumn) a vector of any length as a column,
Chris@1777 82 * but any column being retrieved will be resized to this height
Chris@1777 83 * (or the height that was supplied to the constructor, if this is
Chris@1777 84 * never called) on retrieval. That is, the model owner determines
Chris@1777 85 * the height of the model at a single stroke; the columns
Chris@1777 86 * themselves don't have any effect on the height of the model.
Chris@1777 87 */
Chris@1777 88 virtual void setHeight(int sz);
Chris@1777 89
Chris@1777 90 /**
Chris@1777 91 * Return the minimum value of the value in each bin.
Chris@1777 92 */
Chris@1777 93 float getMinimumLevel() const override;
Chris@1777 94
Chris@1777 95 /**
Chris@1777 96 * Set the minimum value of the value in a bin.
Chris@1777 97 */
Chris@1777 98 virtual void setMinimumLevel(float sz);
Chris@1777 99
Chris@1777 100 /**
Chris@1777 101 * Return the maximum value of the value in each bin.
Chris@1777 102 */
Chris@1777 103 float getMaximumLevel() const override;
Chris@1777 104
Chris@1777 105 /**
Chris@1777 106 * Set the maximum value of the value in a bin.
Chris@1777 107 */
Chris@1777 108 virtual void setMaximumLevel(float sz);
Chris@1777 109
Chris@1777 110 /**
Chris@1777 111 * Get the set of bin values at the given column.
Chris@1777 112 */
Chris@1777 113 Column getColumn(int x) const override;
Chris@1777 114
Chris@1777 115 /**
Chris@1777 116 * Get a single value, from the n'th bin of the given column.
Chris@1777 117 */
Chris@1777 118 float getValueAt(int x, int n) const override;
Chris@1777 119
Chris@1777 120 /**
Chris@1777 121 * Set the entire set of bin values at the given column.
Chris@1777 122 */
Chris@1777 123 virtual void setColumn(int x, const Column &values);
Chris@1777 124
Chris@1777 125 /**
Chris@1777 126 * Return the name of bin n. This is a single label per bin that
Chris@1777 127 * does not vary from one column to the next.
Chris@1777 128 */
Chris@1777 129 QString getBinName(int n) const override;
Chris@1777 130
Chris@1777 131 /**
Chris@1777 132 * Set the name of bin n.
Chris@1777 133 */
Chris@1777 134 virtual void setBinName(int n, QString);
Chris@1777 135
Chris@1777 136 /**
Chris@1777 137 * Set the names of all bins.
Chris@1777 138 */
Chris@1777 139 virtual void setBinNames(std::vector<QString> names);
Chris@1777 140
Chris@1777 141 /**
Chris@1777 142 * Return true if the bins have values as well as names. (The
Chris@1777 143 * values may have been derived from the names, e.g. by parsing
Chris@1777 144 * numbers from them.) If this returns true, getBinValue() may be
Chris@1777 145 * used to retrieve the values.
Chris@1777 146 */
Chris@1777 147 bool hasBinValues() const override;
Chris@1777 148
Chris@1777 149 /**
Chris@1777 150 * Return the value of bin n, if any. This is a "vertical scale"
Chris@1777 151 * value which does not vary from one column to the next. This is
Chris@1777 152 * only meaningful if hasBinValues() returns true.
Chris@1777 153 */
Chris@1777 154 float getBinValue(int n) const override;
Chris@1777 155
Chris@1777 156 /**
Chris@1777 157 * Set the values of all bins (separate from their labels). These
Chris@1777 158 * are "vertical scale" values which do not vary from one column
Chris@1777 159 * to the next.
Chris@1777 160 */
Chris@1777 161 virtual void setBinValues(std::vector<float> values);
Chris@1777 162
Chris@1777 163 /**
Chris@1777 164 * Obtain the name of the unit of the values returned from
Chris@1777 165 * getBinValue(), if any.
Chris@1777 166 */
Chris@1777 167 QString getBinValueUnit() const override;
Chris@1777 168
Chris@1777 169 /**
Chris@1777 170 * Set the name of the unit of the values return from
Chris@1777 171 * getBinValue() if any.
Chris@1777 172 */
Chris@1777 173 virtual void setBinValueUnit(QString unit);
Chris@1777 174
Chris@1777 175 /**
Chris@1777 176 * Return true if the distribution of values in the bins is such
Chris@1777 177 * as to suggest a log scale (mapping to colour etc) may be better
Chris@1777 178 * than a linear one.
Chris@1777 179 */
Chris@1777 180 bool shouldUseLogValueScale() const override;
Chris@1777 181
Chris@1777 182 QString getTypeName() const override { return tr("Editable Dense 3-D"); }
Chris@1777 183
Chris@1777 184 QString toDelimitedDataString(QString delimiter,
Chris@1777 185 DataExportOptions options,
Chris@1777 186 sv_frame_t startFrame,
Chris@1777 187 sv_frame_t duration) const override;
Chris@1777 188
Chris@1777 189 void toXml(QTextStream &out,
Chris@1777 190 QString indent = "",
Chris@1777 191 QString extraAttributes = "") const override;
Chris@1777 192
Chris@1777 193 protected:
Chris@1777 194 typedef std::vector<Column> ValueMatrix;
Chris@1777 195 ValueMatrix m_data;
Chris@1777 196
Chris@1777 197 // m_trunc is used for simple compression. If at least the top N
Chris@1777 198 // elements of column x (for N = some proportion of the column
Chris@1777 199 // height) are equal to those of an earlier column x', then
Chris@1777 200 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@1777 201 // as to remove the duplicate elements. If the equal elements are
Chris@1777 202 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@1777 203 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@1777 204 // stored.
Chris@1777 205 std::vector<signed char> m_trunc;
Chris@1777 206 void truncateAndStore(int index, const Column & values);
Chris@1777 207 Column expandAndRetrieve(int index) const;
Chris@1777 208 Column rightHeight(const Column &c) const;
Chris@1777 209
Chris@1777 210 std::vector<QString> m_binNames;
Chris@1777 211 std::vector<float> m_binValues;
Chris@1777 212 QString m_binValueUnit;
Chris@1777 213
Chris@1777 214 sv_frame_t m_startFrame;
Chris@1777 215 sv_samplerate_t m_sampleRate;
Chris@1777 216 int m_resolution;
Chris@1777 217 int m_yBinCount;
Chris@1777 218 float m_minimum;
Chris@1777 219 float m_maximum;
Chris@1777 220 bool m_haveExtents;
Chris@1777 221 bool m_notifyOnAdd;
Chris@1777 222 sv_frame_t m_sinceLastNotifyMin;
Chris@1777 223 sv_frame_t m_sinceLastNotifyMax;
Chris@1777 224 int m_completion;
Chris@1777 225
Chris@1777 226 mutable QReadWriteLock m_lock;
Chris@1777 227 };
Chris@1777 228
Chris@1777 229 #endif