v_frame/
frame.rs

1// Copyright (c) 2018-2020, 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::math::*;
11use crate::pixel::*;
12use crate::plane::*;
13
14#[cfg(feature = "serialize")]
15use serde::{Deserialize, Serialize};
16
17/// Represents a raw video frame
18#[derive(Debug, Clone, Eq, PartialEq)]
19#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
20pub struct Frame<T: Pixel> {
21    /// Planes constituting the frame.
22    pub planes: [Plane<T>; 3],
23}
24
25impl<T: Pixel> Frame<T> {
26    /// Creates a new frame with the given parameters.
27    ///
28    /// Allocates data for the planes.
29    pub fn new_with_padding(
30        width: usize,
31        height: usize,
32        chroma_sampling: ChromaSampling,
33        luma_padding: usize,
34    ) -> Self {
35        let luma_width = width.align_power_of_two(3);
36        let luma_height = height.align_power_of_two(3);
37
38        let (chroma_decimation_x, chroma_decimation_y) =
39            chroma_sampling.get_decimation().unwrap_or((0, 0));
40        let (chroma_width, chroma_height) =
41            chroma_sampling.get_chroma_dimensions(luma_width, luma_height);
42        let chroma_padding_x = luma_padding >> chroma_decimation_x;
43        let chroma_padding_y = luma_padding >> chroma_decimation_y;
44
45        Frame {
46            planes: [
47                Plane::new(luma_width, luma_height, 0, 0, luma_padding, luma_padding),
48                Plane::new(
49                    chroma_width,
50                    chroma_height,
51                    chroma_decimation_x,
52                    chroma_decimation_y,
53                    chroma_padding_x,
54                    chroma_padding_y,
55                ),
56                Plane::new(
57                    chroma_width,
58                    chroma_height,
59                    chroma_decimation_x,
60                    chroma_decimation_y,
61                    chroma_padding_x,
62                    chroma_padding_y,
63                ),
64            ],
65        }
66    }
67}