feat[kmpp_venc]: Add kmpp_venc module

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I06f071055caa1c4bab2341258c69398d46671ed3
This commit is contained in:
Herman Chen 2025-10-14 17:57:33 +08:00
parent 067de5647a
commit a0c6f81f7b
7 changed files with 193 additions and 1 deletions

View file

@ -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)

View file

@ -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()

33
kmpp/inc/kmpp_venc.h Normal file
View file

@ -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__*/

15
kmpp/kmpp_venc.c Normal file
View file

@ -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"

24
kmpp/test/CMakeLists.txt Normal file
View file

@ -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)

113
kmpp/test/kmpp_venc_test.c Normal file
View file

@ -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;
}

View file

@ -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,