fuchsia_stream_processors/
types.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_table_validation::*;
6
7use fidl_fuchsia_media::{
8    Packet, PacketHeader, StreamBufferConstraints, StreamBufferSettings, StreamOutputConstraints,
9};
10
11#[derive(ValidFidlTable)]
12#[fidl_table_src(StreamBufferConstraints)]
13#[fidl_table_validator(StreamBufferConstraintsValidator)]
14pub struct ValidStreamBufferConstraints {
15    pub buffer_constraints_version_ordinal: u64,
16    #[fidl_field_type(optional)]
17    pub default_settings: Option<StreamBufferSettings>,
18    #[fidl_field_type(optional)]
19    pub per_packet_buffer_bytes_min: Option<u32>,
20    #[fidl_field_type(optional)]
21    pub per_packet_buffer_bytes_recommended: Option<u32>,
22    #[fidl_field_type(optional)]
23    pub per_packet_buffer_bytes_max: Option<u32>,
24    #[fidl_field_type(optional)]
25    pub packet_count_for_server_min: Option<u32>,
26    #[fidl_field_type(optional)]
27    pub packet_count_for_server_recommended: Option<u32>,
28    #[fidl_field_type(optional)]
29    pub packet_count_for_server_recommended_max: Option<u32>,
30    #[fidl_field_type(optional)]
31    pub packet_count_for_server_max: Option<u32>,
32    #[fidl_field_type(optional)]
33    pub packet_count_for_client_min: Option<u32>,
34    #[fidl_field_type(optional)]
35    pub packet_count_for_client_max: Option<u32>,
36    #[fidl_field_type(optional)]
37    pub single_buffer_mode_allowed: Option<bool>,
38    #[fidl_field_type(optional)]
39    pub is_physically_contiguous_required: Option<bool>,
40}
41
42pub struct StreamBufferConstraintsValidator;
43
44#[derive(Debug)]
45pub enum StreamBufferConstraintsError {
46    VersionOrdinalZero,
47    SingleBufferMode,
48    ConstraintsNoBtiHandleForPhysicalBuffers,
49}
50
51impl Validate<ValidStreamBufferConstraints> for StreamBufferConstraintsValidator {
52    type Error = StreamBufferConstraintsError;
53    fn validate(candidate: &ValidStreamBufferConstraints) -> std::result::Result<(), Self::Error> {
54        if candidate.buffer_constraints_version_ordinal == 0 {
55            // An ordinal of 0 in StreamBufferConstraints is not allowed.
56            return Err(StreamBufferConstraintsError::VersionOrdinalZero);
57        }
58
59        Ok(())
60    }
61}
62
63#[derive(ValidFidlTable)]
64#[fidl_table_src(StreamOutputConstraints)]
65pub struct ValidStreamOutputConstraints {
66    pub stream_lifetime_ordinal: u64,
67    pub buffer_constraints_action_required: bool,
68    pub buffer_constraints: ValidStreamBufferConstraints,
69}
70
71#[derive(ValidFidlTable, Clone, Copy, Debug, PartialEq)]
72#[fidl_table_src(PacketHeader)]
73pub struct ValidPacketHeader {
74    pub buffer_lifetime_ordinal: u64,
75    pub packet_index: u32,
76}
77
78#[derive(ValidFidlTable, Clone, Copy, Debug, PartialEq)]
79#[fidl_table_src(Packet)]
80pub struct ValidPacket {
81    pub header: ValidPacketHeader,
82    pub buffer_index: u32,
83    pub stream_lifetime_ordinal: u64,
84    pub start_offset: u32,
85    pub valid_length_bytes: u32,
86    #[fidl_field_type(optional)]
87    pub timestamp_ish: Option<u64>,
88    #[fidl_field_type(default = false)]
89    pub start_access_unit: bool,
90    #[fidl_field_type(default = false)]
91    pub known_end_access_unit: bool,
92}
93
94#[cfg(test)]
95mod test {
96
97    use super::*;
98
99    #[test]
100    fn validate_stream_buffer_constraints() {
101        let invalid_version_ordinal = StreamBufferConstraints {
102            buffer_constraints_version_ordinal: Some(0),
103            ..Default::default()
104        };
105
106        let err = ValidStreamBufferConstraints::try_from(invalid_version_ordinal);
107
108        assert!(err.is_err());
109
110        let invalid_single_buffer = StreamBufferConstraints {
111            buffer_constraints_version_ordinal: Some(0),
112            ..Default::default()
113        };
114
115        let err = ValidStreamBufferConstraints::try_from(invalid_single_buffer);
116
117        assert!(err.is_err());
118
119        let invalid_continuous = StreamBufferConstraints {
120            buffer_constraints_version_ordinal: Some(0),
121            ..Default::default()
122        };
123
124        let err = ValidStreamBufferConstraints::try_from(invalid_continuous);
125
126        assert!(err.is_err());
127    }
128}