/* * 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_h264e_api_v2" #include #include #include #include "mpp_env.h" #include "mpp_mem.h" #include "mpp_platform.h" #include "hal_h264e_debug.h" #include "h264e_syntax.h" #include "vepu5xx.h" #include "hal_h264e_api_v2.h" #include "hal_h264e_vepu1_v2.h" #include "hal_h264e_vepu2_v2.h" #include "hal_h264e_vepu541.h" #include "hal_h264e_vepu580.h" typedef struct HalH264eCtx_t { const MppEncHalApi *api; void *hw_ctx; } HalH264eCtx; RK_U32 hal_h264e_debug = 0; static MPP_RET hal_h264e_init(void *hal, MppEncHalCfg *cfg) { HalH264eCtx *ctx = (HalH264eCtx *)hal; const MppEncHalApi *api = NULL; void *hw_ctx = NULL; MPP_RET ret = MPP_OK; RK_U32 vcodec_type = mpp_get_vcodec_type(); mpp_env_get_u32("hal_h264e_debug", &hal_h264e_debug, 0); if (vcodec_type & HAVE_RKVENC) { RK_U32 hw_id = mpp_get_client_hw_id(VPU_CLIENT_RKVENC); switch (hw_id) { case HWID_VEPU58X : { api = &hal_h264e_vepu580; } break; default : { api = &hal_h264e_vepu541; } break; } } else if (vcodec_type & HAVE_VEPU2) { api = &hal_h264e_vepu2; } else if (vcodec_type & HAVE_VEPU1) { api = &hal_h264e_vepu1; } else { mpp_err("vcodec type %08x can not find H.264 encoder device\n", vcodec_type); ret = MPP_NOK; } mpp_assert(api); if (!ret) hw_ctx = mpp_calloc_size(void, api->ctx_size); ctx->api = api; ctx->hw_ctx = hw_ctx; if (ret) return ret; ret = api->init(hw_ctx, cfg); return ret; } static MPP_RET hal_h264e_deinit(void *hal) { HalH264eCtx *ctx = (HalH264eCtx *)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_H264E_FUNC(func) \ static MPP_RET hal_h264e_##func(void *hal) \ { \ HalH264eCtx *ctx = (HalH264eCtx *)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_H264E_TASK_FUNC(func) \ static MPP_RET hal_h264e_##func(void *hal, HalEncTask *task) \ { \ HalH264eCtx *ctx = (HalH264eCtx *)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_H264E_FUNC(prepare) HAL_H264E_TASK_FUNC(get_task) HAL_H264E_TASK_FUNC(gen_regs) HAL_H264E_TASK_FUNC(start) HAL_H264E_TASK_FUNC(wait) HAL_H264E_TASK_FUNC(part_start) HAL_H264E_TASK_FUNC(part_wait) HAL_H264E_TASK_FUNC(ret_task) const MppEncHalApi hal_api_h264e_v2 = { .name = "hal_h264e", .coding = MPP_VIDEO_CodingAVC, .ctx_size = sizeof(HalH264eCtx), .flag = 0, .init = hal_h264e_init, .deinit = hal_h264e_deinit, .prepare = hal_h264e_prepare, .get_task = hal_h264e_get_task, .gen_regs = hal_h264e_gen_regs, .start = hal_h264e_start, .wait = hal_h264e_wait, .part_start = hal_h264e_part_start, .part_wait = hal_h264e_part_wait, .ret_task = hal_h264e_ret_task, };