1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2015 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun * You may obtain a copy of the License at
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun * limitations under the License.
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include "mpp_common.h"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun static const RK_U8 log2_tab[256] = {
20*4882a593Smuzhiyun 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
21*4882a593Smuzhiyun 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
22*4882a593Smuzhiyun 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
23*4882a593Smuzhiyun 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
24*4882a593Smuzhiyun 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
25*4882a593Smuzhiyun 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
26*4882a593Smuzhiyun 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
27*4882a593Smuzhiyun 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun
mpp_log2(RK_U32 v)30*4882a593Smuzhiyun RK_S32 mpp_log2(RK_U32 v)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun RK_S32 n = 0;
33*4882a593Smuzhiyun if (v & 0xffff0000) {
34*4882a593Smuzhiyun v >>= 16;
35*4882a593Smuzhiyun n += 16;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun if (v & 0xff00) {
38*4882a593Smuzhiyun v >>= 8;
39*4882a593Smuzhiyun n += 8;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun n += log2_tab[v];
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun return n;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
mpp_log2_16bit(RK_U32 v)46*4882a593Smuzhiyun RK_S32 mpp_log2_16bit(RK_U32 v)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun RK_S32 n = 0;
49*4882a593Smuzhiyun if (v & 0xff00) {
50*4882a593Smuzhiyun v >>= 8;
51*4882a593Smuzhiyun n += 8;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun n += log2_tab[v];
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun return n;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
axb_div_c(RK_S32 a,RK_S32 b,RK_S32 c)58*4882a593Smuzhiyun RK_S32 axb_div_c(RK_S32 a, RK_S32 b, RK_S32 c)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun RK_U32 left = 32;
61*4882a593Smuzhiyun RK_U32 right = 0;
62*4882a593Smuzhiyun RK_U32 shift;
63*4882a593Smuzhiyun RK_S32 sign = 1;
64*4882a593Smuzhiyun RK_S32 tmp;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun if (a == 0 || b == 0)
67*4882a593Smuzhiyun return 0;
68*4882a593Smuzhiyun else if ((a * b / b) == a && c != 0)
69*4882a593Smuzhiyun return (a * b / c);
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun if (a < 0) {
72*4882a593Smuzhiyun sign = -1;
73*4882a593Smuzhiyun a = -a;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun if (b < 0) {
76*4882a593Smuzhiyun sign *= -1;
77*4882a593Smuzhiyun b = -b;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun if (c < 0) {
80*4882a593Smuzhiyun sign *= -1;
81*4882a593Smuzhiyun c = -c;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun if (c == 0)
85*4882a593Smuzhiyun return 0x7FFFFFFF * sign;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun if (b > a) {
88*4882a593Smuzhiyun tmp = b;
89*4882a593Smuzhiyun b = a;
90*4882a593Smuzhiyun a = tmp;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun for (--left; (((RK_U32)a << left) >> left) != (RK_U32)a; --left)
94*4882a593Smuzhiyun ;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun left--;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun while (((RK_U32)b >> right) > (RK_U32)c)
99*4882a593Smuzhiyun right++;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun if (right > left) {
102*4882a593Smuzhiyun return 0x7FFFFFFF * sign;
103*4882a593Smuzhiyun } else {
104*4882a593Smuzhiyun shift = left - right;
105*4882a593Smuzhiyun return (RK_S32)((((RK_U32)a << shift) /
106*4882a593Smuzhiyun (RK_U32)c * (RK_U32)b) >> shift) * sign;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
mpp_align_16(RK_U32 val)110*4882a593Smuzhiyun RK_U32 mpp_align_16(RK_U32 val)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun return MPP_ALIGN(val, 16);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
mpp_align_64(RK_U32 val)115*4882a593Smuzhiyun RK_U32 mpp_align_64(RK_U32 val)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun return MPP_ALIGN(val, 64);
118*4882a593Smuzhiyun }
119