| 175 | } |
| 176 | |
| 177 | void BitratePlotModel::addBitratePoint(int streamIndex, BitrateEntry &entry) |
| 178 | { |
| 179 | QMutexLocker locker(&this->dataMutex); |
| 180 | |
| 181 | const auto newStream = !this->dataPerStream.contains(streamIndex); |
| 182 | |
| 183 | if (this->dataPerStream[streamIndex].empty()) |
| 184 | { |
| 185 | rangeDts.min = entry.dts; |
| 186 | rangeDts.max = entry.dts; |
| 187 | rangePts.min = entry.pts; |
| 188 | rangePts.max = entry.pts; |
| 189 | } |
| 190 | else |
| 191 | { |
| 192 | rangeDts.min = std::min(rangeDts.min, entry.dts); |
| 193 | rangeDts.max = std::max(rangeDts.max, entry.dts); |
| 194 | rangePts.min = std::min(rangePts.min, entry.pts); |
| 195 | rangePts.max = std::max(rangePts.max, entry.pts); |
| 196 | } |
| 197 | |
| 198 | rangeBitratePerStream[streamIndex].min = |
| 199 | std::min(rangeBitratePerStream[streamIndex].min, int(entry.bitrate)); |
| 200 | rangeBitratePerStream[streamIndex].max = |
| 201 | std::max(rangeBitratePerStream[streamIndex].max, int(entry.bitrate)); |
| 202 | |
| 203 | // Store absolute minimum and maximum over all streams |
| 204 | yMaxStreamRange.min = |
| 205 | std::min(yMaxStreamRange.min, double(rangeBitratePerStream[streamIndex].min)); |
| 206 | yMaxStreamRange.max = |
| 207 | std::max(yMaxStreamRange.max, double(rangeBitratePerStream[streamIndex].max)); |
| 208 | |
| 209 | DEBUG_PLOT("BitrateItemModel::addBitratePoint streamIndex " |
| 210 | << streamIndex << " pts " << entry.pts << " dts " << entry.dts << " rate " |
| 211 | << entry.bitrate << " keyframe " << entry.keyframe); |
| 212 | |
| 213 | // Keep the list sorted |
| 214 | const auto currentSortMode = this->sortMode; |
| 215 | auto compareFunctionLessThen = [currentSortMode](const BitrateEntry &a, const BitrateEntry &b) { |
| 216 | if (currentSortMode == SortMode::DECODE_ORDER) |
| 217 | return a.dts < b.dts; |
| 218 | else |
| 219 | return b.pts < a.pts; |
| 220 | }; |
| 221 | |
| 222 | auto insertIterator = std::upper_bound(this->dataPerStream[streamIndex].begin(), |
| 223 | this->dataPerStream[streamIndex].end(), |
| 224 | entry, |
| 225 | compareFunctionLessThen); |
| 226 | this->dataPerStream[streamIndex].insert(insertIterator, entry); |
| 227 | this->eventSubsampler.postEvent(); |
| 228 | if (newStream) |
| 229 | emit nrStreamsChanged(); |
| 230 | } |
| 231 | |
| 232 | void BitratePlotModel::setBitrateSortingIndex(int index) |
| 233 | { |
no test coverage detected