/* * Copyright 2015 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define MODULE_TAG "hal_vp8e_api_v2" #include #include "mpp_env.h" #include "mpp_mem.h" #include "mpp_common.h" #include "mpp_enc_hal.h" #include "mpp_platform.h" //#include "hal_vp8e_base.h" #include "hal_vp8e_vepu2_v2.h" #include "hal_vp8e_vepu1_v2.h" #include "hal_vp8e_debug.h" #include "hal_vp8e_api_v2.h" typedef struct Halvp8eCtx_t { const MppEncHalApi *api; void *hw_ctx; } Halvp8eCtx; RK_U32 vp8e_hal_debug = 0; static MPP_RET hal_vp8e_init(void *hal, MppEncHalCfg *cfg) { const MppEncHalApi *p_api = NULL; Halvp8eCtx *ctx = (Halvp8eCtx *)hal; MppClientType type = VPU_CLIENT_BUTT; void* hw_ctx = NULL; memset(ctx, 0, sizeof(Halvp8eCtx)); mpp_env_get_u32("vp8e_hal_debug", &vp8e_hal_debug, 0); { RK_U32 hw_flag = mpp_get_vcodec_type(); if (hw_flag & HAVE_VEPU2) { p_api = &hal_vp8e_vepu2; type = VPU_CLIENT_VEPU2; } else if (hw_flag & HAVE_VEPU1) { p_api = &hal_vp8e_vepu1; type = VPU_CLIENT_VEPU1; } else { mpp_err_f("Failed to init due to unsupported hard mode, hw_flag = %d\n", hw_flag); return MPP_ERR_INIT; } } mpp_assert(p_api); mpp_assert(type != VPU_CLIENT_BUTT); hw_ctx = mpp_calloc_size(void, p_api->ctx_size); if (NULL == hw_ctx) return MPP_ERR_MALLOC; ctx->hw_ctx = hw_ctx; ctx->api = p_api; cfg->type = type; return p_api->init(hw_ctx, cfg); } static MPP_RET hal_vp8e_deinit(void *hal) { Halvp8eCtx *ctx = (Halvp8eCtx *)hal; const MppEncHalApi *api = ctx->api; void *hw_ctx = ctx->hw_ctx; MPP_RET ret = MPP_OK; if (!hw_ctx || !api || !api->deinit) return MPP_OK; ret = api->deinit(hw_ctx); MPP_FREE(hw_ctx); return ret; } #define HAL_VP8E_FUNC(func) \ static MPP_RET hal_vp8e_##func(void *hal) \ { \ Halvp8eCtx *ctx = (Halvp8eCtx *)hal; \ const MppEncHalApi *api = ctx->api; \ void *hw_ctx = ctx->hw_ctx; \ \ if (!hw_ctx || !api || !api->func) \ return MPP_OK; \ \ return api->func(hw_ctx); \ } #define HAL_VP8E_TASK_FUNC(func) \ static MPP_RET hal_vp8e_##func(void *hal, HalEncTask *task) \ { \ Halvp8eCtx *ctx = (Halvp8eCtx *)hal; \ const MppEncHalApi *api = ctx->api; \ void *hw_ctx = ctx->hw_ctx; \ \ if (!hw_ctx || !api || !api->func) \ return MPP_OK; \ \ return api->func(hw_ctx, task); \ } HAL_VP8E_FUNC(prepare) HAL_VP8E_TASK_FUNC(get_task) HAL_VP8E_TASK_FUNC(gen_regs) HAL_VP8E_TASK_FUNC(start) HAL_VP8E_TASK_FUNC(wait) HAL_VP8E_TASK_FUNC(ret_task) const MppEncHalApi hal_api_vp8e_v2 = { .name = "hal_vp8e", .coding = MPP_VIDEO_CodingVP8, .ctx_size = sizeof(Halvp8eCtx), .flag = 0, .init = hal_vp8e_init, .deinit = hal_vp8e_deinit, .prepare = hal_vp8e_prepare, .get_task = hal_vp8e_get_task, .gen_regs = hal_vp8e_gen_regs, .start = hal_vp8e_start, .wait = hal_vp8e_wait, .part_start = NULL, .part_wait = NULL, .ret_task = hal_vp8e_ret_task, };