xref: /rockchip-linux_mpp/mpp/hal/common/h264/hal_h264e_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_h264e_api_v2"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka #include <unistd.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_env.h"
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_platform.h"
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #include "hal_h264e_debug.h"
28*437bfbebSnyanmisaka #include "h264e_syntax.h"
29*437bfbebSnyanmisaka #include "vepu5xx.h"
30*437bfbebSnyanmisaka #include "hal_h264e_api_v2.h"
31*437bfbebSnyanmisaka #include "hal_h264e_vepu1_v2.h"
32*437bfbebSnyanmisaka #include "hal_h264e_vepu2_v2.h"
33*437bfbebSnyanmisaka #include "hal_h264e_vepu541.h"
34*437bfbebSnyanmisaka #include "hal_h264e_vepu580.h"
35*437bfbebSnyanmisaka #include "hal_h264e_vepu540c.h"
36*437bfbebSnyanmisaka #include "hal_h264e_vepu510.h"
37*437bfbebSnyanmisaka #include "hal_h264e_vepu511.h"
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka typedef struct HalH264eCtx_t {
40*437bfbebSnyanmisaka     const MppEncHalApi  *api;
41*437bfbebSnyanmisaka     void                *hw_ctx;
42*437bfbebSnyanmisaka } HalH264eCtx;
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka RK_U32 hal_h264e_debug = 0;
45*437bfbebSnyanmisaka 
hal_h264e_init(void * hal,MppEncHalCfg * cfg)46*437bfbebSnyanmisaka static MPP_RET hal_h264e_init(void *hal, MppEncHalCfg *cfg)
47*437bfbebSnyanmisaka {
48*437bfbebSnyanmisaka     HalH264eCtx *ctx = (HalH264eCtx *)hal;
49*437bfbebSnyanmisaka     const MppEncHalApi *api = NULL;
50*437bfbebSnyanmisaka     void *hw_ctx = NULL;
51*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
52*437bfbebSnyanmisaka     RK_U32 vcodec_type = mpp_get_vcodec_type();
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka     mpp_env_get_u32("hal_h264e_debug", &hal_h264e_debug, 0);
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka     if (vcodec_type & HAVE_RKVENC) {
57*437bfbebSnyanmisaka         RK_U32 hw_id = mpp_get_client_hw_id(VPU_CLIENT_RKVENC);
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka         switch (hw_id) {
60*437bfbebSnyanmisaka         case HWID_VEPU58X : {
61*437bfbebSnyanmisaka             api = &hal_h264e_vepu580;
62*437bfbebSnyanmisaka         } break;
63*437bfbebSnyanmisaka         case HWID_VEPU540C : {
64*437bfbebSnyanmisaka             api = &hal_h264e_vepu540c;
65*437bfbebSnyanmisaka         } break;
66*437bfbebSnyanmisaka         case HWID_VEPU510 : {
67*437bfbebSnyanmisaka             api = &hal_h264e_vepu510;
68*437bfbebSnyanmisaka         } break;
69*437bfbebSnyanmisaka         case HWID_VEPU511 : {
70*437bfbebSnyanmisaka             api = &hal_h264e_vepu511;
71*437bfbebSnyanmisaka         } break;
72*437bfbebSnyanmisaka         default : {
73*437bfbebSnyanmisaka             api = &hal_h264e_vepu541;
74*437bfbebSnyanmisaka         } break;
75*437bfbebSnyanmisaka         }
76*437bfbebSnyanmisaka     } else if (vcodec_type & HAVE_VEPU2) {
77*437bfbebSnyanmisaka         api = &hal_h264e_vepu2;
78*437bfbebSnyanmisaka     } else if (vcodec_type & HAVE_VEPU1) {
79*437bfbebSnyanmisaka         api = &hal_h264e_vepu1;
80*437bfbebSnyanmisaka     } else {
81*437bfbebSnyanmisaka         mpp_err("vcodec type %08x can not find H.264 encoder device\n",
82*437bfbebSnyanmisaka                 vcodec_type);
83*437bfbebSnyanmisaka         ret = MPP_NOK;
84*437bfbebSnyanmisaka     }
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     mpp_assert(api);
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     if (!ret)
89*437bfbebSnyanmisaka         hw_ctx = mpp_calloc_size(void, api->ctx_size);
90*437bfbebSnyanmisaka 
91*437bfbebSnyanmisaka     ctx->api = api;
92*437bfbebSnyanmisaka     ctx->hw_ctx = hw_ctx;
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     if (ret)
95*437bfbebSnyanmisaka         return ret;
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     ret = api->init(hw_ctx, cfg);
98*437bfbebSnyanmisaka     return ret;
99*437bfbebSnyanmisaka }
100*437bfbebSnyanmisaka 
hal_h264e_deinit(void * hal)101*437bfbebSnyanmisaka static MPP_RET hal_h264e_deinit(void *hal)
102*437bfbebSnyanmisaka {
103*437bfbebSnyanmisaka     HalH264eCtx *ctx = (HalH264eCtx *)hal;
104*437bfbebSnyanmisaka     const MppEncHalApi *api = ctx->api;
105*437bfbebSnyanmisaka     void *hw_ctx = ctx->hw_ctx;
106*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     if (!hw_ctx || !api || !api->deinit)
109*437bfbebSnyanmisaka         return MPP_OK;
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka     ret = api->deinit(hw_ctx);
112*437bfbebSnyanmisaka     MPP_FREE(hw_ctx);
113*437bfbebSnyanmisaka     return ret;
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka #define HAL_H264E_FUNC(func) \
117*437bfbebSnyanmisaka     static MPP_RET hal_h264e_##func(void *hal)                      \
118*437bfbebSnyanmisaka     {                                                               \
119*437bfbebSnyanmisaka         HalH264eCtx *ctx = (HalH264eCtx *)hal;                      \
120*437bfbebSnyanmisaka         const MppEncHalApi *api = ctx->api;                         \
121*437bfbebSnyanmisaka         void *hw_ctx = ctx->hw_ctx;                                 \
122*437bfbebSnyanmisaka                                                                     \
123*437bfbebSnyanmisaka         if (!hw_ctx || !api || !api->func)                          \
124*437bfbebSnyanmisaka             return MPP_OK;                                          \
125*437bfbebSnyanmisaka                                                                     \
126*437bfbebSnyanmisaka         return api->func(hw_ctx);                                   \
127*437bfbebSnyanmisaka     }
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka #define HAL_H264E_TASK_FUNC(func) \
130*437bfbebSnyanmisaka     static MPP_RET hal_h264e_##func(void *hal, HalEncTask *task)    \
131*437bfbebSnyanmisaka     {                                                               \
132*437bfbebSnyanmisaka         HalH264eCtx *ctx = (HalH264eCtx *)hal;                      \
133*437bfbebSnyanmisaka         const MppEncHalApi *api = ctx->api;                         \
134*437bfbebSnyanmisaka         void *hw_ctx = ctx->hw_ctx;                                 \
135*437bfbebSnyanmisaka                                                                     \
136*437bfbebSnyanmisaka         if (!hw_ctx || !api || !api->func)                          \
137*437bfbebSnyanmisaka             return MPP_OK;                                          \
138*437bfbebSnyanmisaka                                                                     \
139*437bfbebSnyanmisaka         return api->func(hw_ctx, task);                             \
140*437bfbebSnyanmisaka     }
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka HAL_H264E_FUNC(prepare)
143*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(get_task)
144*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(gen_regs)
145*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(start)
146*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(wait)
147*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(part_start)
148*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(part_wait)
149*437bfbebSnyanmisaka HAL_H264E_TASK_FUNC(ret_task)
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka const MppEncHalApi hal_api_h264e_v2 = {
152*437bfbebSnyanmisaka     .name       = "hal_h264e",
153*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingAVC,
154*437bfbebSnyanmisaka     .ctx_size   = sizeof(HalH264eCtx),
155*437bfbebSnyanmisaka     .flag       = 0,
156*437bfbebSnyanmisaka     .init       = hal_h264e_init,
157*437bfbebSnyanmisaka     .deinit     = hal_h264e_deinit,
158*437bfbebSnyanmisaka     .prepare    = hal_h264e_prepare,
159*437bfbebSnyanmisaka     .get_task   = hal_h264e_get_task,
160*437bfbebSnyanmisaka     .gen_regs   = hal_h264e_gen_regs,
161*437bfbebSnyanmisaka     .start      = hal_h264e_start,
162*437bfbebSnyanmisaka     .wait       = hal_h264e_wait,
163*437bfbebSnyanmisaka     .part_start = hal_h264e_part_start,
164*437bfbebSnyanmisaka     .part_wait  = hal_h264e_part_wait,
165*437bfbebSnyanmisaka     .ret_task   = hal_h264e_ret_task,
166*437bfbebSnyanmisaka };
167