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.
239 lines
5.1 KiB
239 lines
5.1 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2019. All rights reserved.
|
|
* Description: adec common
|
|
* Author: audio
|
|
* Create: 2019-05-30
|
|
*/
|
|
|
|
#include "adec_common.h"
|
|
#include <sys/time.h>
|
|
#include "mpi_system_ext.h"
|
|
#include "mpi_memory_ext.h"
|
|
#include "mpi_adec_debug.h"
|
|
#include "mpi_adec_imple.h"
|
|
|
|
#define TIME_RATION 1000
|
|
|
|
td_void adec_sleep(td_ulong ms)
|
|
{
|
|
struct timespec ts;
|
|
|
|
if (ms == 0) {
|
|
return;
|
|
}
|
|
|
|
ts.tv_sec = (td_slong)(ms / TIME_RATION);
|
|
ts.tv_nsec = (ms % TIME_RATION) * TIME_RATION * TIME_RATION;
|
|
|
|
if (nanosleep(&ts, TD_NULL) != 0) {
|
|
soc_log_err("call nanosleep failed\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
td_u32 adec_get_time_stamp(td_void)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 time_ms = 0;
|
|
|
|
ret = ext_mpi_sys_get_time_stamp_ms(&time_ms);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(ext_mpi_sys_get_time_stamp_ms, ret);
|
|
return 0;
|
|
}
|
|
|
|
return time_ms;
|
|
}
|
|
|
|
td_u64 adec_get_time64(td_void)
|
|
{
|
|
td_s32 ret;
|
|
td_u64 us;
|
|
struct timespec ts;
|
|
|
|
ret = clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
if (ret != 0) {
|
|
soc_log_err("clock_gettime return err %d, errno=%d\n", ret, errno);
|
|
return 0;
|
|
}
|
|
/* use 1000000ULL to covert seconds to us && use 1000 to covert nsec to us */
|
|
us = (td_u64)((ts.tv_sec * 1000000ULL) + ts.tv_nsec / 1000);
|
|
return us;
|
|
}
|
|
|
|
td_void adec_mutex_init(pthread_mutex_t *mutex)
|
|
{
|
|
if (mutex == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
if (pthread_mutex_init(mutex, TD_NULL) != 0) {
|
|
soc_log_err("init mutex failed\n");
|
|
}
|
|
}
|
|
|
|
td_void adec_mutex_deinit(pthread_mutex_t *mutex)
|
|
{
|
|
if (mutex == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
if (pthread_mutex_destroy(mutex) != 0) {
|
|
soc_log_err("destory mutex failed\n");
|
|
}
|
|
}
|
|
|
|
td_void adec_mutex_lock(pthread_mutex_t *mutex)
|
|
{
|
|
if (mutex == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
if (pthread_mutex_lock(mutex) != 0) {
|
|
soc_log_err("Lock mutex failed\n");
|
|
}
|
|
}
|
|
|
|
td_void adec_mutex_unlock(pthread_mutex_t *mutex)
|
|
{
|
|
if (mutex == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
if (pthread_mutex_unlock(mutex) != 0) {
|
|
soc_log_err("Unlock mutex failed\n");
|
|
}
|
|
}
|
|
|
|
td_void adec_free(td_void *buf)
|
|
{
|
|
if (buf == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
free(buf);
|
|
}
|
|
|
|
td_void *adec_malloc(td_u32 size)
|
|
{
|
|
td_s32 ret;
|
|
td_void *buf = TD_NULL;
|
|
|
|
if (size == 0) {
|
|
soc_log_err("invalid size\n");
|
|
return TD_NULL;
|
|
}
|
|
|
|
buf = malloc(size);
|
|
if (buf == TD_NULL) {
|
|
soc_log_err("call malloc( failed\n");
|
|
return TD_NULL;
|
|
}
|
|
|
|
ret = memset_s(buf, size, 0, size);
|
|
if (ret != EOK) {
|
|
soc_err_print_call_fun_err(memset_s, ret);
|
|
free(buf);
|
|
return TD_NULL;
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
td_u32 adec_get_max_pcm_out_size(const uapi_acodec_decode *codec, td_void *decoder)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 size = 0;
|
|
|
|
if ((decoder == TD_NULL) ||
|
|
(codec == TD_NULL) ||
|
|
(codec->get_max_pcm_out_size == TD_NULL)) {
|
|
return 0;
|
|
}
|
|
|
|
ret = codec->get_max_pcm_out_size(decoder, &size);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(codec->get_max_pcm_out_size, ret);
|
|
return 0;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
td_u32 adec_get_max_bits_out_size(const uapi_acodec_decode *codec, td_void *decoder)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 size = 0;
|
|
|
|
if ((decoder == TD_NULL) ||
|
|
(codec == TD_NULL) ||
|
|
(codec->get_max_bits_out_size == TD_NULL)) {
|
|
return 0;
|
|
}
|
|
|
|
ret = codec->get_max_bits_out_size(decoder, &size);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(codec->get_max_bits_out_size, ret);
|
|
return 0;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
/* @decoder is allowed to be NULL */
|
|
td_s32 adec_set_config(const uapi_acodec_decode *codec, td_void *decoder, td_void *codec_cfg)
|
|
{
|
|
td_s32 ret;
|
|
|
|
check_adec_null_ptr(codec);
|
|
check_adec_null_ptr(codec_cfg);
|
|
check_adec_null_ptr(codec->set_config);
|
|
|
|
ret = codec->set_config(decoder, codec_cfg);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(codec->set_config, ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 adec_decode_frame(const uapi_acodec_decode *codec, td_void *decoder,
|
|
uapi_acodec_dec_in_packet *in_pkt, uapi_acodec_dec_out_packet *out_pkt)
|
|
{
|
|
check_adec_null_ptr(codec);
|
|
check_adec_null_ptr(decoder);
|
|
check_adec_null_ptr(in_pkt);
|
|
check_adec_null_ptr(out_pkt);
|
|
check_adec_null_ptr(codec->decode_frame);
|
|
|
|
return codec->decode_frame(decoder, in_pkt, out_pkt);
|
|
}
|
|
|
|
td_s32 adec_register_decoder(const td_char *codec_name)
|
|
{
|
|
return adec_register_decoder_imple(codec_name);
|
|
}
|
|
|
|
td_s32 adec_get_codec_id(uapi_acodec_format format, td_u32 *codec_id)
|
|
{
|
|
return adec_find_support_decoder_imple(format, codec_id);
|
|
}
|
|
|
|
td_s32 adec_set_config_decoder(const td_u32 codec_id, td_void *cfg)
|
|
{
|
|
uapi_acodec_decode *codec = adec_find_ha_decoder_imple(codec_id);
|
|
if (codec == TD_NULL) {
|
|
soc_err_print_h32(codec_id);
|
|
soc_err_print_str(adec_get_decoder_lib_name_imple(codec_id));
|
|
return SOC_ERR_ADEC_NOT_SUPPORT;
|
|
}
|
|
|
|
return adec_set_config(codec, TD_NULL, cfg);
|
|
}
|
|
|
|
uapi_acodec_decode *adec_get_decoder_list(td_void)
|
|
{
|
|
return adec_get_decoder_list_imple();
|
|
}
|