mirror of
https://github.com/nyanmisaka/mpp.git
synced 2026-01-24 03:00:40 +01:00
refactor[kmpp]: Replace venc_packet with KmppPacket
The kmpp.ko should update to after commit:
commit 5502cf37894311092ca591904753ba429a6ab4ee
Author: xiaoxu.chen <xiaoxu.chen@rock-chips.com>
Date: Wed May 21 10:00:44 2025 +0800
feat[kmpp_packet]: Add kmpp_packet interface
Change-Id: I4a5bd37e6e34e084b2b6b4616bac770f58a2d15e
Signed-off-by: xiaoxu.chen <xiaoxu.chen@rock-chips.com>
Change-Id: Id77297068709422c1465093fa8104949a117a662
Signed-off-by: xiaoxu.chen <xiaoxu.chen@rock-chips.com>
This commit is contained in:
parent
1705827021
commit
1c867b3cac
3 changed files with 34 additions and 59 deletions
|
|
@ -69,7 +69,6 @@ struct Kmpp_t {
|
|||
|
||||
KmppOps *mApi;
|
||||
KmppObj mVencInitKcfg;
|
||||
MppMemPool mVencPacketPool;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
89
kmpp/kmpp.c
89
kmpp/kmpp.c
|
|
@ -28,7 +28,7 @@
|
|||
#include "mpp_buffer_impl.h"
|
||||
#include "mpp_frame_impl.h"
|
||||
#include "mpp_packet_impl.h"
|
||||
|
||||
#include "kmpp_packet.h"
|
||||
#include "mpp_vcodec_client.h"
|
||||
#include "mpp_enc_cfg_impl.h"
|
||||
|
||||
|
|
@ -63,40 +63,16 @@ typedef struct KmppFrameInfos_t {
|
|||
};
|
||||
} KmppFrameInfos;
|
||||
|
||||
typedef struct KmppVencPacketInfo_t {
|
||||
RK_U32 flag;
|
||||
RK_U32 temporal_id;
|
||||
RK_U32 packet_offset;
|
||||
RK_U32 packet_len;
|
||||
} KmppVencPacketInfo;
|
||||
|
||||
typedef struct VencPacket_t {
|
||||
RK_U64 u64priv_data;
|
||||
RK_U64 u64packet_addr;
|
||||
RK_U32 len;
|
||||
RK_U32 buf_size;
|
||||
|
||||
RK_U64 u64pts;
|
||||
RK_U64 u64dts;
|
||||
RK_U32 flag;
|
||||
RK_U32 temporal_id;
|
||||
RK_U32 offset;
|
||||
RK_U32 data_num;
|
||||
KmppVencPacketInfo packet[8];
|
||||
} VencPacket;
|
||||
|
||||
static void kmpp_release_venc_packet(void *ctx, void *arg)
|
||||
{
|
||||
Kmpp *p = (Kmpp *)ctx;
|
||||
VencPacket *pkt = (VencPacket *)arg;
|
||||
KmppPacket pkt = (KmppPacket)arg;
|
||||
|
||||
if (!ctx || !pkt) {
|
||||
mpp_err_f("invalid input ctx %p pkt %p\n", ctx, pkt);
|
||||
return;
|
||||
}
|
||||
mpp_vcodec_ioctl(p->mClientFd, VCODEC_CHAN_OUT_STRM_END, 0, sizeof(VencPacket), pkt);
|
||||
|
||||
mpp_mem_pool_put(p->mVencPacketPool, pkt);
|
||||
kmpp_packet_put(pkt);
|
||||
}
|
||||
|
||||
static MPP_RET init(Kmpp *ctx, MppCtxType type, MppCodingType coding)
|
||||
|
|
@ -144,8 +120,6 @@ static MPP_RET init(Kmpp *ctx, MppCtxType type, MppCodingType coding)
|
|||
if (ctx->mPacketGroup == NULL)
|
||||
mpp_buffer_group_get_internal(&ctx->mPacketGroup, MPP_BUFFER_TYPE_ION);
|
||||
|
||||
ctx->mVencPacketPool = mpp_mem_pool_init(sizeof(VencPacket));
|
||||
|
||||
kmpp_obj_get_u32(ctx->mVencInitKcfg, "chan_id", &chan_id);
|
||||
mpp_log("client %d open chan_id %d ok", ctx->mClientFd, chan_id);
|
||||
ctx->mInitDone = 1;
|
||||
|
|
@ -192,11 +166,6 @@ static void clear(Kmpp *ctx)
|
|||
mpp_buffer_group_put(ctx->mPacketGroup);
|
||||
ctx->mPacketGroup = NULL;
|
||||
}
|
||||
|
||||
if (ctx->mVencPacketPool) {
|
||||
mpp_mem_pool_deinit(ctx->mVencPacketPool);
|
||||
ctx->mVencPacketPool = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static MPP_RET start(Kmpp *ctx)
|
||||
|
|
@ -365,41 +334,50 @@ static MPP_RET get_packet(Kmpp *ctx, MppPacket *packet)
|
|||
return MPP_NOK;
|
||||
|
||||
if (FD_ISSET(ctx->mClientFd, &read_fds)) {
|
||||
VencPacket *venc_packet = mpp_mem_pool_get(ctx->mVencPacketPool);
|
||||
KmppShmPtr sptr;
|
||||
MppPacket pkt = NULL;
|
||||
void *ptr = NULL;
|
||||
RK_U32 len;
|
||||
KmppPacket kmpp_pkt = NULL;
|
||||
RK_S32 len;
|
||||
RK_U32 flag;
|
||||
KmppShmPtr pos;
|
||||
RK_S64 dts;
|
||||
RK_S64 pts;
|
||||
|
||||
ret = mpp_vcodec_ioctl(ctx->mClientFd, VCODEC_CHAN_OUT_STRM_BUF_RDY, 0, sizeof(VencPacket), venc_packet);
|
||||
ret = mpp_vcodec_ioctl(ctx->mClientFd, VCODEC_CHAN_OUT_PKT_RDY,
|
||||
0, sizeof(KmppShmPtr), &sptr);
|
||||
if (ret) {
|
||||
mpp_err("chan %d VCODEC_CHAN_OUT_STRM_BUF_RDY failed\n", ctx->mChanId);
|
||||
mpp_err("chan %d VCODEC_CHAN_OUT_PKT_RDY failed\n", ctx->mChanId);
|
||||
return MPP_NOK;
|
||||
}
|
||||
|
||||
ptr = (void *)(intptr_t)(venc_packet->u64priv_data);
|
||||
len = venc_packet->len;
|
||||
kmpp_obj_get_by_sptr_f(&kmpp_pkt, &sptr);
|
||||
kmpp_packet_get_flag(kmpp_pkt, &flag);
|
||||
kmpp_packet_get_length(kmpp_pkt, &len);
|
||||
kmpp_packet_get_pos(kmpp_pkt, &pos);
|
||||
kmpp_packet_get_dts(kmpp_pkt, &dts);
|
||||
kmpp_packet_get_pts(kmpp_pkt, &pts);
|
||||
|
||||
if (ctx->mPacket) {
|
||||
void *dst;
|
||||
|
||||
pkt = ctx->mPacket;
|
||||
ctx->mPacket = NULL;
|
||||
if (ptr) {
|
||||
if (pos.uptr) {
|
||||
dst = mpp_packet_get_pos(pkt);
|
||||
memcpy(dst, ptr + venc_packet->offset, len);
|
||||
memcpy(dst, pos.uptr, len);
|
||||
}
|
||||
mpp_vcodec_ioctl(ctx->mClientFd, VCODEC_CHAN_OUT_STRM_END, 0, sizeof(VencPacket), venc_packet);
|
||||
|
||||
kmpp_packet_put(kmpp_pkt);
|
||||
mpp_packet_set_length(pkt, len);
|
||||
mpp_mem_pool_put(ctx->mVencPacketPool, venc_packet);
|
||||
} else {
|
||||
mpp_packet_init(&pkt, ptr + venc_packet->offset, len);
|
||||
mpp_packet_set_release(pkt, kmpp_release_venc_packet, ctx, venc_packet);
|
||||
mpp_packet_init(&pkt, pos.uptr, len);
|
||||
mpp_packet_set_release(pkt, kmpp_release_venc_packet, ctx, kmpp_pkt);
|
||||
}
|
||||
|
||||
mpp_packet_set_dts(pkt, venc_packet->u64dts);
|
||||
mpp_packet_set_pts(pkt, venc_packet->u64pts);
|
||||
mpp_packet_set_flag(pkt, venc_packet->flag);
|
||||
if (venc_packet->flag & MPP_PACKET_FLAG_INTRA) {
|
||||
mpp_packet_set_dts(pkt, dts);
|
||||
mpp_packet_set_pts(pkt, pts);
|
||||
mpp_packet_set_flag(pkt, flag);
|
||||
if (flag & MPP_PACKET_FLAG_INTRA) {
|
||||
MppMeta meta = mpp_packet_get_meta(pkt);
|
||||
|
||||
mpp_meta_set_s32(meta, KEY_OUTPUT_INTRA, 1);
|
||||
|
|
@ -412,8 +390,7 @@ static MPP_RET get_packet(Kmpp *ctx, MppPacket *packet)
|
|||
|
||||
static MPP_RET release_packet(Kmpp *ctx, MppPacket *packet)
|
||||
{
|
||||
VencPacket *enc_packet = (VencPacket *) *packet;
|
||||
MPP_RET ret = MPP_OK;
|
||||
KmppPacket pkt = (KmppPacket) * packet;
|
||||
|
||||
if (!ctx)
|
||||
return MPP_ERR_VALUE;
|
||||
|
|
@ -427,11 +404,9 @@ static MPP_RET release_packet(Kmpp *ctx, MppPacket *packet)
|
|||
if (ctx->mClientFd < 0)
|
||||
return MPP_NOK;
|
||||
|
||||
ret = mpp_vcodec_ioctl(ctx->mClientFd, VCODEC_CHAN_OUT_STRM_END, 0, sizeof(*enc_packet), enc_packet);
|
||||
if (ret)
|
||||
mpp_err("chan %d VCODEC_CHAN_OUT_STRM_END failed\n", ctx->mChanId);
|
||||
kmpp_packet_put(pkt);
|
||||
|
||||
return ret;
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
static MPP_RET poll(Kmpp *ctx, MppPortType type, MppPollType timeout)
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@ enum vcodec_event_id {
|
|||
VCODEC_CHAN_OUT_STRM_Q_FULL = VCODEC_ID_BASE_OUTPUT,
|
||||
VCODEC_CHAN_OUT_STRM_BUF_RDY,
|
||||
VCODEC_CHAN_OUT_STRM_END,
|
||||
VCODEC_CHAN_OUT_STRM_INFO,
|
||||
/* new get packet interface */
|
||||
VCODEC_CHAN_OUT_PKT_RDY,
|
||||
|
||||
/* channel input side ack event from external module */
|
||||
VCODEC_CHAN_OUT_BLOCK = VCODEC_ID_BASE_OUTPUT_ACK,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue