xref: /OK3568_Linux_fs/external/mpp/mpp/hal/vpu/jpege/hal_jpege_base.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright 2020 Rockchip Electronics Co. LTD
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define MODULE_TAG "hal_jpege_base"
18 
19 #include <string.h>
20 
21 #include "mpp_mem.h"
22 #include "mpp_common.h"
23 
24 #include "hal_jpege_debug.h"
25 #include "hal_jpege_base.h"
26 
27 const RK_U32 qp_reorder_table[64] = {
28     0,  8, 16, 24,  1,  9, 17, 25, 32, 40, 48, 56, 33, 41, 49, 57,
29     2, 10, 18, 26,  3, 11, 19, 27, 34, 42, 50, 58, 35, 43, 51, 59,
30     4, 12, 20, 28,  5, 13, 21, 29, 36, 44, 52, 60, 37, 45, 53, 61,
31     6, 14, 22, 30,  7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
32 };
33 
34 /*
35  *  from RFC435 spec.
36  */
37 const RK_U8 jpege_luma_quantizer[QUANTIZE_TABLE_SIZE] = {
38     16, 11, 10, 16, 24, 40, 51, 61,
39     12, 12, 14, 19, 26, 58, 60, 55,
40     14, 13, 16, 24, 40, 57, 69, 56,
41     14, 17, 22, 29, 51, 87, 80, 62,
42     18, 22, 37, 56, 68, 109, 103, 77,
43     24, 35, 55, 64, 81, 104, 113, 92,
44     49, 64, 78, 87, 103, 121, 120, 101,
45     72, 92, 95, 98, 112, 100, 103, 99
46 };
47 
48 const RK_U8 jpege_chroma_quantizer[QUANTIZE_TABLE_SIZE] = {
49     17, 18, 24, 47, 99, 99, 99, 99,
50     18, 21, 26, 66, 99, 99, 99, 99,
51     24, 26, 56, 99, 99, 99, 99, 99,
52     47, 66, 99, 99, 99, 99, 99, 99,
53     99, 99, 99, 99, 99, 99, 99, 99,
54     99, 99, 99, 99, 99, 99, 99, 99,
55     99, 99, 99, 99, 99, 99, 99, 99,
56     99, 99, 99, 99, 99, 99, 99, 99
57 };
58 
59 const RK_U16 jpege_restart_marker[8] = {
60     0xFFD0,  0xFFD1,  0xFFD2, 0xFFD3,
61     0xFFD4,  0xFFD5,  0xFFD6, 0xFFD7,
62 };
63 
hal_jpege_vepu_rc(HalJpegeCtx * ctx,HalEncTask * task)64 MPP_RET hal_jpege_vepu_rc(HalJpegeCtx *ctx, HalEncTask *task)
65 {
66     HalJpegeRc *hal_rc = &ctx->hal_rc;
67     EncRcTaskInfo *rc_info = (EncRcTaskInfo *)&task->rc_task->info;
68 
69     if (rc_info->quality_target != hal_rc->last_quality) {
70         RK_U32 i = 0;
71         RK_S32 q = 0;
72 
73         hal_rc->q_factor = 100 - rc_info->quality_target;
74         hal_jpege_dbg_input("use qfactor=%d, rc_info->quality_target=%d\n", hal_rc->q_factor, rc_info->quality_target);
75 
76         q = hal_rc->q_factor;
77         if (q < 50)
78             q = 5000 / q;
79         else
80             q = 200 - (q << 1);
81 
82         for (i = 0; i < QUANTIZE_TABLE_SIZE; i++) {
83             RK_S16 lq = (jpege_luma_quantizer[i] * q + 50) / 100;
84             RK_S16 cq = (jpege_chroma_quantizer[i] * q + 50) / 100;
85 
86             /* Limit the quantizers to 1 <= q <= 255 */
87             hal_rc->qtable_y[i] = MPP_CLIP3(1, 255, lq);
88             hal_rc->qtable_c[i] = MPP_CLIP3(1, 255, cq);
89         }
90     }
91 
92     return MPP_OK;
93 }
94 
hal_jpege_vepu_init_rc(HalJpegeRc * hal_rc)95 MPP_RET hal_jpege_vepu_init_rc(HalJpegeRc *hal_rc)
96 {
97     memset(hal_rc, 0, sizeof(HalJpegeRc));
98     hal_rc->qtable_y = mpp_malloc(RK_U8, QUANTIZE_TABLE_SIZE);
99     hal_rc->qtable_c = mpp_malloc(RK_U8, QUANTIZE_TABLE_SIZE);
100 
101     if (NULL == hal_rc->qtable_y || NULL == hal_rc->qtable_c) {
102         mpp_err_f("qtable is null, malloc err\n");
103         return MPP_ERR_MALLOC;
104     }
105 
106     return MPP_OK;
107 }
108 
hal_jpege_vepu_deinit_rc(HalJpegeRc * hal_rc)109 MPP_RET hal_jpege_vepu_deinit_rc(HalJpegeRc *hal_rc)
110 {
111     MPP_FREE(hal_rc->qtable_y);
112     MPP_FREE(hal_rc->qtable_c);
113 
114     return MPP_OK;
115 }
116 
get_msb_lsb_at_pos(RK_U32 * msb,RK_U32 * lsb,RK_U8 * buf,RK_U32 bytepos)117 void get_msb_lsb_at_pos(RK_U32 *msb, RK_U32 *lsb, RK_U8 *buf, RK_U32 bytepos)
118 {
119     RK_U32 val32;
120     RK_S32 left_byte = bytepos & 0x7;
121     RK_U8 *tmp = buf + (bytepos & (~0x7));
122 
123     // clear the rest bytes in 64bit
124     if (left_byte) {
125         RK_U32 i;
126 
127         for (i = left_byte; i < 8; i++)
128             tmp[i] = 0;
129     }
130 
131     val32 = (tmp[0] << 24) |
132             (tmp[1] << 16) |
133             (tmp[2] <<  8) |
134             (tmp[3] <<  0);
135 
136     *msb = val32;
137 
138     if (left_byte > 4) {
139         val32 = (tmp[4] << 24) |
140                 (tmp[5] << 16) |
141                 (tmp[6] <<  8);
142     } else
143         val32 = 0;
144 
145     *lsb = val32;
146 }
147