xref: /rockchip-linux_mpp/mpp/hal/vpu/h263d/hal_h263d_api.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2016 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 #include <string.h>
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include "mpp_env.h"
20*437bfbebSnyanmisaka #include "mpp_debug.h"
21*437bfbebSnyanmisaka #include "mpp_platform.h"
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_hal.h"
24*437bfbebSnyanmisaka #include "hal_h263d_base.h"
25*437bfbebSnyanmisaka #include "hal_h263d_vdpu1.h"
26*437bfbebSnyanmisaka #include "hal_h263d_vdpu2.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka RK_U32 h263d_hal_debug = 0;
29*437bfbebSnyanmisaka 
vpu_h263d_get_buffer_by_index(hal_h263_ctx * ctx,RK_S32 index,MppBuffer * buffer)30*437bfbebSnyanmisaka void vpu_h263d_get_buffer_by_index(hal_h263_ctx *ctx, RK_S32 index,
31*437bfbebSnyanmisaka                                    MppBuffer *buffer)
32*437bfbebSnyanmisaka {
33*437bfbebSnyanmisaka     if (index >= 0) {
34*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frm_slots, index, SLOT_BUFFER, buffer);
35*437bfbebSnyanmisaka         mpp_assert(*buffer);
36*437bfbebSnyanmisaka     }
37*437bfbebSnyanmisaka }
38*437bfbebSnyanmisaka 
hal_h263d_gen_regs(void * hal,HalTaskInfo * task)39*437bfbebSnyanmisaka static MPP_RET hal_h263d_gen_regs(void *hal, HalTaskInfo *task)
40*437bfbebSnyanmisaka {
41*437bfbebSnyanmisaka     hal_h263_ctx *ctx = (hal_h263_ctx *)hal;
42*437bfbebSnyanmisaka     return ctx->hal_api.reg_gen(hal, task);
43*437bfbebSnyanmisaka }
44*437bfbebSnyanmisaka 
hal_h263d_start(void * hal,HalTaskInfo * task)45*437bfbebSnyanmisaka static MPP_RET hal_h263d_start(void *hal, HalTaskInfo *task)
46*437bfbebSnyanmisaka {
47*437bfbebSnyanmisaka     hal_h263_ctx *ctx = (hal_h263_ctx *)hal;
48*437bfbebSnyanmisaka     return ctx->hal_api.start(hal, task);
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka 
hal_h263d_wait(void * hal,HalTaskInfo * task)51*437bfbebSnyanmisaka static MPP_RET hal_h263d_wait(void *hal, HalTaskInfo *task)
52*437bfbebSnyanmisaka {
53*437bfbebSnyanmisaka     hal_h263_ctx *ctx = (hal_h263_ctx *)hal;
54*437bfbebSnyanmisaka     return ctx->hal_api.wait(hal, task);
55*437bfbebSnyanmisaka }
56*437bfbebSnyanmisaka 
hal_h263d_deinit(void * hal)57*437bfbebSnyanmisaka static MPP_RET hal_h263d_deinit(void *hal)
58*437bfbebSnyanmisaka {
59*437bfbebSnyanmisaka     hal_h263_ctx *ctx = (hal_h263_ctx *)hal;
60*437bfbebSnyanmisaka     return ctx->hal_api.deinit(hal);
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka 
hal_h263d_init(void * hal,MppHalCfg * cfg)63*437bfbebSnyanmisaka static MPP_RET hal_h263d_init(void *hal, MppHalCfg *cfg)
64*437bfbebSnyanmisaka {
65*437bfbebSnyanmisaka     MppHalApi *p_api = NULL;
66*437bfbebSnyanmisaka     hal_h263_ctx *p_hal = (hal_h263_ctx *)hal;
67*437bfbebSnyanmisaka     VpuHwMode hw_mode = MODE_NULL;
68*437bfbebSnyanmisaka     RK_U32 hw_flag = 0;
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka     mpp_env_get_u32("h263d_hal_debug", &h263d_hal_debug, 0);
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     memset(p_hal, 0, sizeof(hal_h263_ctx));
73*437bfbebSnyanmisaka     p_api = &p_hal->hal_api;
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka     p_hal->frm_slots = cfg->frame_slots;
76*437bfbebSnyanmisaka     p_hal->pkt_slots = cfg->packet_slots;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     hw_flag = mpp_get_vcodec_type();
79*437bfbebSnyanmisaka     if (hw_flag & HAVE_VDPU2)
80*437bfbebSnyanmisaka         hw_mode = VDPU2_MODE;
81*437bfbebSnyanmisaka     if (hw_flag & HAVE_VDPU1)
82*437bfbebSnyanmisaka         hw_mode = VDPU1_MODE;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     switch (hw_mode) {
85*437bfbebSnyanmisaka     case VDPU2_MODE : {
86*437bfbebSnyanmisaka         mpp_log("the VDPU2_MODE is used currently!\n");
87*437bfbebSnyanmisaka         p_api->init    = hal_vpu2_h263d_init;
88*437bfbebSnyanmisaka         p_api->deinit  = hal_vpu2_h263d_deinit;
89*437bfbebSnyanmisaka         p_api->reg_gen = hal_vpu2_h263d_gen_regs;
90*437bfbebSnyanmisaka         p_api->start   = hal_vpu2_h263d_start;
91*437bfbebSnyanmisaka         p_api->wait    = hal_vpu2_h263d_wait;
92*437bfbebSnyanmisaka         p_api->reset   = NULL;
93*437bfbebSnyanmisaka         p_api->flush   = NULL;
94*437bfbebSnyanmisaka         p_api->control = NULL;
95*437bfbebSnyanmisaka     } break;
96*437bfbebSnyanmisaka     case VDPU1_MODE : {
97*437bfbebSnyanmisaka         mpp_log("the VDPU1_MODE is used currently!\n");
98*437bfbebSnyanmisaka         p_api->init    = hal_vpu1_h263d_init;
99*437bfbebSnyanmisaka         p_api->deinit  = hal_vpu1_h263d_deinit;
100*437bfbebSnyanmisaka         p_api->reg_gen = hal_vpu1_h263d_gen_regs;
101*437bfbebSnyanmisaka         p_api->start   = hal_vpu1_h263d_start;
102*437bfbebSnyanmisaka         p_api->wait    = hal_vpu1_h263d_wait;
103*437bfbebSnyanmisaka         p_api->reset   = NULL;
104*437bfbebSnyanmisaka         p_api->flush   = NULL;
105*437bfbebSnyanmisaka         p_api->control = NULL;
106*437bfbebSnyanmisaka     } break;
107*437bfbebSnyanmisaka     default : {
108*437bfbebSnyanmisaka         mpp_err("unknow vpu type:%d.", hw_mode);
109*437bfbebSnyanmisaka         return MPP_ERR_INIT;
110*437bfbebSnyanmisaka     } break;
111*437bfbebSnyanmisaka     }
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     return p_api->init(hal, cfg);
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka 
116*437bfbebSnyanmisaka const MppHalApi hal_api_h263d = {
117*437bfbebSnyanmisaka     .name = "h263d_vpu",
118*437bfbebSnyanmisaka     .type = MPP_CTX_DEC,
119*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingH263,
120*437bfbebSnyanmisaka     .ctx_size = sizeof(hal_h263_ctx),
121*437bfbebSnyanmisaka     .flag = 0,
122*437bfbebSnyanmisaka     .init = hal_h263d_init,
123*437bfbebSnyanmisaka     .deinit = hal_h263d_deinit,
124*437bfbebSnyanmisaka     .reg_gen = hal_h263d_gen_regs,
125*437bfbebSnyanmisaka     .start = hal_h263d_start,
126*437bfbebSnyanmisaka     .wait = hal_h263d_wait,
127*437bfbebSnyanmisaka     .reset = NULL,
128*437bfbebSnyanmisaka     .flush = NULL,
129*437bfbebSnyanmisaka     .control = NULL,
130*437bfbebSnyanmisaka };
131