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 #define MODULE_TAG "hal_vp8e_api_v2"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
26*437bfbebSnyanmisaka #include "mpp_platform.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka //#include "hal_vp8e_base.h"
29*437bfbebSnyanmisaka #include "hal_vp8e_vepu2_v2.h"
30*437bfbebSnyanmisaka #include "hal_vp8e_vepu1_v2.h"
31*437bfbebSnyanmisaka #include "hal_vp8e_debug.h"
32*437bfbebSnyanmisaka #include "hal_vp8e_api_v2.h"
33*437bfbebSnyanmisaka
34*437bfbebSnyanmisaka typedef struct Halvp8eCtx_t {
35*437bfbebSnyanmisaka const MppEncHalApi *api;
36*437bfbebSnyanmisaka void *hw_ctx;
37*437bfbebSnyanmisaka } Halvp8eCtx;
38*437bfbebSnyanmisaka
39*437bfbebSnyanmisaka RK_U32 vp8e_hal_debug = 0;
40*437bfbebSnyanmisaka
hal_vp8e_init(void * hal,MppEncHalCfg * cfg)41*437bfbebSnyanmisaka static MPP_RET hal_vp8e_init(void *hal, MppEncHalCfg *cfg)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka const MppEncHalApi *p_api = NULL;
44*437bfbebSnyanmisaka Halvp8eCtx *ctx = (Halvp8eCtx *)hal;
45*437bfbebSnyanmisaka MppClientType type = VPU_CLIENT_BUTT;
46*437bfbebSnyanmisaka void* hw_ctx = NULL;
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka memset(ctx, 0, sizeof(Halvp8eCtx));
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka mpp_env_get_u32("vp8e_hal_debug", &vp8e_hal_debug, 0);
51*437bfbebSnyanmisaka
52*437bfbebSnyanmisaka {
53*437bfbebSnyanmisaka RK_U32 hw_flag = mpp_get_vcodec_type();
54*437bfbebSnyanmisaka if (hw_flag & HAVE_VEPU2) {
55*437bfbebSnyanmisaka p_api = &hal_vp8e_vepu2;
56*437bfbebSnyanmisaka type = VPU_CLIENT_VEPU2;
57*437bfbebSnyanmisaka } else if (hw_flag & HAVE_VEPU1) {
58*437bfbebSnyanmisaka p_api = &hal_vp8e_vepu1;
59*437bfbebSnyanmisaka type = VPU_CLIENT_VEPU1;
60*437bfbebSnyanmisaka } else {
61*437bfbebSnyanmisaka mpp_err_f("Failed to init due to unsupported hard mode, hw_flag = %d\n", hw_flag);
62*437bfbebSnyanmisaka return MPP_ERR_INIT;
63*437bfbebSnyanmisaka }
64*437bfbebSnyanmisaka }
65*437bfbebSnyanmisaka
66*437bfbebSnyanmisaka mpp_assert(p_api);
67*437bfbebSnyanmisaka mpp_assert(type != VPU_CLIENT_BUTT);
68*437bfbebSnyanmisaka
69*437bfbebSnyanmisaka hw_ctx = mpp_calloc_size(void, p_api->ctx_size);
70*437bfbebSnyanmisaka if (NULL == hw_ctx)
71*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
72*437bfbebSnyanmisaka
73*437bfbebSnyanmisaka ctx->hw_ctx = hw_ctx;
74*437bfbebSnyanmisaka ctx->api = p_api;
75*437bfbebSnyanmisaka cfg->type = type;
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka return p_api->init(hw_ctx, cfg);
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka
hal_vp8e_deinit(void * hal)80*437bfbebSnyanmisaka static MPP_RET hal_vp8e_deinit(void *hal)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka Halvp8eCtx *ctx = (Halvp8eCtx *)hal;
83*437bfbebSnyanmisaka const MppEncHalApi *api = ctx->api;
84*437bfbebSnyanmisaka void *hw_ctx = ctx->hw_ctx;
85*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka if (!hw_ctx || !api || !api->deinit)
88*437bfbebSnyanmisaka return MPP_OK;
89*437bfbebSnyanmisaka
90*437bfbebSnyanmisaka ret = api->deinit(hw_ctx);
91*437bfbebSnyanmisaka MPP_FREE(hw_ctx);
92*437bfbebSnyanmisaka return ret;
93*437bfbebSnyanmisaka }
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka #define HAL_VP8E_FUNC(func) \
96*437bfbebSnyanmisaka static MPP_RET hal_vp8e_##func(void *hal) \
97*437bfbebSnyanmisaka { \
98*437bfbebSnyanmisaka Halvp8eCtx *ctx = (Halvp8eCtx *)hal; \
99*437bfbebSnyanmisaka const MppEncHalApi *api = ctx->api; \
100*437bfbebSnyanmisaka void *hw_ctx = ctx->hw_ctx; \
101*437bfbebSnyanmisaka \
102*437bfbebSnyanmisaka if (!hw_ctx || !api || !api->func) \
103*437bfbebSnyanmisaka return MPP_OK; \
104*437bfbebSnyanmisaka \
105*437bfbebSnyanmisaka return api->func(hw_ctx); \
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka
108*437bfbebSnyanmisaka #define HAL_VP8E_TASK_FUNC(func) \
109*437bfbebSnyanmisaka static MPP_RET hal_vp8e_##func(void *hal, HalEncTask *task) \
110*437bfbebSnyanmisaka { \
111*437bfbebSnyanmisaka Halvp8eCtx *ctx = (Halvp8eCtx *)hal; \
112*437bfbebSnyanmisaka const MppEncHalApi *api = ctx->api; \
113*437bfbebSnyanmisaka void *hw_ctx = ctx->hw_ctx; \
114*437bfbebSnyanmisaka \
115*437bfbebSnyanmisaka if (!hw_ctx || !api || !api->func) \
116*437bfbebSnyanmisaka return MPP_OK; \
117*437bfbebSnyanmisaka \
118*437bfbebSnyanmisaka return api->func(hw_ctx, task); \
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka
121*437bfbebSnyanmisaka HAL_VP8E_FUNC(prepare)
122*437bfbebSnyanmisaka HAL_VP8E_TASK_FUNC(get_task)
123*437bfbebSnyanmisaka HAL_VP8E_TASK_FUNC(gen_regs)
124*437bfbebSnyanmisaka HAL_VP8E_TASK_FUNC(start)
125*437bfbebSnyanmisaka HAL_VP8E_TASK_FUNC(wait)
126*437bfbebSnyanmisaka HAL_VP8E_TASK_FUNC(ret_task)
127*437bfbebSnyanmisaka
128*437bfbebSnyanmisaka const MppEncHalApi hal_api_vp8e_v2 = {
129*437bfbebSnyanmisaka .name = "hal_vp8e",
130*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingVP8,
131*437bfbebSnyanmisaka .ctx_size = sizeof(Halvp8eCtx),
132*437bfbebSnyanmisaka .flag = 0,
133*437bfbebSnyanmisaka .init = hal_vp8e_init,
134*437bfbebSnyanmisaka .deinit = hal_vp8e_deinit,
135*437bfbebSnyanmisaka .prepare = hal_vp8e_prepare,
136*437bfbebSnyanmisaka .get_task = hal_vp8e_get_task,
137*437bfbebSnyanmisaka .gen_regs = hal_vp8e_gen_regs,
138*437bfbebSnyanmisaka .start = hal_vp8e_start,
139*437bfbebSnyanmisaka .wait = hal_vp8e_wait,
140*437bfbebSnyanmisaka .part_start = NULL,
141*437bfbebSnyanmisaka .part_wait = NULL,
142*437bfbebSnyanmisaka .ret_task = hal_vp8e_ret_task,
143*437bfbebSnyanmisaka };
144