diff --git a/kmpp/CMakeLists.txt b/kmpp/CMakeLists.txt index 9b5f0d44..a123db88 100644 --- a/kmpp/CMakeLists.txt +++ b/kmpp/CMakeLists.txt @@ -16,8 +16,14 @@ add_subdirectory(base) # ---------------------------------------------------------------------------- set (KMPP_SRC kmpp.c + kmpp_venc.c ) add_library(kmpp OBJECT ${KMPP_SRC}) set_target_properties(kmpp PROPERTIES FOLDER "kmpp") +# ---------------------------------------------------------------------------- +# add kmpp test case +# ---------------------------------------------------------------------------- +add_subdirectory(test) + diff --git a/kmpp/base/test/CMakeLists.txt b/kmpp/base/test/CMakeLists.txt index 20e58a7d..beb45ffb 100644 --- a/kmpp/base/test/CMakeLists.txt +++ b/kmpp/base/test/CMakeLists.txt @@ -14,7 +14,7 @@ macro(add_kmpp_base_test module) if(${test_tag}) add_executable(${test_name} ${test_name}.c) target_link_libraries(${test_name} ${MPP_SHARED}) - set_target_properties(${test_name} PROPERTIES FOLDER "osal/test") + set_target_properties(${test_name} PROPERTIES FOLDER "kmpp/test") add_test(NAME ${test_name} COMMAND ${test_name}) endif() endmacro() diff --git a/kmpp/inc/kmpp_venc.h b/kmpp/inc/kmpp_venc.h new file mode 100644 index 00000000..7c37e6da --- /dev/null +++ b/kmpp/inc/kmpp_venc.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2015 Rockchip Electronics Co., Ltd. + */ + +#ifndef __KMPP_VENC_H__ +#define __KMPP_VENC_H__ + +#include "rk_venc_kcfg.h" + +typedef void* KmppVenc; + +#define KMPP_VENC_IOCTL_TABLE(prefix, IOC_CTX, IOC_IN_, IOC_OUT, IOC_IO_) \ + IOC_IN_(prefix, init, MppVencKcfg) \ + IOC_CTX(prefix, deinit) \ + IOC_CTX(prefix, reset) \ + IOC_CTX(prefix, start) \ + IOC_CTX(prefix, stop) \ + IOC_CTX(prefix, suspend) \ + IOC_CTX(prefix, resume) \ + IOC_IN_(prefix, get_cfg, MppVencKcfg) \ + IOC_IN_(prefix, set_cfg, MppVencKcfg) \ + IOC_IO_(prefix, encode, KmppFrame, KmppPacket) \ + IOC_IN_(prefix, put_frm, KmppFrame) \ + IOC_OUT(prefix, get_pkt, KmppPacket) \ + IOC_IN_(prefix, put_pkt, KmppPacket) + +#define KMPP_OBJ_NAME kmpp_venc +#define KMPP_OBJ_INTF_TYPE KmppVenc +#define KMPP_OBJ_FUNC_IOCTL KMPP_VENC_IOCTL_TABLE +#include "kmpp_obj_func.h" + +#endif /*__KMPP_VENC_H__*/ diff --git a/kmpp/kmpp_venc.c b/kmpp/kmpp_venc.c new file mode 100644 index 00000000..65563b83 --- /dev/null +++ b/kmpp/kmpp_venc.c @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_venc" + +#include "kmpp_obj.h" +#include "kmpp_venc.h" + +#define KMPP_OBJ_NAME kmpp_venc +#define KMPP_OBJ_INTF_TYPE KmppVenc +#define KMPP_OBJ_SGLN_ID MPP_SGLN_KMPP_VENC +#define KMPP_OBJ_FUNC_IOCTL KMPP_VENC_IOCTL_TABLE +#include "kmpp_obj_helper.h" diff --git a/kmpp/test/CMakeLists.txt b/kmpp/test/CMakeLists.txt new file mode 100644 index 00000000..e8f49629 --- /dev/null +++ b/kmpp/test/CMakeLists.txt @@ -0,0 +1,24 @@ +# vim: syntax=cmake +# ---------------------------------------------------------------------------- +# kmpp/base built-in unit test case +# ---------------------------------------------------------------------------- +# macro for adding osal sub-module unit test +macro(add_kmpp_test module) + set(test_name ${module}_test) + string(TOUPPER ${test_name} test_tag) + #message(STATUS "moduule : ${module}") + #message(STATUS "test_name : ${test_name}") + #message(STATUS "test_tag : ${test_tag}") + + option(${test_tag} "Build base ${module} unit test" ${BUILD_TEST}) + if(${test_tag}) + add_executable(${test_name} ${test_name}.c) + target_link_libraries(${test_name} ${MPP_SHARED}) + set_target_properties(${test_name} PROPERTIES FOLDER "kmpp/test") + add_test(NAME ${test_name} COMMAND ${test_name}) + endif() +endmacro() + +# kmpp venc unit test +add_kmpp_test(kmpp_venc) + diff --git a/kmpp/test/kmpp_venc_test.c b/kmpp/test/kmpp_venc_test.c new file mode 100644 index 00000000..1b6a98ee --- /dev/null +++ b/kmpp/test/kmpp_venc_test.c @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: Apache-2.0 OR MIT */ +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#define MODULE_TAG "kmpp_venc_test" + +#include "mpp_debug.h" +#include "kmpp_frame.h" +#include "kmpp_packet.h" +#include "kmpp_venc.h" +#include "rk_venc_kcfg.h" + +int main() +{ + KmppVenc venc = NULL; + MppVencKcfg cfg = NULL; + KmppFrame frm = NULL; + KmppPacket pkt = NULL; + rk_s32 ret = rk_ok; + + mpp_log(MODULE_TAG " start\n"); + + ret = kmpp_venc_get(&venc); + if (ret) { + mpp_err(MODULE_TAG " get venc failed\n"); + return ret; + } + + mpp_venc_kcfg_init(&cfg, MPP_VENC_KCFG_TYPE_INIT); + mpp_venc_kcfg_set_u32(cfg, "type", MPP_CTX_ENC); + mpp_venc_kcfg_set_u32(cfg, "coding", MPP_VIDEO_CodingAVC); + mpp_venc_kcfg_set_s32(cfg, "chan_id", 0); + mpp_venc_kcfg_set_u32(cfg, "buf_size", 4096); + mpp_venc_kcfg_set_u32(cfg, "max_width", 1920); + mpp_venc_kcfg_set_u32(cfg, "max_height", 1080); + mpp_venc_kcfg_set_u32(cfg, "max_lt_cnt", 0); + mpp_venc_kcfg_set_s32(cfg, "input_timeout", -1); + + ret = kmpp_venc_init(venc, cfg); + if (ret) { + mpp_err(MODULE_TAG " init venc failed\n"); + return ret; + } + + mpp_venc_kcfg_deinit(cfg); + cfg = NULL; + + mpp_venc_kcfg_init(&cfg, MPP_VENC_KCFG_TYPE_ST_CFG); + + ret = kmpp_venc_get_cfg(venc, cfg); + if (ret) { + mpp_err(MODULE_TAG " get venc cfg failed\n"); + return ret; + } + + ret = kmpp_venc_set_cfg(venc, cfg); + if (ret) { + mpp_err(MODULE_TAG " set venc cfg failed\n"); + return ret; + } + + mpp_venc_kcfg_deinit(cfg); + cfg = NULL; + + ret = kmpp_venc_start(venc); + if (ret) { + mpp_err(MODULE_TAG " start venc failed\n"); + return ret; + } + + kmpp_frame_get(&frm); + + ret = kmpp_venc_put_frm(venc, frm); + if (ret) { + mpp_err(MODULE_TAG " put frm failed\n"); + return ret; + } + + kmpp_frame_put(frm); + frm = NULL; + + ret = kmpp_venc_get_pkt(venc, &pkt); + if (ret) { + mpp_err(MODULE_TAG " get pkt failed\n"); + return ret; + } + + if (pkt) { + ret = kmpp_venc_put_pkt(venc, pkt); + if (ret) { + mpp_err(MODULE_TAG " put pkt failed\n"); + return ret; + } + } + + ret = kmpp_venc_stop(venc); + if (ret) { + mpp_err(MODULE_TAG " stop venc failed\n"); + return ret; + } + + ret = kmpp_venc_deinit(venc); + if (ret) { + mpp_err(MODULE_TAG " deinit venc failed\n"); + return ret; + } + + ret = kmpp_venc_put(venc); + + 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 a86b22e2..3968dc22 100644 --- a/osal/inc/mpp_singleton.h +++ b/osal/inc/mpp_singleton.h @@ -34,6 +34,7 @@ typedef enum MppSingletonId_e { MPP_SGLN_KMPP_FRAME, MPP_SGLN_KMPP_PACKET, MPP_SGLN_KMPP_VENC_CFG, + MPP_SGLN_KMPP_VENC, /* userspace base module */ MPP_SGLN_BUFFER, MPP_SGLN_META,