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