1// Copyright (c) 2019-2022, The rav1e contributors. All rights reserved
2//
3// This source code is subject to the terms of the BSD 2 Clause License and
4// the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
5// was not distributed with this source code in the LICENSE file, you can
6// obtain it at www.aomedia.org/license/software. If the Alliance for Open
7// Media Patent License 1.0 was not distributed with this source code in the
8// PATENTS file, you can obtain it at www.aomedia.org/license/patent.
9
10use crate::partition::BlockSize;
11use crate::predict::PREDICTION_MODES;
12use crate::serialize::{Deserialize, Serialize};
13use crate::transform::TX_TYPES;
14
15#[cfg(feature = "serialize")]
16use serde_big_array::BigArray;
17
18use std::ops::{Add, AddAssign};
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub struct EncoderStats {
22 /// Stores count of pixels belonging to each block size in this frame
23 pub block_size_counts: [usize; BlockSize::BLOCK_SIZES_ALL],
24 /// Stores count of pixels belonging to skip blocks in this frame
25 pub skip_block_count: usize,
26 /// Stores count of pixels belonging to each transform type in this frame
27 pub tx_type_counts: [usize; TX_TYPES],
28 /// Stores count of pixels belonging to each luma prediction mode in this frame
29 #[serde(with = "BigArray")]
30 pub luma_pred_mode_counts: [usize; PREDICTION_MODES],
31 /// Stores count of pixels belonging to each chroma prediction mode in this frame
32 #[serde(with = "BigArray")]
33 pub chroma_pred_mode_counts: [usize; PREDICTION_MODES],
34}
35
36impl Default for EncoderStats {
37 fn default() -> Self {
38 let luma_pred_mode_counts: [usize; 34] = [0; PREDICTION_MODES];
39 let chroma_pred_mode_counts: [usize; 34] = [0; PREDICTION_MODES];
40 EncoderStats {
41 block_size_counts: [0; BlockSize::BLOCK_SIZES_ALL],
42 skip_block_count: 0,
43 tx_type_counts: [0; TX_TYPES],
44 luma_pred_mode_counts,
45 chroma_pred_mode_counts,
46 }
47 }
48}
49
50impl Add<&Self> for EncoderStats {
51 type Output = Self;
52
53 fn add(self, rhs: &EncoderStats) -> Self::Output {
54 let mut lhs: EncoderStats = self;
55 lhs += rhs;
56 lhs
57 }
58}
59
60impl AddAssign<&Self> for EncoderStats {
61 fn add_assign(&mut self, rhs: &EncoderStats) {
62 for (s, v) in
63 self.block_size_counts.iter_mut().zip(rhs.block_size_counts.iter())
64 {
65 *s += v;
66 }
67 for (s, v) in self
68 .chroma_pred_mode_counts
69 .iter_mut()
70 .zip(rhs.chroma_pred_mode_counts.iter())
71 {
72 *s += v;
73 }
74 for (s, v) in self
75 .luma_pred_mode_counts
76 .iter_mut()
77 .zip(rhs.luma_pred_mode_counts.iter())
78 {
79 *s += v;
80 }
81 for (s, v) in self.tx_type_counts.iter_mut().zip(rhs.tx_type_counts.iter())
82 {
83 *s += v;
84 }
85 self.skip_block_count += rhs.skip_block_count;
86 }
87}
88