From b40657a3c749e35655ae3a1f2f5bf2d496634f8f Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Thu, 16 Oct 2025 11:32:51 +0800 Subject: [PATCH] feat[kmpp_vdec]: Add kmpp_vdec module Signed-off-by: Herman Chen Change-Id: I9467fa122fa0c5f3d755714ea63e089a4d86eca9 --- inc/rk_vdec_kcfg.h | 51 +++++++++++ kmpp/CMakeLists.txt | 1 + kmpp/base/CMakeLists.txt | 1 + kmpp/base/kmpp_vdec_cfg.c | 173 +++++++++++++++++++++++++++++++++++++ kmpp/inc/kmpp_vdec.h | 33 +++++++ kmpp/kmpp_vdec.c | 15 ++++ kmpp/test/CMakeLists.txt | 3 + kmpp/test/kmpp_vdec_test.c | 108 +++++++++++++++++++++++ osal/inc/mpp_singleton.h | 2 + 9 files changed, 387 insertions(+) create mode 100644 inc/rk_vdec_kcfg.h create mode 100644 kmpp/base/kmpp_vdec_cfg.c create mode 100644 kmpp/inc/kmpp_vdec.h create mode 100644 kmpp/kmpp_vdec.c create mode 100644 kmpp/test/kmpp_vdec_test.c diff --git a/inc/rk_vdec_kcfg.h b/inc/rk_vdec_kcfg.h new file mode 100644 index 00000000..c9ac98d0 --- /dev/null +++ b/inc/rk_vdec_kcfg.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#ifndef __RK_VDEC_KCFG_H__ +#define __RK_VDEC_KCFG_H__ + +#include "rk_type.h" +#include "mpp_err.h" + +typedef void* MppVdecKcfg; + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + MPP_VDEC_KCFG_TYPE_INIT, + MPP_VDEC_KCFG_TYPE_DEINIT, + MPP_VDEC_KCFG_TYPE_RESET, + MPP_VDEC_KCFG_TYPE_START, + MPP_VDEC_KCFG_TYPE_STOP, + MPP_VDEC_KCFG_TYPE_BUTT, +} MppVdecKcfgType; + +MPP_RET mpp_vdec_kcfg_init(MppVdecKcfg *cfg, MppVdecKcfgType type); +MPP_RET mpp_vdec_kcfg_init_by_name(MppVdecKcfg *cfg, const char *name); +MPP_RET mpp_vdec_kcfg_deinit(MppVdecKcfg cfg); + +MPP_RET mpp_vdec_kcfg_set_s32(MppVdecKcfg cfg, const char *name, RK_S32 val); +MPP_RET mpp_vdec_kcfg_set_u32(MppVdecKcfg cfg, const char *name, RK_U32 val); +MPP_RET mpp_vdec_kcfg_set_s64(MppVdecKcfg cfg, const char *name, RK_S64 val); +MPP_RET mpp_vdec_kcfg_set_u64(MppVdecKcfg cfg, const char *name, RK_U64 val); +MPP_RET mpp_vdec_kcfg_set_ptr(MppVdecKcfg cfg, const char *name, void *val); +MPP_RET mpp_vdec_kcfg_set_st(MppVdecKcfg cfg, const char *name, void *val); + +MPP_RET mpp_vdec_kcfg_get_s32(MppVdecKcfg cfg, const char *name, RK_S32 *val); +MPP_RET mpp_vdec_kcfg_get_u32(MppVdecKcfg cfg, const char *name, RK_U32 *val); +MPP_RET mpp_vdec_kcfg_get_s64(MppVdecKcfg cfg, const char *name, RK_S64 *val); +MPP_RET mpp_vdec_kcfg_get_u64(MppVdecKcfg cfg, const char *name, RK_U64 *val); +MPP_RET mpp_vdec_kcfg_get_ptr(MppVdecKcfg cfg, const char *name, void **val); +MPP_RET mpp_vdec_kcfg_get_st(MppVdecKcfg cfg, const char *name, void *val); + +void mpp_vdec_kcfg_show(MppVdecKcfg cfg); + +#ifdef __cplusplus +} +#endif + +#endif /*__RK_VDEC_KCFG_H__*/ diff --git a/kmpp/CMakeLists.txt b/kmpp/CMakeLists.txt index a123db88..dfeb4bfe 100644 --- a/kmpp/CMakeLists.txt +++ b/kmpp/CMakeLists.txt @@ -17,6 +17,7 @@ add_subdirectory(base) set (KMPP_SRC kmpp.c kmpp_venc.c + kmpp_vdec.c ) add_library(kmpp OBJECT ${KMPP_SRC}) diff --git a/kmpp/base/CMakeLists.txt b/kmpp/base/CMakeLists.txt index a7c9a52f..9d2c1299 100644 --- a/kmpp/base/CMakeLists.txt +++ b/kmpp/base/CMakeLists.txt @@ -10,6 +10,7 @@ add_library(kmpp_base OBJECT kmpp_frame.c kmpp_buffer.c kmpp_venc_cfg.c + kmpp_vdec_cfg.c kmpp_packet.c ) diff --git a/kmpp/base/kmpp_vdec_cfg.c b/kmpp/base/kmpp_vdec_cfg.c new file mode 100644 index 00000000..8dff6faa --- /dev/null +++ b/kmpp/base/kmpp_vdec_cfg.c @@ -0,0 +1,173 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_vdec_cfg" + +#include +#include + +#include "mpp_env.h" +#include "mpp_mem.h" +#include "mpp_debug.h" +#include "mpp_common.h" +#include "mpp_singleton.h" + +#include "kmpp_obj.h" +#include "rk_vdec_kcfg.h" + +#define VDEC_KCFG_DBG_FUNC (0x00000001) +#define VDEC_KCFG_DBG_INFO (0x00000002) +#define VDEC_KCFG_DBG_SET (0x00000004) +#define VDEC_KCFG_DBG_GET (0x00000008) + +#define vdec_kcfg_dbg(flag, fmt, ...) _mpp_dbg_f(vdec_kcfg_debug, flag, fmt, ## __VA_ARGS__) + +#define vdec_kcfg_dbg_func(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_FUNC, fmt, ## __VA_ARGS__) +#define vdec_kcfg_dbg_info(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_INFO, fmt, ## __VA_ARGS__) +#define vdec_kcfg_dbg_set(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_SET, fmt, ## __VA_ARGS__) +#define vdec_kcfg_dbg_get(fmt, ...) vdec_kcfg_dbg(VDEC_KCFG_DBG_GET, fmt, ## __VA_ARGS__) + +static RK_U32 vdec_kcfg_debug = 0; + +static char *kcfg_names[] = { + [MPP_VDEC_KCFG_TYPE_INIT] = "KmppVdecInitCfg", + [MPP_VDEC_KCFG_TYPE_DEINIT] = "KmppVdecDeinitCfg", + [MPP_VDEC_KCFG_TYPE_RESET] = "KmppVdecResetCfg", + [MPP_VDEC_KCFG_TYPE_START] = "KmppVdecStartCfg", + [MPP_VDEC_KCFG_TYPE_STOP] = "KmppVdecStopCfg", +}; +static KmppObjDef kcfg_defs[MPP_VDEC_KCFG_TYPE_BUTT] = {NULL}; + +static void mpp_vdec_kcfg_def_init(void) +{ + RK_U32 i; + + for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) { + kmpp_objdef_get(&kcfg_defs[i], 0, kcfg_names[i]); + } +} + +static void mpp_vdec_kcfg_def_deinit(void) +{ + RK_U32 i; + + for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) { + if (kcfg_defs[i]) { + kmpp_objdef_put(kcfg_defs[i]); + kcfg_defs[i] = NULL; + } + } +} + +MPP_SINGLETON(MPP_SGLN_KMPP_VDEC_CFG, kmpp_vdec_cfg, mpp_vdec_kcfg_def_init, mpp_vdec_kcfg_def_deinit) + +MPP_RET mpp_vdec_kcfg_init(MppVdecKcfg *cfg, MppVdecKcfgType type) +{ + KmppObj obj = NULL; + + if (!cfg) { + mpp_err_f("invalid NULL input config\n"); + return MPP_ERR_NULL_PTR; + } + + if (type >= MPP_VDEC_KCFG_TYPE_BUTT) { + mpp_err_f("invalid config type %d\n", type); + return MPP_ERR_VALUE; + } + + mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0); + + if (kcfg_defs[type]) + kmpp_obj_get_f(&obj, kcfg_defs[type]); + + *cfg = obj; + + return obj ? MPP_OK : MPP_NOK; +} + +MPP_RET mpp_vdec_kcfg_init_by_name(MppVdecKcfg *cfg, const char *name) +{ + KmppObj obj = NULL; + MppVdecKcfgType type = MPP_VDEC_KCFG_TYPE_BUTT; + RK_U32 i; + + if (!cfg) { + mpp_err_f("invalid NULL input config\n"); + return MPP_ERR_NULL_PTR; + } + + for (i = 0; i < MPP_VDEC_KCFG_TYPE_BUTT; i++) { + if (!strncmp(name, kcfg_names[i], strlen(kcfg_names[i]))) { + type = i; + break; + } + } + + if (type >= MPP_VDEC_KCFG_TYPE_BUTT) { + mpp_err_f("invalid config name %s\n", name); + return MPP_ERR_VALUE; + } + + mpp_env_get_u32("vdec_kcfg_debug", &vdec_kcfg_debug, 0); + + kmpp_obj_get_f(&obj, kcfg_defs[type]); + + *cfg = obj; + + return obj ? MPP_OK : MPP_NOK; +} + +MPP_RET mpp_vdec_kcfg_deinit(MppVdecKcfg cfg) +{ + KmppObj obj = cfg; + + if (!cfg) { + mpp_err_f("invalid NULL input config\n"); + return MPP_ERR_NULL_PTR; + } + + return kmpp_obj_put_f(obj); +} + +#define MPP_VDEC_KCFG_ACCESS(set_type, get_type, cfg_type) \ + MPP_RET mpp_vdec_kcfg_set_##cfg_type(MppVdecKcfg cfg, const char *name, set_type val) \ + { \ + if (!cfg || !name) { \ + mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \ + return MPP_ERR_NULL_PTR; \ + } \ + KmppObj obj = (KmppObj)cfg; \ + MPP_RET ret = (MPP_RET)kmpp_obj_set_##cfg_type(obj, name, val); \ + return ret; \ + } \ + MPP_RET mpp_vdec_kcfg_get_##cfg_type(MppVdecKcfg cfg, const char *name, get_type val) \ + { \ + if (!cfg || !name) { \ + mpp_err_f("invalid input cfg %p name %p\n", cfg, name); \ + return MPP_ERR_NULL_PTR; \ + } \ + KmppObj obj = (KmppObj)cfg; \ + MPP_RET ret = (MPP_RET)kmpp_obj_get_##cfg_type(obj, name, val); \ + return ret; \ + } + +MPP_VDEC_KCFG_ACCESS(RK_S32, RK_S32*, s32); +MPP_VDEC_KCFG_ACCESS(RK_U32, RK_U32*, u32); +MPP_VDEC_KCFG_ACCESS(RK_S64, RK_S64*, s64); +MPP_VDEC_KCFG_ACCESS(RK_U64, RK_U64*, u64); +MPP_VDEC_KCFG_ACCESS(void *, void **, ptr); +MPP_VDEC_KCFG_ACCESS(void *, void *, st); + +void mpp_vdec_kcfg_show(MppVdecKcfg cfg) +{ + KmppObj obj = cfg; + + if (!cfg) { + mpp_err_f("invalid NULL input config\n"); + return; + } + + kmpp_obj_udump(obj); +} diff --git a/kmpp/inc/kmpp_vdec.h b/kmpp/inc/kmpp_vdec.h new file mode 100644 index 00000000..0aab5f4d --- /dev/null +++ b/kmpp/inc/kmpp_vdec.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#ifndef __KMPP_VDEC_H__ +#define __KMPP_VDEC_H__ + +#include "rk_vdec_kcfg.h" + +typedef void* KmppVdec; + +#define KMPP_VDEC_IOCTL_TABLE(prefix, IOC_CTX, IOC_IN_, IOC_OUT, IOC_IO_) \ + IOC_IN_(prefix, init, MppVdecKcfg) \ + IOC_CTX(prefix, deinit) \ + IOC_CTX(prefix, reset) \ + IOC_CTX(prefix, start) \ + IOC_CTX(prefix, stop) \ + IOC_IN_(prefix, get_cfg, MppVdecKcfg) \ + IOC_IN_(prefix, set_cfg, MppVdecKcfg) \ + IOC_IN_(prefix, get_rt_cfg, MppVdecKcfg) \ + IOC_IN_(prefix, set_rt_cfg, MppVdecKcfg) \ + IOC_IO_(prefix, decode, KmppPacket, KmppFrame) \ + IOC_IN_(prefix, put_pkt, KmppPacket) \ + IOC_OUT(prefix, get_frm, KmppFrame) \ + IOC_IN_(prefix, put_frm, KmppFrame) + +#define KMPP_OBJ_NAME kmpp_vdec +#define KMPP_OBJ_INTF_TYPE KmppVdec +#define KMPP_OBJ_FUNC_IOCTL KMPP_VDEC_IOCTL_TABLE +#include "kmpp_obj_func.h" + +#endif /*__KMPP_VDEC_H__*/ diff --git a/kmpp/kmpp_vdec.c b/kmpp/kmpp_vdec.c new file mode 100644 index 00000000..7eae13ec --- /dev/null +++ b/kmpp/kmpp_vdec.c @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_vdec" + +#include "kmpp_obj.h" +#include "kmpp_vdec.h" + +#define KMPP_OBJ_NAME kmpp_vdec +#define KMPP_OBJ_INTF_TYPE KmppVdec +#define KMPP_OBJ_SGLN_ID MPP_SGLN_KMPP_VDEC +#define KMPP_OBJ_FUNC_IOCTL KMPP_VDEC_IOCTL_TABLE +#include "kmpp_obj_helper.h" diff --git a/kmpp/test/CMakeLists.txt b/kmpp/test/CMakeLists.txt index e8f49629..f1144e65 100644 --- a/kmpp/test/CMakeLists.txt +++ b/kmpp/test/CMakeLists.txt @@ -22,3 +22,6 @@ endmacro() # kmpp venc unit test add_kmpp_test(kmpp_venc) +# kmpp vdec unit test +add_kmpp_test(kmpp_vdec) + diff --git a/kmpp/test/kmpp_vdec_test.c b/kmpp/test/kmpp_vdec_test.c new file mode 100644 index 00000000..281791d1 --- /dev/null +++ b/kmpp/test/kmpp_vdec_test.c @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_vdec_test" + +#include + +#include "mpp_mem.h" +#include "mpp_debug.h" + +#include "kmpp_frame.h" +#include "kmpp_packet.h" +#include "kmpp_vdec.h" +#include "rk_vdec_kcfg.h" + +int main(int argc, char **argv) +{ + KmppVdec vdec = NULL; + char *path = argv[1]; + MppVdecKcfg cfg; + rk_s32 ret = rk_ok; + + mpp_log(MODULE_TAG " start path %s\n", path); + + ret = kmpp_vdec_get(&vdec); + if (ret) { + mpp_err(MODULE_TAG " get vdec failed\n"); + return ret; + } + + mpp_vdec_kcfg_init(&cfg, MPP_VDEC_KCFG_TYPE_INIT); + mpp_vdec_kcfg_set_u32(cfg, "type", MPP_CTX_ENC); + mpp_vdec_kcfg_set_u32(cfg, "coding", MPP_VIDEO_CodingAVC); + + ret = kmpp_vdec_init(vdec, cfg); + if (ret) { + mpp_err(MODULE_TAG " init vdec failed\n"); + return ret; + } + mpp_vdec_kcfg_deinit(cfg); + cfg = NULL; + + ret = kmpp_vdec_start(vdec); + if (ret) { + mpp_err(MODULE_TAG " start vdec failed\n"); + return ret; + } + + if (path) { + FILE *fp = fopen(path, "rb"); + char *buf = NULL; + rk_s32 size = 0; + + if (fp) { + fseek(fp, 0L, SEEK_END); + size = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + buf = mpp_calloc(char, size); + + if (buf) { + KmppPacket packet = NULL; + KmppFrame frame = NULL; + KmppShmPtr sptr; + + fread(buf, 1, size, fp); + + kmpp_packet_get(&packet); + + sptr.uptr = buf; + sptr.kaddr = 0; + kmpp_packet_set_data(packet, &sptr); + kmpp_packet_set_size(packet, size); + kmpp_packet_set_pos(packet, &sptr); + kmpp_packet_set_length(packet, size); + + kmpp_vdec_put_pkt(vdec, packet); + + kmpp_vdec_get_frm(vdec, &frame); + + kmpp_packet_put(packet); + kmpp_frame_put(frame); + } + + MPP_FREE(buf); + fclose(fp); + } + } + + ret = kmpp_vdec_stop(vdec); + if (ret) { + mpp_err(MODULE_TAG " stop vdec failed\n"); + return ret; + } + + ret = kmpp_vdec_deinit(vdec); + if (ret) { + mpp_err(MODULE_TAG " deinit vdec failed\n"); + return ret; + } + + ret = kmpp_vdec_put(vdec); + + mpp_log(MODULE_TAG " %s\n", ret ? "failed" : "success"); + return ret; +} diff --git a/osal/inc/mpp_singleton.h b/osal/inc/mpp_singleton.h index 3968dc22..c9074338 100644 --- a/osal/inc/mpp_singleton.h +++ b/osal/inc/mpp_singleton.h @@ -35,6 +35,8 @@ typedef enum MppSingletonId_e { MPP_SGLN_KMPP_PACKET, MPP_SGLN_KMPP_VENC_CFG, MPP_SGLN_KMPP_VENC, + MPP_SGLN_KMPP_VDEC_CFG, + MPP_SGLN_KMPP_VDEC, /* userspace base module */ MPP_SGLN_BUFFER, MPP_SGLN_META,