rav1e/
stats.rs

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 = [0; PREDICTION_MODES];
39    let chroma_pred_mode_counts = [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 = 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}