mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-12-26 11:17:44 +01:00
feat[kmpp_vdec]: Add kmpp_vdec module
Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I9467fa122fa0c5f3d755714ea63e089a4d86eca9
This commit is contained in:
parent
a0c6f81f7b
commit
b40657a3c7
9 changed files with 387 additions and 0 deletions
51
inc/rk_vdec_kcfg.h
Normal file
51
inc/rk_vdec_kcfg.h
Normal file
|
|
@ -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__*/
|
||||
|
|
@ -17,6 +17,7 @@ add_subdirectory(base)
|
|||
set (KMPP_SRC
|
||||
kmpp.c
|
||||
kmpp_venc.c
|
||||
kmpp_vdec.c
|
||||
)
|
||||
|
||||
add_library(kmpp OBJECT ${KMPP_SRC})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
||||
|
|
|
|||
173
kmpp/base/kmpp_vdec_cfg.c
Normal file
173
kmpp/base/kmpp_vdec_cfg.c
Normal file
|
|
@ -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 <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
33
kmpp/inc/kmpp_vdec.h
Normal file
33
kmpp/inc/kmpp_vdec.h
Normal file
|
|
@ -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__*/
|
||||
15
kmpp/kmpp_vdec.c
Normal file
15
kmpp/kmpp_vdec.c
Normal file
|
|
@ -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"
|
||||
|
|
@ -22,3 +22,6 @@ endmacro()
|
|||
# kmpp venc unit test
|
||||
add_kmpp_test(kmpp_venc)
|
||||
|
||||
# kmpp vdec unit test
|
||||
add_kmpp_test(kmpp_vdec)
|
||||
|
||||
|
|
|
|||
108
kmpp/test/kmpp_vdec_test.c
Normal file
108
kmpp/test/kmpp_vdec_test.c
Normal file
|
|
@ -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 <stdio.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue