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