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