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