1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_enc_hal"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include "mpp_mem.h"
9*437bfbebSnyanmisaka #include "mpp_log.h"
10*437bfbebSnyanmisaka #include "mpp_common.h"
11*437bfbebSnyanmisaka
12*437bfbebSnyanmisaka #include "mpp.h"
13*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
14*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
15*437bfbebSnyanmisaka
16*437bfbebSnyanmisaka #include "hal_h264e_api_v2.h"
17*437bfbebSnyanmisaka #include "hal_h265e_api_v2.h"
18*437bfbebSnyanmisaka #include "hal_jpege_api_v2.h"
19*437bfbebSnyanmisaka #include "hal_vp8e_api_v2.h"
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka static const MppEncHalApi *hw_enc_apis[] = {
22*437bfbebSnyanmisaka #if HAVE_H264E
23*437bfbebSnyanmisaka &hal_api_h264e_v2,
24*437bfbebSnyanmisaka #endif
25*437bfbebSnyanmisaka #if HAVE_H265E
26*437bfbebSnyanmisaka &hal_api_h265e_v2,
27*437bfbebSnyanmisaka #endif
28*437bfbebSnyanmisaka #if HAVE_JPEGE
29*437bfbebSnyanmisaka &hal_api_jpege_v2,
30*437bfbebSnyanmisaka #endif
31*437bfbebSnyanmisaka #if HAVE_VP8E
32*437bfbebSnyanmisaka &hal_api_vp8e_v2,
33*437bfbebSnyanmisaka #endif
34*437bfbebSnyanmisaka };
35*437bfbebSnyanmisaka
36*437bfbebSnyanmisaka typedef struct MppEncHalImpl_t {
37*437bfbebSnyanmisaka MppCodingType coding;
38*437bfbebSnyanmisaka
39*437bfbebSnyanmisaka void *ctx;
40*437bfbebSnyanmisaka const MppEncHalApi *api;
41*437bfbebSnyanmisaka
42*437bfbebSnyanmisaka HalTaskGroup tasks;
43*437bfbebSnyanmisaka } MppEncHalImpl;
44*437bfbebSnyanmisaka
mpp_enc_hal_init(MppEncHal * ctx,MppEncHalCfg * cfg)45*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_init(MppEncHal *ctx, MppEncHalCfg *cfg)
46*437bfbebSnyanmisaka {
47*437bfbebSnyanmisaka if (NULL == ctx || NULL == cfg) {
48*437bfbebSnyanmisaka mpp_err_f("found NULL input ctx %p cfg %p\n", ctx, cfg);
49*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka *ctx = NULL;
52*437bfbebSnyanmisaka
53*437bfbebSnyanmisaka MppEncHalImpl *p = mpp_calloc(MppEncHalImpl, 1);
54*437bfbebSnyanmisaka if (NULL == p) {
55*437bfbebSnyanmisaka mpp_err_f("malloc failed\n");
56*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
57*437bfbebSnyanmisaka }
58*437bfbebSnyanmisaka
59*437bfbebSnyanmisaka RK_U32 i;
60*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(hw_enc_apis); i++) {
61*437bfbebSnyanmisaka if (cfg->coding == hw_enc_apis[i]->coding) {
62*437bfbebSnyanmisaka p->coding = cfg->coding;
63*437bfbebSnyanmisaka p->api = hw_enc_apis[i];
64*437bfbebSnyanmisaka p->ctx = mpp_calloc_size(void, p->api->ctx_size);
65*437bfbebSnyanmisaka
66*437bfbebSnyanmisaka MPP_RET ret = p->api->init(p->ctx, cfg);
67*437bfbebSnyanmisaka if (ret) {
68*437bfbebSnyanmisaka mpp_err_f("hal %s init failed ret %d\n", hw_enc_apis[i]->name, ret);
69*437bfbebSnyanmisaka break;
70*437bfbebSnyanmisaka }
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka ret = hal_task_group_init(&p->tasks, TASK_BUTT, cfg->task_cnt,
73*437bfbebSnyanmisaka sizeof(EncAsyncTaskInfo));
74*437bfbebSnyanmisaka if (ret) {
75*437bfbebSnyanmisaka mpp_err_f("hal_task_group_init failed ret %d\n", ret);
76*437bfbebSnyanmisaka break;
77*437bfbebSnyanmisaka }
78*437bfbebSnyanmisaka
79*437bfbebSnyanmisaka cfg->tasks = p->tasks;
80*437bfbebSnyanmisaka *ctx = p;
81*437bfbebSnyanmisaka return MPP_OK;
82*437bfbebSnyanmisaka }
83*437bfbebSnyanmisaka }
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka mpp_err_f("could not found coding type %d\n", cfg->coding);
86*437bfbebSnyanmisaka mpp_free(p->ctx);
87*437bfbebSnyanmisaka mpp_free(p);
88*437bfbebSnyanmisaka
89*437bfbebSnyanmisaka return MPP_NOK;
90*437bfbebSnyanmisaka }
91*437bfbebSnyanmisaka
mpp_enc_hal_deinit(MppEncHal ctx)92*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_deinit(MppEncHal ctx)
93*437bfbebSnyanmisaka {
94*437bfbebSnyanmisaka if (NULL == ctx) {
95*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
96*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka MppEncHalImpl *p = (MppEncHalImpl*)ctx;
100*437bfbebSnyanmisaka p->api->deinit(p->ctx);
101*437bfbebSnyanmisaka mpp_free(p->ctx);
102*437bfbebSnyanmisaka if (p->tasks)
103*437bfbebSnyanmisaka hal_task_group_deinit(p->tasks);
104*437bfbebSnyanmisaka mpp_free(p);
105*437bfbebSnyanmisaka return MPP_OK;
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka
mpp_enc_hal_prepare(void * hal)108*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_prepare(void *hal)
109*437bfbebSnyanmisaka {
110*437bfbebSnyanmisaka if (NULL == hal) {
111*437bfbebSnyanmisaka mpp_err_f("found NULL input ctx %p\n", hal);
112*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
113*437bfbebSnyanmisaka }
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka MppEncHalImpl *p = (MppEncHalImpl*)hal;
116*437bfbebSnyanmisaka if (!p->api || !p->api->prepare)
117*437bfbebSnyanmisaka return MPP_OK;
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka return p->api->prepare(p->ctx);
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka
mpp_enc_hal_check_part_mode(MppEncHal ctx)122*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_check_part_mode(MppEncHal ctx)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka MppEncHalImpl *p = (MppEncHalImpl*)ctx;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka if (p && p->api && p->api->part_start && p->api->part_wait)
127*437bfbebSnyanmisaka return MPP_OK;
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka return MPP_NOK;
130*437bfbebSnyanmisaka }
131*437bfbebSnyanmisaka
mpp_enc_hal_start(void * hal,HalEncTask * task)132*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_start(void *hal, HalEncTask *task)
133*437bfbebSnyanmisaka {
134*437bfbebSnyanmisaka if (NULL == hal || NULL == task) {
135*437bfbebSnyanmisaka mpp_err_f("found NULL input ctx %p task %p\n", hal, task);
136*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka MppEncHalImpl *p = (MppEncHalImpl*)hal;
140*437bfbebSnyanmisaka if (!p->api || !p->api->start)
141*437bfbebSnyanmisaka return MPP_OK;
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka /* Add buffer sync process */
144*437bfbebSnyanmisaka mpp_buffer_sync_partial_end(task->output, 0, task->length);
145*437bfbebSnyanmisaka
146*437bfbebSnyanmisaka return p->api->start(p->ctx, task);
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka #define MPP_ENC_HAL_TASK_FUNC(func) \
150*437bfbebSnyanmisaka MPP_RET mpp_enc_hal_##func(void *hal, HalEncTask *task) \
151*437bfbebSnyanmisaka { \
152*437bfbebSnyanmisaka if (NULL == hal || NULL == task) { \
153*437bfbebSnyanmisaka mpp_err_f("found NULL input ctx %p task %p\n", hal, task); \
154*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR; \
155*437bfbebSnyanmisaka } \
156*437bfbebSnyanmisaka \
157*437bfbebSnyanmisaka MppEncHalImpl *p = (MppEncHalImpl*)hal; \
158*437bfbebSnyanmisaka if (!p->api || !p->api->func) \
159*437bfbebSnyanmisaka return MPP_OK; \
160*437bfbebSnyanmisaka \
161*437bfbebSnyanmisaka return p->api->func(p->ctx, task); \
162*437bfbebSnyanmisaka }
163*437bfbebSnyanmisaka
164*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(get_task)
165*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(gen_regs)
166*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(wait)
167*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(part_start)
168*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(part_wait)
169*437bfbebSnyanmisaka MPP_ENC_HAL_TASK_FUNC(ret_task)
170