kmpp_venc_cfg.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /* SPDX-License-Identifier: Apache-2.0 OR MIT */
  2. /*
  3. * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
  4. */
  5. #define MODULE_TAG "kmpp_venc_cfg"
  6. #include <string.h>
  7. #include <pthread.h>
  8. #include "mpp_env.h"
  9. #include "mpp_mem.h"
  10. #include "mpp_debug.h"
  11. #include "mpp_common.h"
  12. #include "kmpp_obj.h"
  13. #include "rk_venc_kcfg.h"
  14. #define VENC_KCFG_DBG_FUNC (0x00000001)
  15. #define VENC_KCFG_DBG_INFO (0x00000002)
  16. #define VENC_KCFG_DBG_SET (0x00000004)
  17. #define VENC_KCFG_DBG_GET (0x00000008)
  18. #define venc_kcfg_dbg(flag, fmt, ...) _mpp_dbg_f(venc_kcfg_debug, flag, fmt, ## __VA_ARGS__)
  19. #define venc_kcfg_dbg_func(fmt, ...) venc_kcfg_dbg(VENC_KCFG_DBG_FUNC, fmt, ## __VA_ARGS__)
  20. #define venc_kcfg_dbg_info(fmt, ...) venc_kcfg_dbg(VENC_KCFG_DBG_INFO, fmt, ## __VA_ARGS__)
  21. #define venc_kcfg_dbg_set(fmt, ...) venc_kcfg_dbg(VENC_KCFG_DBG_SET, fmt, ## __VA_ARGS__)
  22. #define venc_kcfg_dbg_get(fmt, ...) venc_kcfg_dbg(VENC_KCFG_DBG_GET, fmt, ## __VA_ARGS__)
  23. static RK_U32 venc_kcfg_debug = 0;
  24. static char *kcfg_names[] = {
  25. [KMPP_VENC_CFG_TYPE_INIT] = "KmppVencInitCfg",
  26. [KMPP_VENC_CFG_TYPE_DEINIT] = "KmppVencDeinitCfg",
  27. [KMPP_VENC_CFG_TYPE_RESET] = "KmppVencResetCfg",
  28. [KMPP_VENC_CFG_TYPE_START] = "KmppVencStartCfg",
  29. [KMPP_VENC_CFG_TYPE_STOP] = "KmppVencStopCfg",
  30. };
  31. static KmppObjDef kcfg_defs[KMPP_VENC_CFG_TYPE_BUTT] = {NULL};
  32. static pthread_mutex_t lock;
  33. static void kmpp_venc_cfg_def_init() __attribute__((constructor));
  34. static void kmpp_venc_cfg_def_deinit() __attribute__((destructor));
  35. static void kmpp_venc_cfg_def_init(void)
  36. {
  37. pthread_mutexattr_t attr;
  38. pthread_mutexattr_init(&attr);
  39. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  40. pthread_mutex_init(&lock, &attr);
  41. pthread_mutexattr_destroy(&attr);
  42. }
  43. static void kmpp_venc_cfg_def_deinit(void)
  44. {
  45. RK_U32 i;
  46. pthread_mutex_lock(&lock);
  47. for (i = 0; i < KMPP_VENC_CFG_TYPE_BUTT; i++) {
  48. if (kcfg_defs[i]) {
  49. kmpp_objdef_put(kcfg_defs[i]);
  50. kcfg_defs[i] = NULL;
  51. }
  52. }
  53. pthread_mutex_unlock(&lock);
  54. pthread_mutex_destroy(&lock);
  55. }
  56. MPP_RET kmpp_venc_cfg_init(KmppVenccfg *cfg, MppVencKcfgType type)
  57. {
  58. KmppObj obj = NULL;
  59. if (!cfg) {
  60. mpp_err_f("invalid NULL input config\n");
  61. return MPP_ERR_NULL_PTR;
  62. }
  63. if (type >= KMPP_VENC_CFG_TYPE_BUTT) {
  64. mpp_err_f("invalid config type %d\n", type);
  65. return MPP_ERR_VALUE;
  66. }
  67. mpp_env_get_u32("venc_kcfg_debug", &venc_kcfg_debug, 0);
  68. pthread_mutex_lock(&lock);
  69. if (kcfg_defs[type] == NULL) {
  70. MPP_RET ret = (MPP_RET)kmpp_objdef_get(&kcfg_defs[type], kcfg_names[type]);
  71. if (ret) {
  72. mpp_err_f("failed to get %s obj def %d\n", kcfg_names[type], type);
  73. pthread_mutex_unlock(&lock);
  74. return MPP_NOK;
  75. }
  76. }
  77. pthread_mutex_unlock(&lock);
  78. kmpp_obj_get(&obj, kcfg_defs[type]);
  79. *cfg = obj;
  80. return obj ? MPP_OK : MPP_NOK;
  81. }
  82. MPP_RET kmpp_venc_cfg_init_by_name(KmppVenccfg *cfg, const char *name)
  83. {
  84. KmppObj obj = NULL;
  85. MppVencKcfgType type = KMPP_VENC_CFG_TYPE_BUTT;
  86. RK_U32 i;
  87. if (!cfg) {
  88. mpp_err_f("invalid NULL input config\n");
  89. return MPP_ERR_NULL_PTR;
  90. }
  91. for (i = 0; i < KMPP_VENC_CFG_TYPE_BUTT; i++) {
  92. if (!strncmp(name, kcfg_names[i], strlen(kcfg_names[i]))) {
  93. type = i;
  94. break;
  95. }
  96. }
  97. if (type >= KMPP_VENC_CFG_TYPE_BUTT) {
  98. mpp_err_f("invalid config name %s\n", name);
  99. return MPP_ERR_VALUE;
  100. }
  101. mpp_env_get_u32("venc_kcfg_debug", &venc_kcfg_debug, 0);
  102. kmpp_obj_get(&obj, kcfg_defs[type]);
  103. *cfg = obj;
  104. return obj ? MPP_OK : MPP_NOK;
  105. }
  106. MPP_RET kmpp_venc_cfg_deinit(KmppVenccfg cfg)
  107. {
  108. KmppObj obj = cfg;
  109. if (!cfg) {
  110. mpp_err_f("invalid NULL input config\n");
  111. return MPP_ERR_NULL_PTR;
  112. }
  113. kmpp_obj_put(obj);
  114. return MPP_OK;
  115. }
  116. #define KMPP_VENC_CFG_ACCESS(set_type, get_type, cfg_type) \
  117. MPP_RET kmpp_venc_cfg_set_##cfg_type(KmppVenccfg cfg, const char *name, set_type val) \
  118. { \
  119. if (!cfg || !name) { \
  120. mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
  121. return MPP_ERR_NULL_PTR; \
  122. } \
  123. KmppObj obj = (KmppObj)cfg; \
  124. MPP_RET ret = (MPP_RET)kmpp_obj_set_##cfg_type(obj, name, val); \
  125. return ret; \
  126. } \
  127. MPP_RET kmpp_venc_cfg_get_##cfg_type(KmppVenccfg cfg, const char *name, get_type val) \
  128. { \
  129. if (!cfg || !name) { \
  130. mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \
  131. return MPP_ERR_NULL_PTR; \
  132. } \
  133. KmppObj obj = (KmppObj)cfg; \
  134. MPP_RET ret = (MPP_RET)kmpp_obj_get_##cfg_type(obj, name, val); \
  135. return ret; \
  136. }
  137. KMPP_VENC_CFG_ACCESS(RK_S32, RK_S32*, s32);
  138. KMPP_VENC_CFG_ACCESS(RK_U32, RK_U32*, u32);
  139. KMPP_VENC_CFG_ACCESS(RK_S64, RK_S64*, s64);
  140. KMPP_VENC_CFG_ACCESS(RK_U64, RK_U64*, u64);
  141. KMPP_VENC_CFG_ACCESS(void *, void **, ptr);
  142. KMPP_VENC_CFG_ACCESS(void *, void *, st);
  143. void kmpp_venc_cfg_show(KmppVenccfg cfg)
  144. {
  145. KmppObj obj = cfg;
  146. if (!cfg) {
  147. mpp_err_f("invalid NULL input config\n");
  148. return;
  149. }
  150. kmpp_obj_udump(obj);
  151. }