diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-06-15 18:56:59 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-06-15 18:56:59 +0200 |
commit | f808017ea8cd6a3a5e6964d7e4467672a6c74245 (patch) | |
tree | 2c254b93194f1af47b962c072706b246a70d3c9f /nihav-codec-support/src | |
parent | c5a6ae875be31f47bc318a6dc5b1a0209b9b66f7 (diff) | |
download | nihav-f808017ea8cd6a3a5e6964d7e4467672a6c74245.tar.gz |
codec_support/vq: make ELBG report the number of meaningful codewords
Diffstat (limited to 'nihav-codec-support/src')
-rw-r--r-- | nihav-codec-support/src/vq/generic_elbg.rs | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/nihav-codec-support/src/vq/generic_elbg.rs b/nihav-codec-support/src/vq/generic_elbg.rs index 91a5658..2dfed5b 100644 --- a/nihav-codec-support/src/vq/generic_elbg.rs +++ b/nihav-codec-support/src/vq/generic_elbg.rs @@ -148,9 +148,9 @@ impl<T: VQElement+Default, TS: VQElementSum<T>> ELBG<T, TS> { clu1.calc_dist(); clu0.dist + clu1.dist } - pub fn quantise(&mut self, src: &[T], dst: &mut [T]) { + pub fn quantise(&mut self, src: &[T], dst: &mut [T]) -> usize { if src.len() < 1 || dst.len() != self.clusters.len() { - return; + return 0; } let mut old_cb = vec![T::default(); self.clusters.len()]; let mut prev_dist = std::u64::MAX; @@ -176,6 +176,7 @@ impl<T: VQElement+Default, TS: VQElementSum<T>> ELBG<T, TS> { entries.push(Entry { val: lastval, count: run }); drop(elements); + let mut cw_count = 0; let mut low_u: Vec<usize> = Vec::with_capacity(self.clusters.len()); let mut high_u: Vec<usize> = Vec::with_capacity(self.clusters.len()); let mut rng = RNG::new(); @@ -183,10 +184,19 @@ impl<T: VQElement+Default, TS: VQElementSum<T>> ELBG<T, TS> { let mut do_elbg_step = true; while (iterations < 20) && (dist < prev_dist - prev_dist / 100) { prev_dist = dist; - for i in 0..dst.len() { - old_cb[i] = self.clusters[i].centroid; - self.clusters[i].reset(); + + cw_count = 0; + for cluster in self.clusters.iter() { + if cluster.count == 0 { + continue; + } + old_cb[cw_count] = cluster.centroid; + cw_count += 1; + } + for cluster in self.clusters.iter_mut() { + cluster.reset(); } + // put points into the nearest clusters indices.truncate(0); for entry in entries.iter() { @@ -279,10 +289,16 @@ impl<T: VQElement+Default, TS: VQElementSum<T>> ELBG<T, TS> { iterations += 1; } if dist < prev_dist { - for i in 0..dst.len() { - old_cb[i] = self.clusters[i].centroid; + cw_count = 0; + for cluster in self.clusters.iter() { + if cluster.count == 0 { + continue; + } + old_cb[cw_count] = cluster.centroid; + cw_count += 1; } } dst.copy_from_slice(&old_cb); + cw_count } } |