You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
4.9 KiB
220 lines
4.9 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2019. All rights reserved.
|
|
* Description: implement of aenc mpi layer
|
|
* Author: audio
|
|
* Create: 2019-06-21
|
|
*/
|
|
|
|
#include "mpi_aenc_debug.h"
|
|
#include "mpi_ao_ext.h"
|
|
#include "mpi_aenc_ext.h"
|
|
#include "mpi_aenc_core.h"
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif /* __cplusplus */
|
|
|
|
#define aenc_get_real_chn(aenc) \
|
|
do { \
|
|
(aenc) = (aenc) & 0xffff; \
|
|
} while (0)
|
|
|
|
td_s32 ext_mpi_aenc_init(td_void)
|
|
{
|
|
return aenc_init();
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_register_encoder(const td_char *codec_name)
|
|
{
|
|
return aenc_register_encoder(codec_name);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_deinit(td_void)
|
|
{
|
|
return aenc_deinit();
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_open(td_handle *aenc, const ext_aenc_attr *aenc_attr)
|
|
{
|
|
td_s32 ret;
|
|
|
|
if ((aenc == TD_NULL) || (aenc_attr == TD_NULL)) {
|
|
return SOC_ERR_AENC_NULL_PTR;
|
|
}
|
|
|
|
ret = aenc_open(aenc, aenc_attr);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_log_err("aenc_open failed(0x%x)\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
*aenc = *aenc | (SOC_ID_AENC << 16); /* low 16 bit store handle, high 16 bit store module ID */
|
|
|
|
return ret;
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_close(td_handle aenc)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_close(aenc);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_send_buffer(td_handle aenc, const ext_ao_frame *ao_frame)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_send_buffer(aenc, ao_frame);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_receive_stream(td_handle aenc, aenc_stream *stream, td_u32 timeout_ms)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_receive_stream(aenc, stream, timeout_ms);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_release_stream(td_handle aenc, const aenc_stream *stream)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_release_stream(aenc, stream);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_set_config_encoder(td_handle aenc, td_void *config)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_set_config_encoder(aenc, config);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_set_enable(td_handle aenc, td_bool enable)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_set_enable(aenc, enable);
|
|
}
|
|
|
|
#define check_ai_handle(ai) (((ai) >> 16) == SOC_ID_AI)
|
|
|
|
static td_s32 mpi_aenc_attach_ai(td_handle aenc, td_handle ai)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
ext_ao_ext_module_fn ext_ao_func = { TD_NULL, TD_NULL };
|
|
|
|
if (!check_ai_handle(ai)) {
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
ret = ext_mpi_ao_get_extern_func(SOC_ID_AI, &ext_ao_func);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(ext_mpi_ao_get_extern_func, ret);
|
|
return ret;
|
|
}
|
|
|
|
if (ext_ao_func.attach == TD_NULL) {
|
|
return SOC_ERR_AENC_NULL_PTR;
|
|
}
|
|
|
|
return ext_ao_func.attach(ai, aenc);
|
|
}
|
|
|
|
static td_s32 mpi_aenc_detach_ai(td_handle aenc, td_handle ai)
|
|
{
|
|
td_s32 ret;
|
|
ext_ao_ext_module_fn ao_func = { TD_NULL, TD_NULL };
|
|
|
|
if (!check_ai_handle(ai)) {
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
ret = ext_mpi_ao_get_extern_func(SOC_ID_AI, &ao_func);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(ext_mpi_ao_get_extern_func, ret);
|
|
return ret;
|
|
}
|
|
|
|
if (ao_func.detach == TD_NULL) {
|
|
return SOC_ERR_AENC_NULL_PTR;
|
|
}
|
|
|
|
return ao_func.detach(ai, aenc);
|
|
}
|
|
|
|
static td_s32 mpi_aenc_get_attach_src(td_handle aenc, td_handle *src)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
if (src == TD_NULL) {
|
|
return SOC_ERR_AENC_NULL_PTR;
|
|
}
|
|
|
|
*src = TD_INVALID_HANDLE;
|
|
return aenc_get_attach_src(aenc, src);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_attach_input(td_handle aenc, td_handle src)
|
|
{
|
|
td_s32 ret;
|
|
|
|
ret = mpi_aenc_attach_ai(aenc, src);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_h32(src);
|
|
soc_err_print_call_fun_err(mpi_aenc_attach_ai, ret);
|
|
return ret;
|
|
}
|
|
|
|
aenc_get_real_chn(aenc);
|
|
|
|
ret = aenc_attach_input(aenc, src);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_log_err("aenc_attach_input failed(0x%x)\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
return aenc_set_enable(aenc, TD_TRUE);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_detach_input(td_handle aenc)
|
|
{
|
|
td_s32 ret;
|
|
td_handle source = TD_INVALID_HANDLE;
|
|
|
|
ret = mpi_aenc_get_attach_src(aenc, &source);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_h32(aenc);
|
|
soc_err_print_call_fun_err(mpi_aenc_get_attach_src, ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = mpi_aenc_detach_ai(aenc, source);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_h32(source);
|
|
soc_err_print_call_fun_err(mpi_aenc_attach_ai, ret);
|
|
return ret;
|
|
}
|
|
|
|
aenc_get_real_chn(aenc);
|
|
ret = aenc_detach_input(aenc);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(aenc_detach_input, ret);
|
|
return ret;
|
|
}
|
|
|
|
return aenc_set_enable(aenc, TD_FALSE);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_set_attr(td_handle aenc, const ext_aenc_attr *aenc_attr)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_set_attr(aenc, aenc_attr);
|
|
}
|
|
|
|
td_s32 ext_mpi_aenc_get_attr(td_handle aenc, ext_aenc_attr *aenc_attr)
|
|
{
|
|
aenc_get_real_chn(aenc);
|
|
return aenc_get_attr(aenc, aenc_attr);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* __cplusplus */
|
|
|