blob: aa5c71b4ee65797d7d01235f4dfa232f8358fc72
1 | #include <linux/kernel.h> |
2 | #include <linux/types.h> |
3 | #include <linux/vmalloc.h> |
4 | #include <linux/mm.h> |
5 | #include <linux/string.h> |
6 | |
7 | #include "common.h" |
8 | #include "pixfmt.h" |
9 | |
10 | const u8 ff_zigzag_direct[64] = { |
11 | 0, 1, 8, 16, 9, 2, 3, 10, |
12 | 17, 24, 32, 25, 18, 11, 4, 5, |
13 | 12, 19, 26, 33, 40, 48, 41, 34, |
14 | 27, 20, 13, 6, 7, 14, 21, 28, |
15 | 35, 42, 49, 56, 57, 50, 43, 36, |
16 | 29, 22, 15, 23, 30, 37, 44, 51, |
17 | 58, 59, 52, 45, 38, 31, 39, 46, |
18 | 53, 60, 61, 54, 47, 55, 62, 63 |
19 | }; |
20 | |
21 | const u8 ff_zigzag_scan[16 + 1] = { |
22 | 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4, |
23 | 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4, |
24 | 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4, |
25 | 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4, |
26 | }; |
27 | |
28 | const char * const color_space_names[] = { |
29 | [AVCOL_SPC_RGB] = "gbr", |
30 | [AVCOL_SPC_BT709] = "bt709", |
31 | [AVCOL_SPC_UNSPECIFIED] = "unknown", |
32 | [AVCOL_SPC_RESERVED] = "reserved", |
33 | [AVCOL_SPC_FCC] = "fcc", |
34 | [AVCOL_SPC_BT470BG] = "bt470bg", |
35 | [AVCOL_SPC_SMPTE170M] = "smpte170m", |
36 | [AVCOL_SPC_SMPTE240M] = "smpte240m", |
37 | [AVCOL_SPC_YCGCO] = "ycgco", |
38 | [AVCOL_SPC_BT2020_NCL] = "bt2020nc", |
39 | [AVCOL_SPC_BT2020_CL] = "bt2020c", |
40 | [AVCOL_SPC_SMPTE2085] = "smpte2085", |
41 | [AVCOL_SPC_CHROMA_DERIVED_NCL] = "chroma-derived-nc", |
42 | [AVCOL_SPC_CHROMA_DERIVED_CL] = "chroma-derived-c", |
43 | [AVCOL_SPC_ICTCP] = "ictcp", |
44 | }; |
45 | |
46 | const char *av_color_space_name(enum AVColorSpace space) |
47 | { |
48 | return (unsigned) space < AVCOL_SPC_NB ? |
49 | color_space_names[space] : NULL; |
50 | } |
51 | |
52 | const char * const color_primaries_names[AVCOL_PRI_NB] = { |
53 | [AVCOL_PRI_RESERVED0] = "reserved", |
54 | [AVCOL_PRI_BT709] = "bt709", |
55 | [AVCOL_PRI_UNSPECIFIED] = "unknown", |
56 | [AVCOL_PRI_RESERVED] = "reserved", |
57 | [AVCOL_PRI_BT470M] = "bt470m", |
58 | [AVCOL_PRI_BT470BG] = "bt470bg", |
59 | [AVCOL_PRI_SMPTE170M] = "smpte170m", |
60 | [AVCOL_PRI_SMPTE240M] = "smpte240m", |
61 | [AVCOL_PRI_FILM] = "film", |
62 | [AVCOL_PRI_BT2020] = "bt2020", |
63 | [AVCOL_PRI_SMPTE428] = "smpte428", |
64 | [AVCOL_PRI_SMPTE431] = "smpte431", |
65 | [AVCOL_PRI_SMPTE432] = "smpte432", |
66 | [AVCOL_PRI_JEDEC_P22] = "jedec-p22", |
67 | }; |
68 | |
69 | const char *av_color_primaries_name(enum AVColorPrimaries primaries) |
70 | { |
71 | return (unsigned) primaries < AVCOL_PRI_NB ? |
72 | color_primaries_names[primaries] : NULL; |
73 | } |
74 | |
75 | const char * const color_transfer_names[] = { |
76 | [AVCOL_TRC_RESERVED0] = "reserved", |
77 | [AVCOL_TRC_BT709] = "bt709", |
78 | [AVCOL_TRC_UNSPECIFIED] = "unknown", |
79 | [AVCOL_TRC_RESERVED] = "reserved", |
80 | [AVCOL_TRC_GAMMA22] = "bt470m", |
81 | [AVCOL_TRC_GAMMA28] = "bt470bg", |
82 | [AVCOL_TRC_SMPTE170M] = "smpte170m", |
83 | [AVCOL_TRC_SMPTE240M] = "smpte240m", |
84 | [AVCOL_TRC_LINEAR] = "linear", |
85 | [AVCOL_TRC_LOG] = "log100", |
86 | [AVCOL_TRC_LOG_SQRT] = "log316", |
87 | [AVCOL_TRC_IEC61966_2_4] = "iec61966-2-4", |
88 | [AVCOL_TRC_BT1361_ECG] = "bt1361e", |
89 | [AVCOL_TRC_IEC61966_2_1] = "iec61966-2-1", |
90 | [AVCOL_TRC_BT2020_10] = "bt2020-10", |
91 | [AVCOL_TRC_BT2020_12] = "bt2020-12", |
92 | [AVCOL_TRC_SMPTE2084] = "smpte2084", |
93 | [AVCOL_TRC_SMPTE428] = "smpte428", |
94 | [AVCOL_TRC_ARIB_STD_B67] = "arib-std-b67", |
95 | }; |
96 | |
97 | const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer) |
98 | { |
99 | return (unsigned) transfer < AVCOL_TRC_NB ? |
100 | color_transfer_names[transfer] : NULL; |
101 | } |
102 | |
103 | //math |
104 | const u8 ff_log2_tab[256]={ |
105 | 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, |
106 | 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, |
107 | 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
108 | 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
109 | 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
110 | 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
111 | 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
112 | 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 |
113 | }; |
114 | |
115 | int av_log2(u32 v) |
116 | { |
117 | int n = 0; |
118 | |
119 | if (v & 0xffff0000) { |
120 | v >>= 16; |
121 | n += 16; |
122 | } |
123 | if (v & 0xff00) { |
124 | v >>= 8; |
125 | n += 8; |
126 | } |
127 | n += ff_log2_tab[v]; |
128 | |
129 | return n; |
130 | } |
131 | |
132 | //bitstream |
133 | int find_start_code(u8 *data, int data_sz) |
134 | { |
135 | if (data_sz > 3 && data[0] == 0 && data[1] == 0 && data[2] == 1) |
136 | return 3; |
137 | |
138 | if (data_sz > 4 && data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 1) |
139 | return 4; |
140 | |
141 | return -1; |
142 | } |
143 | |
144 | int calc_nal_len(u8 *data, int len) |
145 | { |
146 | int i; |
147 | |
148 | for (i = 0; i < len - 4; i++) { |
149 | if (data[i]) |
150 | continue; |
151 | |
152 | if ((data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 1) || |
153 | (data[i] == 0 && data[i + 1] == 0 && |
154 | data[i + 2]==0 && data[i + 3] == 1)) |
155 | return i; |
156 | } |
157 | return len; //Not find the end of nalu |
158 | } |
159 | |
160 | u8 *nal_unit_extract_rbsp(const u8 *src, u32 src_len, u32 *dst_len) |
161 | { |
162 | u8 *dst; |
163 | u32 i, len; |
164 | |
165 | dst = vmalloc(src_len + AV_INPUT_BUFFER_PADDING_SIZE); |
166 | if (!dst) |
167 | return NULL; |
168 | |
169 | /* NAL unit header (2 bytes) */ |
170 | i = len = 0; |
171 | while (i < 2 && i < src_len) |
172 | dst[len++] = src[i++]; |
173 | |
174 | while (i + 2 < src_len) |
175 | if (!src[i] && !src[i + 1] && src[i + 2] == 3) { |
176 | dst[len++] = src[i++]; |
177 | dst[len++] = src[i++]; |
178 | i++; // remove emulation_prevention_three_byte |
179 | } else |
180 | dst[len++] = src[i++]; |
181 | |
182 | while (i < src_len) |
183 | dst[len++] = src[i++]; |
184 | |
185 | memset(dst + len, 0, AV_INPUT_BUFFER_PADDING_SIZE); |
186 | |
187 | *dst_len = len; |
188 | |
189 | return dst; |
190 | } |
191 | |
192 | //debug |
193 | static void _pr_hex(const char *fmt, ...) |
194 | { |
195 | u8 buf[512]; |
196 | int len = 0; |
197 | |
198 | va_list args; |
199 | va_start(args, fmt); |
200 | vsnprintf(buf + len, 512 - len, fmt, args); |
201 | printk("%s", buf); |
202 | va_end(args); |
203 | } |
204 | |
205 | void print_hex_debug(u8 *data, u32 len, int max) |
206 | { |
207 | int i, l; |
208 | |
209 | l = len > max ? max : len; |
210 | |
211 | for (i = 0; i < l; i++) { |
212 | if ((i & 0xf) == 0) |
213 | _pr_hex("%06x:", i); |
214 | _pr_hex("%02x ", data[i]); |
215 | if ((((i + 1) & 0xf) == 0) || ((i + 1) == l)) |
216 | _pr_hex("\n"); |
217 | } |
218 | |
219 | _pr_hex("print hex ending. len %d\n\n", l); |
220 | } |
221 | |
222 |