xref: /xiu/library/container/flv/src/define.rs (revision 8901d335)
1 use bytes::BytesMut;
2 use serde::Serialize;
3 
4 #[derive(Debug, Clone, Serialize, Default)]
5 pub enum SoundFormat {
6     #[default]
7     AAC = 10,
8 }
9 
10 pub mod aac_packet_type {
11     pub const AAC_SEQHDR: u8 = 0;
12     pub const AAC_RAW: u8 = 1;
13 }
14 
15 pub mod avc_packet_type {
16     pub const AVC_SEQHDR: u8 = 0;
17     pub const AVC_NALU: u8 = 1;
18     pub const AVC_EOS: u8 = 2;
19 }
20 
21 pub mod frame_type {
22     /*
23         1: keyframe (for AVC, a seekable frame)
24         2: inter frame (for AVC, a non- seekable frame)
25         3: disposable inter frame (H.263 only)
26         4: generated keyframe (reserved for server use only)
27         5: video info/command frame
28     */
29     pub const KEY_FRAME: u8 = 1;
30     pub const INTER_FRAME: u8 = 2;
31 }
32 
33 #[derive(Debug, Clone, Serialize, Default)]
34 pub enum AvcCodecId {
35     #[default]
36     UNKNOWN = 0,
37     H264 = 7,
38     HEVC = 12,
39 }
40 
u8_2_avc_codec_id(codec_id: u8) -> AvcCodecId41 pub fn u8_2_avc_codec_id(codec_id: u8) -> AvcCodecId {
42     match codec_id {
43         7_u8 => AvcCodecId::H264,
44         12_u8 => AvcCodecId::HEVC,
45         _ => AvcCodecId::UNKNOWN,
46     }
47 }
48 
49 pub mod tag_type {
50     pub const AUDIO: u8 = 8;
51     pub const VIDEO: u8 = 9;
52     pub const SCRIPT_DATA_AMF: u8 = 18;
53 }
54 
55 pub mod h264_nal_type {
56     pub const H264_NAL_IDR: u8 = 5;
57     pub const H264_NAL_SPS: u8 = 7;
58     pub const H264_NAL_PPS: u8 = 8;
59     pub const H264_NAL_AUD: u8 = 9;
60 }
61 #[derive(Debug, Clone, Serialize, Default)]
62 pub enum AacProfile {
63     // @see @see ISO_IEC_14496-3-AAC-2001.pdf, page 23
64     #[default]
65     UNKNOWN = -1,
66     LC = 2,
67     SSR = 3,
68     // AAC HE = LC+SBR
69     HE = 5,
70     // AAC HEv2 = LC+SBR+PS
71     HEV2 = 29,
72 }
73 
u8_2_aac_profile(profile: u8) -> AacProfile74 pub fn u8_2_aac_profile(profile: u8) -> AacProfile {
75     match profile {
76         2_u8 => AacProfile::LC,
77         3_u8 => AacProfile::SSR,
78         5_u8 => AacProfile::HE,
79         29_u8 => AacProfile::HEV2,
80         _ => AacProfile::UNKNOWN,
81     }
82 }
83 
84 #[derive(Debug, Clone, Serialize, Default)]
85 pub enum AvcProfile {
86     #[default]
87     UNKNOWN = -1,
88     // @see ffmpeg, libavcodec/avcodec.h:2713
89     Baseline = 66,
90     Main = 77,
91     Extended = 88,
92     High = 100,
93 }
94 
u8_2_avc_profile(profile: u8) -> AvcProfile95 pub fn u8_2_avc_profile(profile: u8) -> AvcProfile {
96     match profile {
97         66_u8 => AvcProfile::Baseline,
98         77_u8 => AvcProfile::Main,
99         88_u8 => AvcProfile::Extended,
100         100_u8 => AvcProfile::High,
101         _ => AvcProfile::UNKNOWN,
102     }
103 }
104 
105 #[derive(Debug, Clone, Serialize, Default)]
106 pub enum AvcLevel {
107     #[default]
108     UNKNOWN = -1,
109     #[serde(rename = "1.0")]
110     Level1 = 10,
111     #[serde(rename = "1.1")]
112     Level11 = 11,
113     #[serde(rename = "1.2")]
114     Level12 = 12,
115     #[serde(rename = "1.3")]
116     Level13 = 13,
117     #[serde(rename = "2.0")]
118     Level2 = 20,
119     #[serde(rename = "2.1")]
120     Level21 = 21,
121     #[serde(rename = "2.2")]
122     Level22 = 22,
123     #[serde(rename = "3.0")]
124     Level3 = 30,
125     #[serde(rename = "3.1")]
126     Level31 = 31,
127     #[serde(rename = "3.2")]
128     Level32 = 32,
129     #[serde(rename = "4.0")]
130     Level4 = 40,
131     #[serde(rename = "4.1")]
132     Level41 = 41,
133     #[serde(rename = "5.0")]
134     Level5 = 50,
135     #[serde(rename = "5.1")]
136     Level51 = 51,
137 }
138 
u8_2_avc_level(profile: u8) -> AvcLevel139 pub fn u8_2_avc_level(profile: u8) -> AvcLevel {
140     match profile {
141         10_u8 => AvcLevel::Level1,
142         11_u8 => AvcLevel::Level11,
143         12_u8 => AvcLevel::Level12,
144         13_u8 => AvcLevel::Level13,
145         20_u8 => AvcLevel::Level2,
146         21_u8 => AvcLevel::Level21,
147         22_u8 => AvcLevel::Level22,
148         30_u8 => AvcLevel::Level3,
149         31_u8 => AvcLevel::Level31,
150         32_u8 => AvcLevel::Level32,
151         40_u8 => AvcLevel::Level4,
152         41_u8 => AvcLevel::Level41,
153         50_u8 => AvcLevel::Level5,
154         51_u8 => AvcLevel::Level51,
155 
156         _ => AvcLevel::UNKNOWN,
157     }
158 }
159 
160 pub enum FlvData {
161     Video { timestamp: u32, data: BytesMut },
162     Audio { timestamp: u32, data: BytesMut },
163     MetaData { timestamp: u32, data: BytesMut },
164 }
165