singe/thirdparty/rockchip-mpp/kmpp/kmpp.c
2026-09-10 20:17:28 -05:00

81 lines
2.1 KiB
C

/* SPDX-License-Identifier: Apache-2.0 OR MIT */
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*/
#define MODULE_TAG "kmpp"
#include "rk_mpi.h"
#include "mpp_log.h"
#include "mpp_env.h"
#include "kmpp.h"
#include "kmpp_packet.h"
#include "kmpp_info.h"
/* kmpp path mode */
typedef enum KmppMode_e {
KMPP_MODE_AUTO = 0, /* auto-detect / no kmpp wrapper */
KMPP_MODE_LEGACY = 1, /* legacy /dev/vcodec path */
KMPP_MODE_OBJ = 2, /* kmpp_obj path via /dev/kmpp_objs + /dev/kmpp_ioctl */
KMPP_MODE_BUTT,
} KmppMode;
extern KmppOps kmpp_legacy_ops;
extern KmppOps kmpp_venc_obj_ops;
void mpp_get_api(Kmpp *ctx)
{
RK_U32 mode;
if (!ctx)
return;
/* read kmpp_mode env each time: instances may use different modes */
mpp_env_get_u32("kmpp_mode", &mode, 0);
if (mode == KMPP_MODE_AUTO) {
/* auto-detect: obj path available when kernel exposes ctrl_cfg */
mode = kmpp_cap_version(KMPP_CAP_VENC_CTRL_CFG) ?
KMPP_MODE_OBJ : KMPP_MODE_LEGACY;
}
/* requested mode must be supported by the kernel: fall back to the
* other path when not */
if (mode == KMPP_MODE_OBJ && !kmpp_cap_version(KMPP_CAP_VENC_CTRL_CFG)) {
mpp_logw("kmpp_mode 2 not supported, fallback to legacy mode\n");
mode = KMPP_MODE_LEGACY;
} else if (mode == KMPP_MODE_LEGACY && access("/dev/vcodec", F_OK)) {
mpp_logw("kmpp_mode 1 not supported, fallback to obj mode\n");
mode = KMPP_MODE_OBJ;
}
switch (mode) {
case KMPP_MODE_OBJ : {
ctx->mApi = &kmpp_venc_obj_ops;
} break;
case KMPP_MODE_LEGACY : {
ctx->mApi = &kmpp_legacy_ops;
} break;
default : {
mpp_loge("invalid kmpp mode %d, fallback to legacy mode\n", mode);
mode = KMPP_MODE_LEGACY;
ctx->mApi = &kmpp_legacy_ops;
} break;
}
ctx->mMode = mode;
}
void kmpp_release_venc_packet(void *ctx, void *arg)
{
KmppPacket pkt = (KmppPacket)arg;
if (!ctx || !pkt) {
mpp_loge_f("invalid input ctx %p pkt %p\n", ctx, pkt);
return;
}
kmpp_packet_put(pkt);
}