xref: /rockchip-linux_mpp/mpp/hal/common/jpeg/hal_jpege_hdr.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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