/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2009-2019. All rights reserved. * Description: Defines avplay common api * Author: Hisilicon * Create: 2009-12-21 * History: */ #ifndef __AVPLAY_COMMON_H__ #define __AVPLAY_COMMON_H__ #include #include #include #include "td_type.h" #include "soc_errno.h" #include "soc_log.h" #include "soc_module.h" #include "mpi_stat_ext.h" #include "uapi_memory.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif #define MAX_THREAD_PRIORITY 99 #define TIME_RATION 1000 #define AVPLAY_TYPE_RESERVED (-1) #define AVPLAY_DEFAULT_STRING "***" #define DEMUX_MAX_PID 0x1fff #ifndef DEMUX_INVALID_PID #define DEMUX_INVALID_PID (DEMUX_MAX_PID + 1) #endif #define TIME_IS_S64 #ifdef TIME_IS_U32 typedef td_u32 avplay_time_t; #define time_to_u32(time) (time) #define time_to_u64(time) (td_u64)(time) #define time_to_s64(time) (td_s64)(time) #elif (defined TIME_IS_S64) typedef td_s64 avplay_time_t; #define time_to_u32(time) (td_u32)(time) #define time_to_u64(time) (td_u64)(time) #define time_to_s64(time) (time) #endif #define u64_to_time(val) (avplay_time_t)(val) #define s64_to_time(val) (avplay_time_t)(val) #ifdef AVPLAY_SUPPORT_DEBUGGER #define soc_assert_avplay(expr) soc_assert(expr) #else #define soc_assert_avplay(expr) #endif #define ext_fatal_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_FATAL, SOC_ID_AVPLAY, fmt) #define ext_err_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_ERROR, SOC_ID_AVPLAY, fmt) #define ext_warn_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_WARN, SOC_ID_AVPLAY, fmt) #define ext_info_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_INFO, SOC_ID_AVPLAY, fmt) #define ext_dbg_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_DBG, SOC_ID_AVPLAY, fmt) #define soc_trace_avplay(fmt...) soc_trace(SOC_TRACE_LEVEL_TRACE, SOC_ID_AVPLAY, fmt) #define tag_call(tag) tag #define line_literal(x) #x #define line_call(x) line_literal(x) #if defined(__GNUC__) #ifndef likely #define likely(x) __builtin_expect(!!(x), 1) #endif #ifndef unlikely #define unlikely(x) __builtin_expect(!!(x), 0) #endif #endif #define log_when_error(ret, description) do { \ if (unlikely((ret) != TD_SUCCESS)) { \ ext_err_avplay("[%s] failed, errcode = 0x%x\n", line_call(description), (ret)); \ } \ } while (0) #define log_when_check_fail(condition) do { \ if (unlikely(!(condition))) { \ ext_err_avplay("Check [%s] failed\n", line_call(condition)); \ } \ } while (0) #define return_when_error(ret, description) do { \ if (unlikely((ret) != TD_SUCCESS)) { \ ext_err_avplay("[%s] failed, return 0x%x\n", line_call(description), (ret)); \ return (ret); \ } \ } while (0) #define return_when_check_fail(condition, ret) do { \ if (unlikely(!(condition))) { \ ext_err_avplay("Check [%s] failed, return 0x%x\n", line_call(condition), (ret)); \ return (ret); \ } \ } while (0) #define goto_when_error(ret, description, tag) do { \ if (unlikely((ret) != TD_SUCCESS)) { \ ext_err_avplay("[%s] failed, errcode = 0x%x, goto [%s]\n", line_call(description), (ret), line_call(tag)); \ goto tag_call(tag); \ } \ } while (0) #define goto_when_ctx_is_null(ctx, ret, tag) do { \ if (unlikely((ctx) == TD_NULL)) { \ ext_err_avplay("Avplay context is NULL, maybe has been destoryed\n"); \ (ret) = SOC_ERR_AVPLAY_NULL_PTR; \ goto tag_call(tag); \ } \ } while (0) #define return_when_not_eok(func, ret, description) do { \ if (unlikely((func) != EOK)) { \ ext_err_avplay("Execute %s failed!\n", line_call(description)); \ return (ret); \ } \ } while (0) #define get_array_size(array) (sizeof(array) / sizeof((array)[0])) #define set_bit_enable(who, bit) ((who) | (1LL << ((td_u32)(bit)))) #define get_bit(who, bit) (((who) >> (bit)) & (0x1)) #define is_bit_enable(who, bit) (get_bit(who, bit) != 0) #define has_flag(who, flag) (((td_u32)(who) & (td_u32)(flag)) != 0) #define set_flag(who, flag) do { (who) = (td_u32)(who) | (td_u32)(flag); } while (0) #define clr_flag(who, flag) do { (who) = (td_u32)(who) & (~(td_u32)(flag)); } while (0) #define clr_flag64(who, flag) do { (who) = (td_u64)(who) & (~(td_u64)(flag)); } while (0) #define ptr2str(ptr) ((ptr) == TD_NULL ? "NULL" : (ptr)) #define bool2str(flag) ((flag) ? "true" : "false") #define errcode2str(ret) (((ret) == TD_SUCCESS) ? "SUCCESS" : "FAIL") #define check_param(condition) return_when_check_fail(condition, SOC_ERR_AVPLAY_INVALID_PARA) #define check_null(pointer) return_when_check_fail(((pointer) != NULL), SOC_ERR_AVPLAY_NULL_PTR) #define check_dev(dev) return_when_check_fail(((dev) >= 0), SOC_ERR_AVPLAY_DEV_NO_INIT) #ifndef get_abs #define get_abs(v) abs(v) #endif #ifndef unused #define unused(param) (void)(param) #endif #define avplay_max(a, b) ((a) > (b)) ? (a) : (b) #define avplay_min(a, b) ((a) > (b)) ? (b) : (a) #define avplay_calc_percent(cur, total) ((total) != 0 ? ((cur) * 100LL / (total)) : 0) #define byte_rate_to_kbps(byte_rate) ((byte_rate) * 8 / 1024) /* Function: Compile fails when the condition is false Note: The condition must be pre-compiled */ #define avplay_build_check(condition) ((void)sizeof(char[2 * !!(condition) - 1])) typedef pthread_mutex_t avplay_mutex_t; typedef struct { const td_char *name; td_u8 priority; td_u32 tid; pthread_t pid; td_s32 (*loop)(void *); void *private; } avplay_thread_info; typedef struct { pthread_cond_t cond; const td_char *name; } avplay_cond_info; typedef struct { td_u8 *buf; td_u32 size; td_u32 rd; td_u32 wr; td_u32 evt_cnt; } avplay_efifo_status; typedef struct { td_u64 total_size; td_u64 start_ts; td_u64 byte_rate; /* average byte rate */ td_u64 instant_size; td_u64 instant_start_ts; td_u64 instant_byte_rate; /* instant byte rate every 1s */ } avplay_bps_info; typedef enum { AVPLAY_STEP_ACQ_FRM = 0, AVPLAY_STEP_QUE_FRM, AVPLAY_STEP_MAX, } avplay_step; static inline td_bool avplay_check_int_multip(td_s32 multiplier, td_s32 val, td_s32 *result) { td_s64 temp = (td_s64)(multiplier * val); if (result != NULL) { *result = (td_s32)temp; } return (temp < INT_MAX && temp > INT_MIN); } static inline td_bool avplay_check_unint_multip(td_u32 multiplier, td_u32 val, td_u32 *result) { td_s64 temp = (td_s64)(multiplier * val); if (result != NULL) { *result = (td_u32)temp; } return (temp < UINT_MAX); } td_u64 avplay_gettime_real(td_bool millisecond); td_u64 avplay_gettime_mono(td_bool millisecond); td_u32 avplay_gettime_system(void); void avplay_mutex_init(avplay_mutex_t *mutex); void avplay_mutex_lock(avplay_mutex_t *mutex); td_s32 avplay_mutex_trylock(avplay_mutex_t *mutex); void avplay_mutex_unlock(avplay_mutex_t *mutex); void avplay_cond_init(avplay_cond_info *cond, const td_char *name); void avplay_cond_signal(avplay_cond_info *cond); void avplay_cond_broadcast(avplay_cond_info *cond); /* If timeout < 0, then wait until signal; if timeout == 0, then return immediately. */ /* timeout ms */ td_s32 avplay_cond_wait(avplay_cond_info *cond, avplay_mutex_t *mutex, td_s64 timeout); void avplay_sleep(td_u64 millisecond); td_u32 avplay_gettid(void); td_u32 avplay_getpid(void); td_s32 avplay_thread_create(avplay_thread_info *thread); td_s32 avplay_thread_setname(const avplay_thread_info *thread); td_s32 avplay_thread_setpriority(avplay_thread_info *thread); td_s32 avplay_thread_wait(const avplay_thread_info *thread); #define avplay_atomic_inc(var) __sync_fetch_and_add(&(var), 1) #define avplay_atomic_dec(var) __sync_fetch_and_sub(&(var), 1) #define avplay_atomic_add(var, v) __sync_fetch_and_add(&(var), (v)) #define avplay_atomic_sub(var, v) __sync_fetch_and_sub(&(var), (v)) #define avplay_atomic_set(var, v) do { __sync_lock_test_and_set(&(var), v); } while (0) #define avplay_atomic_read(var) __sync_add_and_fetch(&(var), 0) td_bool avplay_object_equal(const void *dst, const void *src, size_t size); td_s32 avplay_efifo_init(avplay_efifo_status *efifo, td_u32 size); td_s32 avplay_efifo_deinit(avplay_efifo_status *efifo); td_s32 avplay_efifo_write(avplay_efifo_status *efifo, td_u32 id, const void *param, td_u32 param_size); /* param_size in && out */ td_s32 avplay_efifo_read(avplay_efifo_status *efifo, td_u32 *id, void *param, td_u32 *param_size); void avplay_bps_calc(avplay_bps_info *info, td_u64 add_size); td_void avplay_stat_info_notify(avplay_step step, td_u64 index, td_s64 pts, td_s64 delta); #ifdef __cplusplus #if __cplusplus } #endif #endif #endif