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 #define MODULE_TAG "vepu_common"
17*437bfbebSnyanmisaka
18*437bfbebSnyanmisaka #include <string.h>
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #include "mpp_mem.h"
21*437bfbebSnyanmisaka #include "mpp_debug.h"
22*437bfbebSnyanmisaka #include "mpp_common.h"
23*437bfbebSnyanmisaka #include "mpp_frame.h"
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "vepu_common.h"
26*437bfbebSnyanmisaka
27*437bfbebSnyanmisaka static VepuFormatCfg vepu_yuv_cfg[MPP_FMT_YUV_BUTT] = {
28*437bfbebSnyanmisaka //MPP_FMT_YUV420SP
29*437bfbebSnyanmisaka { .format = VEPU_FMT_YUV420SEMIPLANAR, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
30*437bfbebSnyanmisaka //MPP_FMT_YUV420SP_10BIT
31*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
32*437bfbebSnyanmisaka //MPP_FMT_YUV422SP
33*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
34*437bfbebSnyanmisaka //MPP_FMT_YUV422SP_10BIT
35*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
36*437bfbebSnyanmisaka //MPP_FMT_YUV420P
37*437bfbebSnyanmisaka { .format = VEPU_FMT_YUV420PLANAR, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
38*437bfbebSnyanmisaka //MPP_FMT_YUV420SP_VU
39*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
40*437bfbebSnyanmisaka //MPP_FMT_YUV422P
41*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
42*437bfbebSnyanmisaka //MPP_FMT_YUV422SP_VU
43*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
44*437bfbebSnyanmisaka //MPP_FMT_YUV422_YUYV
45*437bfbebSnyanmisaka { .format = VEPU_FMT_YUYV422INTERLEAVED, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
46*437bfbebSnyanmisaka //MPP_FMT_YUV422_YVYU
47*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
48*437bfbebSnyanmisaka //MPP_FMT_YUV422_UYVY
49*437bfbebSnyanmisaka { .format = VEPU_FMT_UYVY422INTERLEAVED, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
50*437bfbebSnyanmisaka //MPP_FMT_YUV422_VYUY
51*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
52*437bfbebSnyanmisaka //MPP_FMT_YUV400
53*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
54*437bfbebSnyanmisaka //MPP_FMT_YUV440SP
55*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
56*437bfbebSnyanmisaka //MPP_FMT_YUV411SP
57*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
58*437bfbebSnyanmisaka //MPP_FMT_YUV444SP
59*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
60*437bfbebSnyanmisaka };
61*437bfbebSnyanmisaka
62*437bfbebSnyanmisaka static VepuFormatCfg vepu_rgb_cfg[MPP_FMT_RGB_BUTT - MPP_FRAME_FMT_RGB] = {
63*437bfbebSnyanmisaka //MPP_FMT_RGB565, ff: rgb565be, bin(rrrr,rggg,gggb,bbbb) mem MSB-->LSB(gggb,bbbb,rrrr,rggg)
64*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB565, .r_mask = 15, .g_mask = 10, .b_mask = 4, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
65*437bfbebSnyanmisaka //MPP_FMT_BGR565, ff: bgr565be, bin(bbbb,bggg,gggr,rrrr) mem MSB-->LSB(gggr,rrrr,bbbb,bggg)
66*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB565, .r_mask = 4, .g_mask = 10, .b_mask = 15, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
67*437bfbebSnyanmisaka //MPP_FMT_RGB555, ff: rgb555be, bin(0rrr,rrgg,gggb,bbbb) mem MSB-->LSB(gggb,bbbb,0rrr,rrgg)
68*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB555, .r_mask = 14, .g_mask = 9, .b_mask = 4, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
69*437bfbebSnyanmisaka //MPP_FMT_BGR555, ff: bgr555be, bin(0bbb,bbgg,gggr,rrrr) mem MSB-->LSB(gggr,rrrr,0bbb,bbgg)
70*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB555, .r_mask = 4, .g_mask = 9, .b_mask = 14, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
71*437bfbebSnyanmisaka //MPP_FMT_RGB444, ff: rgb444be, bin(0000,rrrr,gggg,bbbb)
72*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB444, .r_mask = 11, .g_mask = 7, .b_mask = 3, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
73*437bfbebSnyanmisaka //MPP_FMT_BGR444, ff: bgr444be, bin(0000,bbbb,gggg,rrrr)
74*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB444, .r_mask = 3, .g_mask = 7, .b_mask = 11, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
75*437bfbebSnyanmisaka //MPP_FMT_RGB888, ff: rgb24, bin(rrrr,rrrr,gggg,gggg,bbbb,bbbb)
76*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 0, },
77*437bfbebSnyanmisaka //MPP_FMT_BGR888, ff: bgr24, bin(bbbb,bbbb,gggg,gggg,rrrr,rrrr)
78*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 0, },
79*437bfbebSnyanmisaka //MPP_FMT_RGB101010, bin(00rr,rrrr,rrrr,gggg,gggg,ggbb,bbbb,bbbb)
80*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB101010, .r_mask = 29, .g_mask = 19, .b_mask = 9, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
81*437bfbebSnyanmisaka //MPP_FMT_BGR101010, bin(00bb,bbbb,bbbb,gggg,gggg,ggrr,rrrr,rrrr)
82*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB101010, .r_mask = 9, .g_mask = 19, .b_mask = 29, .swap_8_in = 1, .swap_16_in = 1, .swap_32_in = 1, },
83*437bfbebSnyanmisaka //MPP_FMT_ARGB8888, argb, bin(aaaa,aaaa,rrrr,rrrr,gggg,gggg,bbbb,bbbb)
84*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 15, .g_mask = 23, .b_mask = 31, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
85*437bfbebSnyanmisaka //MPP_FMT_ABGR8888, ffmepg: rgba, bin(aaaa,aaaa,bbbb,bbbb,gggg,gggg,rrrr,rrrr)
86*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 31, .g_mask = 23, .b_mask = 15, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
87*437bfbebSnyanmisaka //MPP_FMT_BGRA8888, ff: bgra, bin(bbbb,bbbb,gggg,gggg,rrrr,rrrr,aaaa,aaaa)
88*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 23, .g_mask = 15, .b_mask = 7, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
89*437bfbebSnyanmisaka //MPP_FMT_RGBA8888, ff: rgba, bin(rrrr,rrrr,gggg,gggg,bbbb,bbbb,aaaa,aaaa)
90*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 7, .g_mask = 15, .b_mask = 23, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
91*437bfbebSnyanmisaka };
92*437bfbebSnyanmisaka static VepuFormatCfg vepu_rgb_le_cfg[MPP_FMT_RGB_BUTT - MPP_FRAME_FMT_RGB] = {
93*437bfbebSnyanmisaka //for little endian format
94*437bfbebSnyanmisaka //MPP_FMT_RGB565LE, ff: rgb565le, bin(gggb,bbbb,rrrr,rggg)
95*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB565, .r_mask = 15, .g_mask = 10, .b_mask = 4, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
96*437bfbebSnyanmisaka //MPP_FMT_BGR565LE, ff: bgr565le, bin(gggr,rrrr,bbbb,bggg)
97*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB565, .r_mask = 4, .g_mask = 10, .b_mask = 15, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
98*437bfbebSnyanmisaka //MPP_FMT_RGB555LE, ff: rgb555le, bin(gggb,bbbb,0rrr,rrgg)
99*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB555, .r_mask = 14, .g_mask = 9, .b_mask = 4, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
100*437bfbebSnyanmisaka //MPP_FMT_BGR555LE, ff: bgr555le, bin(gggr,rrrr,0bbb,bbgg)
101*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB555, .r_mask = 4, .g_mask = 9, .b_mask = 14, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
102*437bfbebSnyanmisaka //MPP_FMT_RGB444LE, ff: rgb444le, bin(gggg,bbbb,0000,rrrr)
103*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB444, .r_mask = 11, .g_mask = 7, .b_mask = 3, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
104*437bfbebSnyanmisaka //MPP_FMT_BGR444LE, ff: bgr444le, bin(gggg,rrrr,0000,bbbb)
105*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB444, .r_mask = 3, .g_mask = 7, .b_mask = 11, .swap_8_in = 0, .swap_16_in = 1, .swap_32_in = 1, },
106*437bfbebSnyanmisaka
107*437bfbebSnyanmisaka //MPP_FMT_RGB888, ff: rgb24, bin(rrrr,rrrr,gggg,gggg,bbbb,bbbb)
108*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 0, },
109*437bfbebSnyanmisaka //MPP_FMT_BGR888, ff: bgr24, bin(bbbb,bbbb,gggg,gggg,rrrr,rrrr)
110*437bfbebSnyanmisaka { .format = VEPU_FMT_BUTT, .r_mask = 0, .g_mask = 0, .b_mask = 0, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 0, },
111*437bfbebSnyanmisaka
112*437bfbebSnyanmisaka //MPP_FMT_RGB101010, bin(00rr,rrrr,rrrr,gggg,gggg,ggbb,bbbb,bbbb)
113*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB101010, .r_mask = 29, .g_mask = 19, .b_mask = 9, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
114*437bfbebSnyanmisaka //MPP_FMT_BGR101010, bin(00bb,bbbb,bbbb,gggg,gggg,ggrr,rrrr,rrrr)
115*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB101010, .r_mask = 9, .g_mask = 19, .b_mask = 29, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka //MPP_FMT_ARGB8888LE, argb, bin(aaaa,aaaa,rrrr,rrrr,gggg,gggg,bbbb,bbbb)
118*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 23, .g_mask = 15, .b_mask = 7, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
119*437bfbebSnyanmisaka //MPP_FMT_ABGR8888LE, ffmepg: rgba, bin(aaaa,aaaa,bbbb,bbbb,gggg,gggg,rrrr,rrrr)
120*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 7, .g_mask = 15, .b_mask = 23, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
121*437bfbebSnyanmisaka //MPP_FMT_BGRA8888LE, ff: bgra, bin(bbbb,bbbb,gggg,gggg,rrrr,rrrr,aaaa,aaaa)
122*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 15, .g_mask = 23, .b_mask = 31, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
123*437bfbebSnyanmisaka //MPP_FMT_RGBA8888LE, ff: rgba, bin(rrrr,rrrr,gggg,gggg,bbbb,bbbb,aaaa,aaaa)
124*437bfbebSnyanmisaka { .format = VEPU_FMT_RGB888, .r_mask = 31, .g_mask = 23, .b_mask = 15, .swap_8_in = 0, .swap_16_in = 0, .swap_32_in = 1, },
125*437bfbebSnyanmisaka };
126*437bfbebSnyanmisaka
get_vepu_fmt(VepuFormatCfg * cfg,MppFrameFormat format)127*437bfbebSnyanmisaka MPP_RET get_vepu_fmt(VepuFormatCfg *cfg, MppFrameFormat format)
128*437bfbebSnyanmisaka {
129*437bfbebSnyanmisaka VepuFormatCfg *fmt_cfg = NULL;
130*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
131*437bfbebSnyanmisaka
132*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(format)) {
133*437bfbebSnyanmisaka mpp_err_f("unsupport frame format %x\n", format);
134*437bfbebSnyanmisaka } else if (MPP_FRAME_FMT_IS_YUV(format)) {
135*437bfbebSnyanmisaka if (!MPP_FRAME_FMT_IS_LE(format))
136*437bfbebSnyanmisaka fmt_cfg = &vepu_yuv_cfg[format - MPP_FRAME_FMT_YUV];
137*437bfbebSnyanmisaka } else if (MPP_FRAME_FMT_IS_RGB(format)) {
138*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_LE(format)) {
139*437bfbebSnyanmisaka fmt_cfg = &vepu_rgb_le_cfg[(format & MPP_FRAME_FMT_MASK) - MPP_FRAME_FMT_RGB];
140*437bfbebSnyanmisaka } else
141*437bfbebSnyanmisaka fmt_cfg = &vepu_rgb_cfg[format - MPP_FRAME_FMT_RGB];
142*437bfbebSnyanmisaka } else {
143*437bfbebSnyanmisaka memset(cfg, 0, sizeof(*cfg));
144*437bfbebSnyanmisaka cfg->format = VEPU_FMT_BUTT;
145*437bfbebSnyanmisaka }
146*437bfbebSnyanmisaka
147*437bfbebSnyanmisaka if (fmt_cfg && fmt_cfg->format != VEPU_FMT_BUTT) {
148*437bfbebSnyanmisaka memcpy(cfg, fmt_cfg, sizeof(*cfg));
149*437bfbebSnyanmisaka } else {
150*437bfbebSnyanmisaka mpp_err_f("unsupport frame format %x\n", format);
151*437bfbebSnyanmisaka cfg->format = VEPU_FMT_BUTT;
152*437bfbebSnyanmisaka ret = MPP_NOK;
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka
155*437bfbebSnyanmisaka return ret;
156*437bfbebSnyanmisaka }
157*437bfbebSnyanmisaka
check_stride_by_pixel(RK_S32 workaround,RK_S32 width,RK_S32 hor_stride,RK_S32 pixel_size)158*437bfbebSnyanmisaka static RK_S32 check_stride_by_pixel(RK_S32 workaround, RK_S32 width,
159*437bfbebSnyanmisaka RK_S32 hor_stride, RK_S32 pixel_size)
160*437bfbebSnyanmisaka {
161*437bfbebSnyanmisaka if (!workaround && hor_stride < width * pixel_size) {
162*437bfbebSnyanmisaka mpp_log("warning: stride by bytes %d is smarller than width %d mutiple by pixel size %d\n",
163*437bfbebSnyanmisaka hor_stride, width, pixel_size);
164*437bfbebSnyanmisaka mpp_log("multiple stride %d by pixel size %d and set new byte stride to %d\n",
165*437bfbebSnyanmisaka hor_stride, pixel_size, hor_stride * pixel_size);
166*437bfbebSnyanmisaka workaround = 1;
167*437bfbebSnyanmisaka }
168*437bfbebSnyanmisaka
169*437bfbebSnyanmisaka return workaround;
170*437bfbebSnyanmisaka }
171*437bfbebSnyanmisaka
check_8_pixel_aligned(RK_S32 workaround,RK_S32 hor_stride,RK_S32 pixel_aign,RK_S32 pixel_size,const char * fmt_name)172*437bfbebSnyanmisaka static RK_S32 check_8_pixel_aligned(RK_S32 workaround, RK_S32 hor_stride,
173*437bfbebSnyanmisaka RK_S32 pixel_aign, RK_S32 pixel_size,
174*437bfbebSnyanmisaka const char *fmt_name)
175*437bfbebSnyanmisaka {
176*437bfbebSnyanmisaka if (!workaround && hor_stride != MPP_ALIGN_GEN(hor_stride, pixel_aign * pixel_size)) {
177*437bfbebSnyanmisaka mpp_log("warning: vepu only support 8 aligned horizontal stride in pixel for %s with pixel size %d\n",
178*437bfbebSnyanmisaka fmt_name, pixel_size);
179*437bfbebSnyanmisaka mpp_log("set byte stride to %d to match the requirement\n",
180*437bfbebSnyanmisaka MPP_ALIGN_GEN(hor_stride, pixel_aign * pixel_size));
181*437bfbebSnyanmisaka workaround = 1;
182*437bfbebSnyanmisaka }
183*437bfbebSnyanmisaka
184*437bfbebSnyanmisaka return workaround;
185*437bfbebSnyanmisaka }
186*437bfbebSnyanmisaka
get_vepu_pixel_stride(VepuStrideCfg * cfg,RK_U32 width,RK_U32 stride,MppFrameFormat fmt)187*437bfbebSnyanmisaka RK_U32 get_vepu_pixel_stride(VepuStrideCfg *cfg, RK_U32 width, RK_U32 stride, MppFrameFormat fmt)
188*437bfbebSnyanmisaka {
189*437bfbebSnyanmisaka RK_U32 hor_stride = stride;
190*437bfbebSnyanmisaka RK_U32 pixel_size = 1;
191*437bfbebSnyanmisaka
192*437bfbebSnyanmisaka if (cfg->fmt != fmt) {
193*437bfbebSnyanmisaka memset(cfg, 0, sizeof(VepuStrideCfg));
194*437bfbebSnyanmisaka cfg->fmt = fmt;
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka
197*437bfbebSnyanmisaka if (cfg->stride != stride || cfg->width != width) {
198*437bfbebSnyanmisaka cfg->not_8_pixel = 0;
199*437bfbebSnyanmisaka cfg->is_pixel_stride = 0;
200*437bfbebSnyanmisaka cfg->stride = stride;
201*437bfbebSnyanmisaka cfg->width = width;
202*437bfbebSnyanmisaka }
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka switch (fmt & MPP_FRAME_FMT_MASK) {
205*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
206*437bfbebSnyanmisaka if (check_8_pixel_aligned(cfg->not_8_pixel, hor_stride, 8, 1, "YUV420SP")) {
207*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 8);
208*437bfbebSnyanmisaka cfg->not_8_pixel = 1;
209*437bfbebSnyanmisaka }
210*437bfbebSnyanmisaka } break;
211*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
212*437bfbebSnyanmisaka if (check_8_pixel_aligned(cfg->not_8_pixel, hor_stride, 16, 1, "YUV420P")) {
213*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 8);
214*437bfbebSnyanmisaka cfg->not_8_pixel = 1;
215*437bfbebSnyanmisaka }
216*437bfbebSnyanmisaka } break;
217*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV :
218*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY : {
219*437bfbebSnyanmisaka if (check_stride_by_pixel(cfg->is_pixel_stride, cfg->width,
220*437bfbebSnyanmisaka hor_stride, 2)) {
221*437bfbebSnyanmisaka hor_stride *= 2;
222*437bfbebSnyanmisaka cfg->is_pixel_stride = 1;
223*437bfbebSnyanmisaka }
224*437bfbebSnyanmisaka
225*437bfbebSnyanmisaka if (check_8_pixel_aligned(cfg->not_8_pixel, hor_stride, 8, 2, "YUV422_interleave")) {
226*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 16);
227*437bfbebSnyanmisaka cfg->not_8_pixel = 1;
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka
230*437bfbebSnyanmisaka hor_stride /= 2;
231*437bfbebSnyanmisaka pixel_size = 2;
232*437bfbebSnyanmisaka } break;
233*437bfbebSnyanmisaka case MPP_FMT_RGB565 :
234*437bfbebSnyanmisaka case MPP_FMT_BGR565 :
235*437bfbebSnyanmisaka case MPP_FMT_RGB555 :
236*437bfbebSnyanmisaka case MPP_FMT_BGR555 :
237*437bfbebSnyanmisaka case MPP_FMT_RGB444 :
238*437bfbebSnyanmisaka case MPP_FMT_BGR444 : {
239*437bfbebSnyanmisaka if (check_stride_by_pixel(cfg->is_pixel_stride, cfg->width,
240*437bfbebSnyanmisaka hor_stride, 2)) {
241*437bfbebSnyanmisaka hor_stride *= 2;
242*437bfbebSnyanmisaka cfg->is_pixel_stride = 1;
243*437bfbebSnyanmisaka }
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka if (check_8_pixel_aligned(cfg->not_8_pixel, hor_stride, 8, 2, "32bit RGB")) {
246*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 16);
247*437bfbebSnyanmisaka cfg->not_8_pixel = 1;
248*437bfbebSnyanmisaka }
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka hor_stride /= 2;
251*437bfbebSnyanmisaka pixel_size = 2;
252*437bfbebSnyanmisaka } break;
253*437bfbebSnyanmisaka case MPP_FMT_ARGB8888 :
254*437bfbebSnyanmisaka case MPP_FMT_ABGR8888 :
255*437bfbebSnyanmisaka case MPP_FMT_RGBA8888 :
256*437bfbebSnyanmisaka case MPP_FMT_BGRA8888 :
257*437bfbebSnyanmisaka case MPP_FMT_RGB101010 :
258*437bfbebSnyanmisaka case MPP_FMT_BGR101010 : {
259*437bfbebSnyanmisaka if (check_stride_by_pixel(cfg->is_pixel_stride, cfg->width,
260*437bfbebSnyanmisaka hor_stride, 4)) {
261*437bfbebSnyanmisaka hor_stride *= 4;
262*437bfbebSnyanmisaka cfg->is_pixel_stride = 1;
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka
265*437bfbebSnyanmisaka if (check_8_pixel_aligned(cfg->not_8_pixel, hor_stride, 8, 4, "16bit RGB")) {
266*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 32);
267*437bfbebSnyanmisaka cfg->not_8_pixel = 1;
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka
270*437bfbebSnyanmisaka hor_stride /= 4;
271*437bfbebSnyanmisaka pixel_size = 4;
272*437bfbebSnyanmisaka } break;
273*437bfbebSnyanmisaka default: {
274*437bfbebSnyanmisaka mpp_err_f("invalid fmt %d", fmt);
275*437bfbebSnyanmisaka }
276*437bfbebSnyanmisaka }
277*437bfbebSnyanmisaka cfg->pixel_stride = hor_stride;
278*437bfbebSnyanmisaka cfg->pixel_size = pixel_size;
279*437bfbebSnyanmisaka
280*437bfbebSnyanmisaka return hor_stride;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka
get_vepu_offset_cfg(VepuOffsetCfg * cfg)283*437bfbebSnyanmisaka MPP_RET get_vepu_offset_cfg(VepuOffsetCfg *cfg)
284*437bfbebSnyanmisaka {
285*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
286*437bfbebSnyanmisaka MppFrameFormat fmt = cfg->fmt;
287*437bfbebSnyanmisaka RK_U32 hor_stride = cfg->hor_stride;
288*437bfbebSnyanmisaka RK_U32 ver_stride = cfg->ver_stride;
289*437bfbebSnyanmisaka RK_U32 offset_x = cfg->offset_x;
290*437bfbebSnyanmisaka RK_U32 offset_y = cfg->offset_y;
291*437bfbebSnyanmisaka RK_U32 offset_c = hor_stride * ver_stride;
292*437bfbebSnyanmisaka
293*437bfbebSnyanmisaka memset(cfg->offset_byte, 0, sizeof(cfg->offset_byte));
294*437bfbebSnyanmisaka memset(cfg->offset_pixel, 0, sizeof(cfg->offset_pixel));
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka if (offset_x || offset_y) {
297*437bfbebSnyanmisaka switch (fmt) {
298*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
299*437bfbebSnyanmisaka cfg->offset_byte[0] = offset_y * hor_stride + offset_x;
300*437bfbebSnyanmisaka cfg->offset_byte[1] = offset_y / 2 * hor_stride + offset_x + offset_c;
301*437bfbebSnyanmisaka } break;
302*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
303*437bfbebSnyanmisaka cfg->offset_byte[0] = offset_y * hor_stride + offset_x;
304*437bfbebSnyanmisaka cfg->offset_byte[1] = (offset_y / 2) * (hor_stride / 2) + (offset_x / 2) + offset_c;
305*437bfbebSnyanmisaka cfg->offset_byte[2] = (offset_y / 2) * (hor_stride / 2) + (offset_x / 2) + offset_c * 5 / 4;
306*437bfbebSnyanmisaka } break;
307*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV :
308*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY : {
309*437bfbebSnyanmisaka mpp_assert((offset_x & 1) == 0);
310*437bfbebSnyanmisaka cfg->offset_byte[0] = offset_y * hor_stride + offset_x * 2;
311*437bfbebSnyanmisaka } break;
312*437bfbebSnyanmisaka case MPP_FMT_RGB565 :
313*437bfbebSnyanmisaka case MPP_FMT_BGR565 :
314*437bfbebSnyanmisaka case MPP_FMT_RGB555 :
315*437bfbebSnyanmisaka case MPP_FMT_BGR555 :
316*437bfbebSnyanmisaka case MPP_FMT_RGB444 :
317*437bfbebSnyanmisaka case MPP_FMT_BGR444 : {
318*437bfbebSnyanmisaka cfg->offset_byte[0] = offset_y * hor_stride + offset_x * 2;
319*437bfbebSnyanmisaka } break;
320*437bfbebSnyanmisaka case MPP_FMT_RGB101010 :
321*437bfbebSnyanmisaka case MPP_FMT_BGR101010 :
322*437bfbebSnyanmisaka case MPP_FMT_ARGB8888 :
323*437bfbebSnyanmisaka case MPP_FMT_ABGR8888 :
324*437bfbebSnyanmisaka case MPP_FMT_BGRA8888 :
325*437bfbebSnyanmisaka case MPP_FMT_RGBA8888 : {
326*437bfbebSnyanmisaka cfg->offset_byte[0] = offset_y * hor_stride + offset_x * 4;
327*437bfbebSnyanmisaka } break;
328*437bfbebSnyanmisaka default : {
329*437bfbebSnyanmisaka } break;
330*437bfbebSnyanmisaka }
331*437bfbebSnyanmisaka } else {
332*437bfbebSnyanmisaka switch (fmt) {
333*437bfbebSnyanmisaka case MPP_FMT_YUV420SP :
334*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
335*437bfbebSnyanmisaka RK_U32 offset = hor_stride * ver_stride;
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka cfg->offset_byte[1] = offset;
338*437bfbebSnyanmisaka
339*437bfbebSnyanmisaka if (fmt == MPP_FMT_YUV420P)
340*437bfbebSnyanmisaka offset = hor_stride * ver_stride * 5 / 4;
341*437bfbebSnyanmisaka
342*437bfbebSnyanmisaka cfg->offset_byte[2] = offset;
343*437bfbebSnyanmisaka } break;
344*437bfbebSnyanmisaka default : {
345*437bfbebSnyanmisaka } break;
346*437bfbebSnyanmisaka }
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka
349*437bfbebSnyanmisaka return ret;
350*437bfbebSnyanmisaka }
351