1 /*
2 * Copyright 2015 Rockchip Electronics Co. LTD
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <string.h>
18
19 #include "mpp_mem.h"
20 #include "mpp_debug.h"
21 #include "mpp_common.h"
22
23 #include "hal_jpege_hdr.h"
24
25 /* JPEG markers, table B.1 */
26 enum {
27 SOI = 0xFFD8, /* Start of Image */
28 DQT = 0xFFDB, /* Define Quantization Table(s) */
29 SOF0 = 0xFFC0, /* Start of Frame */
30 DRI = 0xFFDD, /* Define Restart Interval */
31 RST0 = 0xFFD0, /* Restart marker 0 */
32 RST1 = 0xFFD1, /* Restart marker 1 */
33 RST2 = 0xFFD2, /* Restart marker 2 */
34 RST3 = 0xFFD3, /* Restart marker 3 */
35 RST4 = 0xFFD4, /* Restart marker 4 */
36 RST5 = 0xFFD5, /* Restart marker 5 */
37 RST6 = 0xFFD6, /* Restart marker 6 */
38 RST7 = 0xFFD7, /* Restart marker 7 */
39 DHT = 0xFFC4, /* Define Huffman Table(s) */
40 SOS = 0xFFDA, /* Start of Scan */
41 EOI = 0xFFD9, /* End of Image */
42 APP0 = 0xFFE0, /* APP0 Marker */
43 APP7 = 0xFFE7, /* APP7 Marker */
44 COM = 0xFFFE /* Comment marker */
45 };
46
47 enum {
48 JPEGE_NO_UNITS = 0,
49 JPEGE_DOTS_PER_INCH = 1,
50 JPEGE_DOTS_PER_CM = 2
51 };
52
53 enum {
54 JPEGE_SINGLE_MARKER,
55 JPEGE_MULTI_MARKER
56 };
57
58 static const RK_U8 zigzag[64] = {
59 0, 1, 8, 16, 9, 2, 3, 10,
60 17, 24, 32, 25, 18, 11, 4, 5,
61 12, 19, 26, 33, 40, 48, 41, 34,
62 27, 20, 13, 6, 7, 14, 21, 28,
63 35, 42, 49, 56, 57, 50, 43, 36,
64 29, 22, 15, 23, 30, 37, 44, 51,
65 58, 59, 52, 45, 38, 31, 39, 46,
66 53, 60, 61, 54, 47, 55, 62, 63
67 };
68
69 /* Mjpeg quantization tables levels 0-10 */
70 static const RK_U8 qtable_y[11][64] = {
71 {
72 80, 56, 50, 80, 120, 200, 248, 248,
73 60, 60, 72, 96, 136, 248, 248, 248,
74 72, 68, 80, 120, 200, 248, 248, 248,
75 72, 88, 112, 152, 248, 248, 248, 248,
76 92, 112, 192, 248, 248, 248, 248, 248,
77 120, 176, 248, 248, 248, 248, 248, 248,
78 152, 248, 248, 248, 248, 248, 248, 248,
79 248, 248, 248, 248, 248, 248, 248, 248
80 },
81
82 {
83 40, 28, 25, 40, 60, 100, 128, 160,
84 30, 30, 36, 48, 68, 152, 152, 144,
85 36, 34, 40, 60, 100, 144, 176, 144,
86 36, 44, 56, 76, 128, 224, 200, 160,
87 46, 56, 96, 144, 176, 248, 248, 200,
88 60, 88, 144, 160, 208, 248, 248, 232,
89 124, 160, 200, 224, 248, 248, 248, 248,
90 184, 232, 240, 248, 248, 248, 248, 248
91 },
92
93 {
94 27, 18, 17, 27, 40, 68, 88, 104,
95 20, 20, 23, 32, 44, 96, 100, 92,
96 23, 22, 27, 40, 68, 96, 116, 96,
97 23, 28, 38, 48, 88, 144, 136, 104,
98 30, 38, 62, 96, 116, 184, 176, 128,
99 40, 58, 92, 108, 136, 176, 192, 160,
100 84, 108, 136, 144, 176, 208, 200, 168,
101 120, 160, 160, 168, 192, 168, 176, 168
102 },
103
104 {
105 20, 14, 13, 20, 30, 50, 64, 76,
106 15, 15, 18, 24, 34, 76, 76, 72,
107 18, 16, 20, 30, 50, 72, 88, 72,
108 18, 21, 28, 36, 64, 112, 100, 80,
109 23, 28, 46, 72, 88, 136, 136, 96,
110 30, 44, 72, 80, 104, 136, 144, 116,
111 62, 80, 100, 112, 136, 152, 152, 128,
112 92, 116, 120, 124, 144, 128, 136, 124
113 },
114
115 {
116 16, 11, 10, 16, 24, 40, 52, 62,
117 12, 12, 14, 19, 26, 58, 60, 56,
118 14, 13, 16, 24, 40, 58, 72, 56,
119 14, 17, 22, 29, 52, 88, 80, 62,
120 18, 22, 38, 56, 68, 112, 104, 80,
121 24, 36, 56, 64, 84, 104, 116, 92,
122 50, 64, 80, 88, 104, 124, 120, 104,
123 72, 92, 96, 100, 124, 100, 104, 100
124 },
125
126 {
127 13, 9, 8, 13, 19, 32, 42, 50,
128 10, 10, 11, 15, 21, 46, 48, 44,
129 11, 10, 13, 19, 32, 46, 56, 46,
130 11, 14, 18, 23, 42, 72, 64, 50,
131 14, 18, 30, 46, 54, 88, 84, 62,
132 19, 28, 44, 52, 68, 84, 92, 76,
133 40, 52, 62, 72, 84, 100, 96, 84,
134 58, 76, 76, 80, 100, 80, 84, 80
135 },
136
137 {
138 10, 7, 6, 10, 14, 24, 31, 38,
139 7, 7, 8, 11, 16, 36, 36, 34,
140 8, 8, 10, 14, 24, 34, 42, 34,
141 8, 10, 13, 17, 32, 52, 48, 38,
142 11, 13, 22, 34, 42, 68, 62, 46,
143 14, 21, 34, 38, 50, 62, 68, 56,
144 29, 38, 48, 52, 62, 76, 72, 62,
145 44, 56, 58, 60, 68, 60, 62, 60
146 },
147
148 {
149 6, 4, 4, 6, 10, 16, 20, 24,
150 5, 5, 6, 8, 10, 23, 24, 22,
151 6, 5, 6, 10, 16, 23, 28, 22,
152 6, 7, 9, 12, 20, 36, 32, 25,
153 7, 9, 15, 22, 27, 44, 42, 31,
154 10, 14, 22, 26, 32, 42, 46, 38,
155 20, 26, 31, 36, 42, 48, 48, 40,
156 29, 38, 38, 40, 46, 40, 42, 40
157 },
158
159 {
160 3, 2, 2, 3, 5, 8, 10, 12,
161 2, 2, 3, 4, 5, 12, 12, 11,
162 3, 3, 3, 5, 8, 11, 14, 11,
163 3, 3, 4, 6, 10, 17, 16, 12,
164 4, 4, 7, 11, 14, 22, 21, 15,
165 5, 7, 11, 13, 16, 21, 23, 18,
166 10, 13, 16, 17, 21, 24, 24, 20,
167 14, 18, 19, 20, 22, 20, 21, 20
168 },
169
170 {
171 1, 1, 1, 1, 2, 3, 3, 4,
172 1, 1, 1, 1, 2, 4, 4, 4,
173 1, 1, 1, 2, 3, 4, 5, 4,
174 1, 1, 1, 2, 3, 6, 5, 4,
175 1, 1, 2, 4, 5, 7, 7, 5,
176 2, 2, 4, 4, 5, 7, 8, 6,
177 3, 4, 5, 6, 7, 8, 8, 7,
178 5, 6, 6, 7, 7, 7, 7, 7
179 },
180
181 {
182 1, 1, 1, 1, 1, 1, 1, 1,
183 1, 1, 1, 1, 1, 1, 1, 1,
184 1, 1, 1, 1, 1, 1, 1, 1,
185 1, 1, 1, 1, 1, 1, 1, 1,
186 1, 1, 1, 1, 1, 1, 1, 1,
187 1, 1, 1, 1, 1, 1, 1, 1,
188 1, 1, 1, 1, 1, 1, 1, 1,
189 1, 1, 1, 1, 1, 1, 1, 1
190 }
191 };
192
193 static const RK_U8 qtable_c[11][64] = {
194 {
195 88, 92, 120, 240, 248, 248, 248, 248,
196 92, 108, 136, 248, 248, 248, 248, 248,
197 120, 136, 248, 248, 248, 248, 248, 248,
198 240, 248, 248, 248, 248, 248, 248, 248,
199 248, 248, 248, 248, 248, 248, 248, 248,
200 248, 248, 248, 248, 248, 248, 248, 248,
201 248, 248, 248, 248, 248, 248, 248, 248,
202 248, 248, 248, 248, 248, 248, 248, 248
203 },
204
205 {
206 44, 46, 60, 120, 248, 248, 248, 248,
207 46, 54, 68, 168, 248, 248, 248, 248,
208 60, 66, 144, 248, 248, 248, 248, 248,
209 120, 168, 248, 248, 248, 248, 248, 248,
210 248, 248, 248, 248, 248, 248, 248, 248,
211 248, 248, 248, 248, 248, 248, 248, 248,
212 248, 248, 248, 248, 248, 248, 248, 248,
213 248, 248, 248, 248, 248, 248, 248, 248
214 },
215
216 {
217 28, 30, 40, 80, 168, 168, 168, 168,
218 30, 36, 44, 112, 168, 168, 168, 168,
219 40, 44, 96, 168, 168, 168, 168, 168,
220 80, 112, 168, 168, 168, 168, 168, 168,
221 168, 168, 168, 168, 168, 168, 168, 168,
222 168, 168, 168, 168, 168, 168, 168, 168,
223 168, 168, 168, 168, 168, 168, 168, 168,
224 168, 168, 168, 168, 168, 168, 168, 168
225 },
226
227 {
228 21, 23, 30, 60, 124, 124, 124, 124,
229 23, 26, 34, 84, 124, 124, 124, 124,
230 30, 34, 72, 124, 124, 124, 124, 124,
231 60, 84, 124, 124, 124, 124, 124, 124,
232 124, 124, 124, 124, 124, 124, 124, 124,
233 124, 124, 124, 124, 124, 124, 124, 124,
234 124, 124, 124, 124, 124, 124, 124, 124,
235 124, 124, 124, 124, 124, 124, 124, 124
236 },
237
238 {
239 17, 18, 24, 48, 100, 100, 100, 100,
240 18, 21, 26, 68, 100, 100, 100, 100,
241 24, 26, 56, 100, 100, 100, 100, 100,
242 48, 68, 100, 100, 100, 100, 100, 100,
243 100, 100, 100, 100, 100, 100, 100, 100,
244 100, 100, 100, 100, 100, 100, 100, 100,
245 100, 100, 100, 100, 100, 100, 100, 100,
246 100, 100, 100, 100, 100, 100, 100, 100
247 },
248
249 {
250 14, 14, 19, 38, 80, 80, 80, 80,
251 14, 17, 21, 54, 80, 80, 80, 80,
252 19, 21, 46, 80, 80, 80, 80, 80,
253 38, 54, 80, 80, 80, 80, 80, 80,
254 80, 80, 80, 80, 80, 80, 80, 80,
255 80, 80, 80, 80, 80, 80, 80, 80,
256 80, 80, 80, 80, 80, 80, 80, 80,
257 80, 80, 80, 80, 80, 80, 80, 80
258 },
259
260 {
261 10, 11, 14, 28, 60, 60, 60, 60,
262 11, 13, 16, 40, 60, 60, 60, 60,
263 14, 16, 34, 60, 60, 60, 60, 60,
264 28, 40, 60, 60, 60, 60, 60, 60,
265 60, 60, 60, 60, 60, 60, 60, 60,
266 60, 60, 60, 60, 60, 60, 60, 60,
267 60, 60, 60, 60, 60, 60, 60, 60,
268 60, 60, 60, 60, 60, 60, 60, 60
269 },
270
271 {
272 7, 7, 10, 19, 40, 40, 40, 40,
273 7, 8, 10, 26, 40, 40, 40, 40,
274 10, 10, 22, 40, 40, 40, 40, 40,
275 19, 26, 40, 40, 40, 40, 40, 40,
276 40, 40, 40, 40, 40, 40, 40, 40,
277 40, 40, 40, 40, 40, 40, 40, 40,
278 40, 40, 40, 40, 40, 40, 40, 40,
279 40, 40, 40, 40, 40, 40, 40, 40
280 },
281
282 {
283 3, 4, 5, 9, 20, 20, 20, 20,
284 4, 4, 5, 13, 20, 20, 20, 20,
285 5, 5, 11, 20, 20, 20, 20, 20,
286 9, 13, 20, 20, 20, 20, 20, 20,
287 20, 20, 20, 20, 20, 20, 20, 20,
288 20, 20, 20, 20, 20, 20, 20, 20,
289 20, 20, 20, 20, 20, 20, 20, 20,
290 20, 20, 20, 20, 20, 20, 20, 20
291 },
292
293 {
294 1, 1, 2, 3, 7, 7, 7, 7,
295 1, 1, 2, 4, 7, 7, 7, 7,
296 2, 2, 4, 7, 7, 7, 7, 7,
297 3, 4, 7, 7, 7, 7, 7, 7,
298 7, 7, 7, 7, 7, 7, 7, 7,
299 7, 7, 7, 7, 7, 7, 7, 7,
300 7, 7, 7, 7, 7, 7, 7, 7,
301 7, 7, 7, 7, 7, 7, 7, 7
302 },
303
304 {
305 1, 1, 1, 1, 1, 1, 1, 1,
306 1, 1, 1, 1, 1, 1, 1, 1,
307 1, 1, 1, 1, 1, 1, 1, 1,
308 1, 1, 1, 1, 1, 1, 1, 1,
309 1, 1, 1, 1, 1, 1, 1, 1,
310 1, 1, 1, 1, 1, 1, 1, 1,
311 1, 1, 1, 1, 1, 1, 1, 1,
312 1, 1, 1, 1, 1, 1, 1, 1
313 }
314 };
315
316 /*
317 * from RFC435 spec.
318 */
319 const RK_U8 jpege_luma_quantizer[QUANTIZE_TABLE_SIZE] = {
320 16, 11, 10, 16, 24, 40, 51, 61,
321 12, 12, 14, 19, 26, 58, 60, 55,
322 14, 13, 16, 24, 40, 57, 69, 56,
323 14, 17, 22, 29, 51, 87, 80, 62,
324 18, 22, 37, 56, 68, 109, 103, 77,
325 24, 35, 55, 64, 81, 104, 113, 92,
326 49, 64, 78, 87, 103, 121, 120, 101,
327 72, 92, 95, 98, 112, 100, 103, 99
328 };
329
330 const RK_U8 jpege_chroma_quantizer[QUANTIZE_TABLE_SIZE] = {
331 17, 18, 24, 47, 99, 99, 99, 99,
332 18, 21, 26, 66, 99, 99, 99, 99,
333 24, 26, 56, 99, 99, 99, 99, 99,
334 47, 66, 99, 99, 99, 99, 99, 99,
335 99, 99, 99, 99, 99, 99, 99, 99,
336 99, 99, 99, 99, 99, 99, 99, 99,
337 99, 99, 99, 99, 99, 99, 99, 99,
338 99, 99, 99, 99, 99, 99, 99, 99
339 };
340
341 typedef struct {
342 RK_U32 Ci[MAX_NUMBER_OF_COMPONENTS];
343 RK_U32 Hi[MAX_NUMBER_OF_COMPONENTS];
344 RK_U32 Vi[MAX_NUMBER_OF_COMPONENTS];
345 RK_U32 Tqi[MAX_NUMBER_OF_COMPONENTS];
346 } JpegeColorInfo;
347
348 typedef struct {
349 RK_U32 val_y;
350 RK_U32 val_c;
351 } JpegeHuffmanTable;
352
353 static const JpegeHuffmanTable dc_li[16] = {
354 {0x00, 0x00},
355 {0x01, 0x03},
356 {0x05, 0x01},
357 {0x01, 0x01},
358 {0x01, 0x01},
359 {0x01, 0x01},
360 {0x01, 0x01},
361 {0x01, 0x01},
362 {0x01, 0x01},
363 {0x00, 0x01},
364 {0x00, 0x01},
365 {0x00, 0x00},
366 {0x00, 0x00},
367 {0x00, 0x00},
368 {0x00, 0x00},
369 {0x00, 0x00}
370 };
371
372 static const JpegeHuffmanTable dc_vij[12] = {
373 {0x00, 0x00},
374 {0x01, 0x01},
375 {0x02, 0x02},
376 {0x03, 0x03},
377 {0x04, 0x04},
378 {0x05, 0x05},
379 {0x06, 0x06},
380 {0x07, 0x07},
381 {0x08, 0x08},
382 {0x09, 0x09},
383 {0x0A, 0x0A},
384 {0x0B, 0x0B},
385 };
386
387 static const JpegeHuffmanTable ac_li[16] = {
388 {0x00, 0x00},
389 {0x02, 0x02},
390 {0x01, 0x01},
391 {0x03, 0x02},
392 {0x03, 0x04},
393 {0x02, 0x04},
394 {0x04, 0x03},
395 {0x03, 0x04},
396 {0x05, 0x07},
397 {0x05, 0x05},
398 {0x04, 0x04},
399 {0x04, 0x04},
400 {0x00, 0x00},
401 {0x00, 0x01},
402 {0x01, 0x02},
403 {0x7D, 0x77}
404 };
405
406 static const JpegeHuffmanTable ac_vij[162] = {
407 {0x01, 0x00},
408 {0x02, 0x01},
409 {0x03, 0x02},
410 {0x00, 0x03},
411 {0x04, 0x11},
412 {0x11, 0x04},
413 {0x05, 0x05},
414 {0x12, 0x21},
415 {0x21, 0x31},
416 {0x31, 0x06},
417 {0x41, 0x12},
418 {0x06, 0x41},
419 {0x13, 0x51},
420 {0x51, 0x07},
421 {0x61, 0x61},
422 {0x07, 0x71},
423 {0x22, 0x13},
424 {0x71, 0x22},
425 {0x14, 0x32},
426 {0x32, 0x81},
427 {0x81, 0x08},
428 {0x91, 0x14},
429 {0xA1, 0x42},
430 {0x08, 0x91},
431 {0x23, 0xA1},
432 {0x42, 0xB1},
433 {0xB1, 0xC1},
434 {0xC1, 0x09},
435 {0x15, 0x23},
436 {0x52, 0x33},
437 {0xD1, 0x52},
438 {0xF0, 0xF0},
439 {0x24, 0x15},
440 {0x33, 0x62},
441 {0x62, 0x72},
442 {0x72, 0xD1},
443 {0x82, 0x0A},
444 {0x09, 0x16},
445 {0x0A, 0x24},
446 {0x16, 0x34},
447 {0x17, 0xE1},
448 {0x18, 0x25},
449 {0x19, 0xF1},
450 {0x1A, 0x17},
451 {0x25, 0x18},
452 {0x26, 0x19},
453 {0x27, 0x1A},
454 {0x28, 0x26},
455 {0x29, 0x27},
456 {0x2A, 0x28},
457 {0x34, 0x29},
458 {0x35, 0x2A},
459 {0x36, 0x35},
460 {0x37, 0x36},
461 {0x38, 0x37},
462 {0x39, 0x38},
463 {0x3A, 0x39},
464 {0x43, 0x3A},
465 {0x44, 0x43},
466 {0x45, 0x44},
467 {0x46, 0x45},
468 {0x47, 0x46},
469 {0x48, 0x47},
470 {0x49, 0x48},
471 {0x4A, 0x49},
472 {0x53, 0x4A},
473 {0x54, 0x53},
474 {0x55, 0x54},
475 {0x56, 0x55},
476 {0x57, 0x56},
477 {0x58, 0x57},
478 {0x59, 0x58},
479 {0x5A, 0x59},
480 {0x63, 0x5A},
481 {0x64, 0x63},
482 {0x65, 0x64},
483 {0x66, 0x65},
484 {0x67, 0x66},
485 {0x68, 0x67},
486 {0x69, 0x68},
487 {0x6A, 0x69},
488 {0x73, 0x6A},
489 {0x74, 0x73},
490 {0x75, 0x74},
491 {0x76, 0x75},
492 {0x77, 0x76},
493 {0x78, 0x77},
494 {0x79, 0x78},
495 {0x7A, 0x79},
496 {0x83, 0x7A},
497 {0x84, 0x82},
498 {0x85, 0x83},
499 {0x86, 0x84},
500 {0x87, 0x85},
501 {0x88, 0x86},
502 {0x89, 0x87},
503 {0x8A, 0x88},
504 {0x92, 0x89},
505 {0x93, 0x8A},
506 {0x94, 0x92},
507 {0x95, 0x93},
508 {0x96, 0x94},
509 {0x97, 0x95},
510 {0x98, 0x96},
511 {0x99, 0x97},
512 {0x9A, 0x98},
513 {0xA2, 0x99},
514 {0xA3, 0x9A},
515 {0xA4, 0xA2},
516 {0xA5, 0xA3},
517 {0xA6, 0xA4},
518 {0xA7, 0xA5},
519 {0xA8, 0xA6},
520 {0xA9, 0xA7},
521 {0xAA, 0xA8},
522 {0xB2, 0xA9},
523 {0xB3, 0xAA},
524 {0xB4, 0xB2},
525 {0xB5, 0xB3},
526 {0xB6, 0xB4},
527 {0xB7, 0xB5},
528 {0xB8, 0xB6},
529 {0xB9, 0xB7},
530 {0xBA, 0xB8},
531 {0xC2, 0xB9},
532 {0xC3, 0xBA},
533 {0xC4, 0xC2},
534 {0xC5, 0xC3},
535 {0xC6, 0xC4},
536 {0xC7, 0xC5},
537 {0xC8, 0xC6},
538 {0xC9, 0xC7},
539 {0xCA, 0xC8},
540 {0xD2, 0xC9},
541 {0xD3, 0xCA},
542 {0xD4, 0xD2},
543 {0xD5, 0xD3},
544 {0xD6, 0xD4},
545 {0xD7, 0xD5},
546 {0xD8, 0xD6},
547 {0xD9, 0xD7},
548 {0xDA, 0xD8},
549 {0xE1, 0xD9},
550 {0xE2, 0xDA},
551 {0xE3, 0xE2},
552 {0xE4, 0xE3},
553 {0xE5, 0xE4},
554 {0xE6, 0xE5},
555 {0xE7, 0xE6},
556 {0xE8, 0xE7},
557 {0xE9, 0xE8},
558 {0xEA, 0xE9},
559 {0xF1, 0xEA},
560 {0xF2, 0xF2},
561 {0xF3, 0xF3},
562 {0xF4, 0xF4},
563 {0xF5, 0xF5},
564 {0xF6, 0xF6},
565 {0xF7, 0xF7},
566 {0xF8, 0xF8},
567 {0xF9, 0xF9},
568 {0xFA, 0xFA}
569 };
570
571 typedef struct {
572 RK_U8 *buffer; /* Pointer to first byte of stream */
573 RK_U8 *stream; /* Pointer to next byte of stream */
574 RK_U32 size; /* Byte size of stream buffer */
575 RK_U32 byteCnt; /* Byte counter */
576 RK_U32 bitCnt; /* Bit counter */
577 RK_U32 byteBuffer; /* Byte buffer */
578 RK_U32 bufferedBits; /* Amount of bits in byte buffer, [0-7] */
579 } JpegeBitsImpl;
580
jpege_bits_init(JpegeBits * ctx)581 void jpege_bits_init(JpegeBits *ctx)
582 {
583 JpegeBitsImpl *impl = mpp_malloc(JpegeBitsImpl, 1);
584 *ctx = impl;
585 }
586
jpege_bits_deinit(JpegeBits ctx)587 void jpege_bits_deinit(JpegeBits ctx)
588 {
589 if (ctx)
590 mpp_free(ctx);
591 }
592
jpege_bits_setup(JpegeBits ctx,RK_U8 * buf,RK_S32 size)593 void jpege_bits_setup(JpegeBits ctx, RK_U8 *buf, RK_S32 size)
594 {
595 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
596
597 impl->buffer = buf;
598 impl->stream = buf;
599 impl->size = size;
600 impl->byteCnt = 0;
601 impl->bitCnt = 0;
602 impl->byteBuffer = 0;
603 impl->bufferedBits = 0;
604 }
605
jpege_bits_put(JpegeBits ctx,RK_U32 value,RK_S32 number)606 void jpege_bits_put(JpegeBits ctx, RK_U32 value, RK_S32 number)
607 {
608 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
609
610 RK_U32 bits;
611 RK_U32 byteBuffer = impl->byteBuffer;
612 RK_U8 *stream = impl->stream;
613
614 /* Debug: value is too big */
615 mpp_assert(value < ((RK_U32) 1 << number));
616 mpp_assert(number < 25);
617
618 bits = number + impl->bufferedBits;
619
620 value <<= (32 - bits);
621 byteBuffer = (((RK_U32) stream[0]) << 24) | value;
622
623 while (bits > 7) {
624 *stream = (RK_U8) (byteBuffer >> 24);
625 bits -= 8;
626 byteBuffer <<= 8;
627 stream++;
628 impl->byteCnt++;
629 }
630
631 stream[0] = (RK_U8) (byteBuffer >> 24);
632 impl->stream = stream;
633 impl->bitCnt += number;
634 impl->byteBuffer = byteBuffer;
635 impl->bufferedBits = (RK_U8) bits;
636 }
637
jpege_seek_bits(JpegeBits ctx,RK_S32 len)638 void jpege_seek_bits(JpegeBits ctx, RK_S32 len)
639 {
640 JpegeBitsImpl *impl = (JpegeBitsImpl*)ctx;
641 RK_U32 bits = len;
642 RK_U8 *stream = impl->stream;
643
644 mpp_assert(bits < impl->size);
645
646 while (bits > 7) {
647 stream++;
648 impl->byteCnt++;
649 bits -= 8;
650 }
651
652 impl->stream = stream;
653 impl->bitCnt += len;
654 impl->byteBuffer = (RK_U32)stream[0];
655 impl->bufferedBits = (RK_U8) bits;
656 }
657
jpege_bits_align_byte(JpegeBits ctx)658 void jpege_bits_align_byte(JpegeBits ctx)
659 {
660 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
661
662 if (impl->bitCnt & 7)
663 jpege_bits_put(ctx, 0, 8 - (impl->bitCnt & 7));
664 }
665
jpege_bits_get_buf(JpegeBits ctx)666 RK_U8 *jpege_bits_get_buf(JpegeBits ctx)
667 {
668 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
669 return impl->buffer;
670 }
671
jpege_bits_get_bitpos(JpegeBits ctx)672 RK_S32 jpege_bits_get_bitpos(JpegeBits ctx)
673 {
674 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
675 return impl->bitCnt;
676 }
677
jpege_bits_get_bytepos(JpegeBits ctx)678 RK_S32 jpege_bits_get_bytepos(JpegeBits ctx)
679 {
680 JpegeBitsImpl *impl = (JpegeBitsImpl *)ctx;
681 return impl->byteCnt;
682 }
683
write_jpeg_comment_header(JpegeBits * bits,JpegeSyntax * syntax)684 static void write_jpeg_comment_header(JpegeBits *bits, JpegeSyntax *syntax)
685 {
686 RK_U32 i;
687 RK_U8 *data = syntax->comment_data;
688 RK_U32 length = syntax->comment_length;
689
690 /* COM */
691 jpege_bits_put(bits, COM, 16);
692
693 /* Lc */
694 jpege_bits_put(bits, 2 + length, 16);
695
696 for (i = 0; i < length; i++) {
697 /* COM data */
698 jpege_bits_put(bits, data[i], 8);
699 }
700 }
701
write_jpeg_dqt_header(JpegeBits * bits,const RK_U8 * qtable,RK_U32 tbl_idx)702 static void write_jpeg_dqt_header(JpegeBits *bits, const RK_U8 *qtable, RK_U32 tbl_idx)
703 {
704 RK_S32 i;
705
706 /* DQT */
707 jpege_bits_put(bits, DQT, 16);
708 /* Lq */
709 jpege_bits_put(bits, 2 + 65, 16);
710 /* Pq */
711 jpege_bits_put(bits, 0, 4);
712 /* Tq */
713 jpege_bits_put(bits, tbl_idx, 4);
714
715 for (i = 0; i < 64; i++) {
716 /* Qk table 0 */
717 jpege_bits_put(bits, qtable[zigzag[i]], 8);
718 }
719 }
720
write_jpeg_SOFO_header(JpegeBits * bits,JpegeSyntax * syntax)721 static void write_jpeg_SOFO_header(JpegeBits *bits, JpegeSyntax *syntax)
722 {
723 RK_U32 i;
724 RK_U32 width = syntax->width;
725 RK_U32 height = syntax->height;
726
727 /* SOF0 */
728 jpege_bits_put(bits, SOF0, 16);
729
730 /* Lf */
731 jpege_bits_put(bits, (8 + 3 * syntax->nb_components), 16);
732 /* P */
733 jpege_bits_put(bits, 8, 8);
734 /* Y */
735 jpege_bits_put(bits, height, 16);
736 /* X */
737 jpege_bits_put(bits, width, 16);
738 /* Nf */
739 jpege_bits_put(bits, syntax->nb_components, 8);
740
741 for (i = 0; i < syntax->nb_components; i++) {
742 /* Ci */
743 jpege_bits_put(bits, syntax->comp_info[i].component_id, 8);
744 /* Hi */
745 jpege_bits_put(bits, syntax->comp_info[i].h_sample_factor, 4);
746 /* Vi */
747 jpege_bits_put(bits, syntax->comp_info[i].v_sample_factor, 4);
748 /* Tqi */
749 jpege_bits_put(bits, syntax->comp_info[i].tbl_selector, 8);
750 }
751 }
752
write_jpeg_dht_header(JpegeBits * bits,JpegeSyntax * syntax)753 static void write_jpeg_dht_header(JpegeBits *bits, JpegeSyntax *syntax)
754 {
755 RK_S32 i;
756
757 /* DHT */
758 jpege_bits_put(bits, DHT, 16);
759
760 /* Huffman table for luminance DC components */
761 /* Lh */
762 jpege_bits_put(bits, 2 + ((17 * 1) + ((1 * 12))), 16);
763 /* TC */
764 jpege_bits_put(bits, TABLE_DC, 4);
765 /* TH */
766 jpege_bits_put(bits, syntax->comp_info[0].tbl_selector, 4);
767
768 for (i = 0; i < 16; i++) {
769 /* Dc_Li */
770 jpege_bits_put(bits, dc_li[i].val_y, 8);
771 }
772
773 for (i = 0; i < 12; i++) {
774 /* Dc_Vij */
775 jpege_bits_put(bits, dc_vij[i].val_y, 8);
776 }
777
778 /* DHT */
779 jpege_bits_put(bits, DHT, 16);
780
781 /* Huffman table for luminance AC components */
782 /* Lh */
783 jpege_bits_put(bits, 2 + ((17 * 1) + ((1 * 162))), 16);
784 /* TC */
785 jpege_bits_put(bits, TABLE_AC, 4);
786 /* TH */
787 jpege_bits_put(bits, syntax->comp_info[0].tbl_selector, 4);
788
789 for (i = 0; i < 16; i++) {
790 /* Ac_Li */
791 jpege_bits_put(bits, ac_li[i].val_y, 8);
792 }
793
794 for (i = 0; i < 162; i++) {
795 /* Ac_Vij */
796 jpege_bits_put(bits, ac_vij[i].val_y, 8);
797 }
798
799 if (syntax->nb_components == 1)
800 return;
801
802 /* Huffman table for chrominance DC components */
803 /* DHT */
804 jpege_bits_put(bits, DHT, 16);
805 /* Lh */
806 jpege_bits_put(bits, 2 + ((17 * 1) + ((1 * 12))), 16);
807 /* TC */
808 jpege_bits_put(bits, TABLE_DC, 4);
809 /* TH */
810 jpege_bits_put(bits, syntax->comp_info[1].tbl_selector, 4);
811
812 for (i = 0; i < 16; i++) {
813 /* Dc_Li */
814 jpege_bits_put(bits, dc_li[i].val_c, 8);
815 }
816
817 for (i = 0; i < 12; i++) {
818 /* Dc_Vij */
819 jpege_bits_put(bits, dc_vij[i].val_c, 8);
820 }
821
822 /* Huffman table for chrominance AC components */
823 /* DHT */
824 jpege_bits_put(bits, DHT, 16);
825 /* Lh */
826 jpege_bits_put(bits, 2 + ((17 * 1) + ((1 * 162))), 16);
827 /* TC */
828 jpege_bits_put(bits, TABLE_AC, 4);
829 /* TH */
830 jpege_bits_put(bits, syntax->comp_info[1].tbl_selector, 4);
831
832 for (i = 0; i < 16; i++) {
833 /* Ac_Li */
834 jpege_bits_put(bits, ac_li[i].val_c, 8);
835 }
836
837 for (i = 0; i < 162; i++) {
838 /* Ac_Vij */
839 jpege_bits_put(bits, ac_vij[i].val_c, 8);
840 }
841 }
842
write_jpeg_sos_header(JpegeBits * bits,JpegeSyntax * syntax)843 static void write_jpeg_sos_header(JpegeBits *bits, JpegeSyntax *syntax)
844 {
845 RK_U32 i;
846 RK_U32 Ns = syntax->nb_components;
847 RK_U32 Ls = (6 + (2 * Ns));
848
849 /* SOS */
850 jpege_bits_put(bits, SOS, 16);
851 /* Ls */
852 jpege_bits_put(bits, Ls, 16);
853 /* Ns */
854 jpege_bits_put(bits, Ns, 8);
855
856 for (i = 0; i < Ns; i++) {
857 /* Csj */
858 jpege_bits_put(bits, syntax->comp_info[i].component_id, 8);
859 /* Tdj */
860 jpege_bits_put(bits, syntax->comp_info[i].tbl_selector, 4);
861 /* Taj */
862 jpege_bits_put(bits, syntax->comp_info[i].tbl_selector, 4);
863 }
864
865 /* Ss */
866 jpege_bits_put(bits, 0, 8);
867 /* Se */
868 jpege_bits_put(bits, 63, 8);
869 /* Ah */
870 jpege_bits_put(bits, 0, 4);
871 /* Al */
872 jpege_bits_put(bits, 0, 4);
873 }
874
875
write_jpeg_RestartInterval(JpegeBits * bits,JpegeSyntax * syntax)876 void write_jpeg_RestartInterval(JpegeBits *bits, JpegeSyntax *syntax)
877 {
878 if (syntax->restart_ri) {
879 jpege_bits_put(bits, 0xFFDD, 16);
880 jpege_bits_put(bits, 4, 16);
881 jpege_bits_put(bits, syntax->restart_ri, 16);
882 }
883 }
884
write_jpeg_header(JpegeBits * bits,JpegeSyntax * syntax,HalJpegeRc * hal_rc)885 MPP_RET write_jpeg_header(JpegeBits *bits, JpegeSyntax *syntax, HalJpegeRc *hal_rc)
886 {
887 RK_U32 i = 0;
888 RK_U32 qtable_number = syntax->nb_components == 1 ? 1 : 2;
889
890 /* Com header */
891 if (syntax->comment_length)
892 write_jpeg_comment_header(bits, syntax);
893
894 for (i = 0; i < qtable_number; i++)
895 write_jpeg_dqt_header(bits, hal_rc->qtables[i], i);
896
897 /* Frame header */
898 write_jpeg_SOFO_header(bits, syntax);
899
900 /* Do NOT have Restart interval */
901 write_jpeg_RestartInterval(bits, syntax);
902
903 /* Huffman header */
904 write_jpeg_dht_header(bits, syntax);
905
906 /* Scan header */
907 write_jpeg_sos_header(bits, syntax);
908
909 jpege_bits_align_byte(bits);
910 return MPP_OK;
911 }
912
hal_jpege_rc_init(HalJpegeRc * hal_rc)913 void hal_jpege_rc_init(HalJpegeRc *hal_rc)
914 {
915 /* default best quality qtable 10 */
916 hal_rc->q_mode = JPEG_QUANT;
917 hal_rc->quant = 10;
918 hal_rc->q_factor = -1;
919 memset(hal_rc->qtable_y, 1, QUANTIZE_TABLE_SIZE);
920 memset(hal_rc->qtable_u, 1, QUANTIZE_TABLE_SIZE);
921 memset(hal_rc->qtable_v, 1, QUANTIZE_TABLE_SIZE);
922 hal_rc->qtables[0] = qtable_y[hal_rc->quant];
923 hal_rc->qtables[1] = qtable_c[hal_rc->quant];
924 hal_rc->qtables[2] = qtable_c[hal_rc->quant];
925 }
926
qfactor_to_qf_table(RK_S32 qfactor,RK_U8 * hal_rc_qtable_y,RK_U8 * hal_rc_qtable_c)927 static void qfactor_to_qf_table(RK_S32 qfactor, RK_U8 *hal_rc_qtable_y, RK_U8 *hal_rc_qtable_c)
928 {
929 RK_U32 q;
930 RK_U32 i;
931
932 if (qfactor < 50)
933 q = 5000 / qfactor;
934 else
935 q = 200 - (qfactor << 1);
936
937 for (i = 0; i < QUANTIZE_TABLE_SIZE; i++) {
938 RK_S16 lq = (jpege_luma_quantizer[i] * q + 50) / 100;
939 RK_S16 cq = (jpege_chroma_quantizer[i] * q + 50) / 100;
940
941 /* Limit the quantizers to 1 <= q <= 255 */
942 hal_rc_qtable_y[i] = MPP_CLIP3(1, 255, lq);
943 hal_rc_qtable_c[i] = MPP_CLIP3(1, 255, cq);
944 }
945 }
946
hal_jpege_rc_update(HalJpegeRc * hal_rc,JpegeSyntax * syntax)947 void hal_jpege_rc_update(HalJpegeRc *hal_rc, JpegeSyntax *syntax)
948 {
949 switch (syntax->q_mode) {
950 case JPEG_QUANT : {
951 RK_S32 quant = syntax->quant;
952
953 hal_rc->q_mode = JPEG_QUANT;
954 hal_rc->quant = quant;
955 hal_rc->qtables[0] = qtable_y[quant];
956 hal_rc->qtables[1] = qtable_c[quant];
957 hal_rc->qtables[2] = qtable_c[quant];
958 hal_rc->q_factor = -1;
959 } break;
960 case JPEG_QFACTOR : {
961 if (hal_rc->q_mode != JPEG_QFACTOR || hal_rc->q_factor != syntax->q_factor)
962 qfactor_to_qf_table(syntax->q_factor, hal_rc->qtable_y, hal_rc->qtable_u);
963
964 hal_rc->q_mode = JPEG_QFACTOR;
965 /* NOTE: qfactor mode uv use the same table */
966 hal_rc->qtables[0] = hal_rc->qtable_y;
967 hal_rc->qtables[1] = hal_rc->qtable_u;
968 hal_rc->qtables[2] = hal_rc->qtable_u;
969 hal_rc->q_factor = syntax->q_factor;
970 } break;
971 case JPEG_QTABLE : {
972 hal_rc->q_mode = JPEG_QTABLE;
973 memcpy(hal_rc->qtable_y, syntax->qtable_y, QUANTIZE_TABLE_SIZE);
974 memcpy(hal_rc->qtable_u, syntax->qtable_u, QUANTIZE_TABLE_SIZE);
975 memcpy(hal_rc->qtable_v, syntax->qtable_v, QUANTIZE_TABLE_SIZE);
976 hal_rc->qtables[0] = hal_rc->qtable_y;
977 hal_rc->qtables[1] = hal_rc->qtable_u;
978 hal_rc->qtables[2] = hal_rc->qtable_v;
979 hal_rc->q_factor = -1;
980 } break;
981 default : {
982 mpp_err_f("invalid q_mode %d use default best quanlity qtable\n", syntax->q_mode);
983 hal_rc->q_mode = JPEG_QUANT;
984 hal_rc->quant = 10;
985 hal_rc->qtables[0] = qtable_y[10];
986 hal_rc->qtables[1] = qtable_c[10];
987 hal_rc->qtables[2] = qtable_c[10];
988 hal_rc->q_factor = -1;
989 } break;
990 }
991 }
992