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