xref: /rockchip-linux_mpp/mpp/hal/vpu/vp8e/hal_vp8e_api_v2.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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