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