diff --git a/kmpp/base/inc/kmpp_frame_impl.h b/kmpp/base/inc/kmpp_frame_impl.h index 8ae450bb..1526d0b7 100644 --- a/kmpp/base/inc/kmpp_frame_impl.h +++ b/kmpp/base/inc/kmpp_frame_impl.h @@ -84,4 +84,8 @@ typedef struct KmppFrameImpl_t { KmppMeta self_meta; } KmppFrameImpl; +typedef struct KmppFramePriv_t { + KmppMeta meta; +} KmppFramePriv; + #endif /* __KMPP_FRAME_IMPL_H__ */ diff --git a/kmpp/base/inc/kmpp_packet.h b/kmpp/base/inc/kmpp_packet.h index 7c5af989..f0008de8 100644 --- a/kmpp/base/inc/kmpp_packet.h +++ b/kmpp/base/inc/kmpp_packet.h @@ -29,6 +29,8 @@ extern "C" { #define KMPP_OBJ_ENTRY_TABLE KMPP_PACKET_ENTRY_TABLE #include "kmpp_obj_func.h" +rk_s32 kmpp_packet_get_meta(KmppPacket packet, KmppMeta *meta); + #ifdef __cplusplus } #endif diff --git a/kmpp/base/inc/kmpp_packet_impl.h b/kmpp/base/inc/kmpp_packet_impl.h index b1ce3d5f..5c9b6be2 100644 --- a/kmpp/base/inc/kmpp_packet_impl.h +++ b/kmpp/base/inc/kmpp_packet_impl.h @@ -56,4 +56,8 @@ typedef struct KmppPacketImpl_t { RingBuf buf; } KmppPacketImpl; +typedef struct KmppPacketPriv_t { + KmppMeta meta; +} KmppPacketPriv; + #endif /* __KMPP_PACKET_IMPL_H__ */ \ No newline at end of file diff --git a/kmpp/base/kmpp_frame.c b/kmpp/base/kmpp_frame.c index 865091f0..00e10ccf 100644 --- a/kmpp/base/kmpp_frame.c +++ b/kmpp/base/kmpp_frame.c @@ -6,53 +6,76 @@ #define MODULE_TAG "kmpp_frame" #include "kmpp_frame_impl.h" -#include "kmpp_obj_impl.h" - -static rk_s32 kmpp_frame_impl_deinit(void *entry, KmppObj obj, const char *caller) -{ - KmppFrameImpl *impl = (KmppFrameImpl *)entry; - (void)obj; - - if (impl->self_meta) { - kmpp_obj_put_impl(impl->self_meta, caller); - impl->self_meta = NULL; - } - - return rk_ok; -} rk_s32 kmpp_frame_get_meta(KmppFrame frame, KmppMeta *meta) { - KmppFrameImpl *impl = (KmppFrameImpl *)kmpp_obj_to_entry(frame); + KmppFramePriv *priv = NULL; KmppShmPtr sptr; rk_s32 ret; - if (!impl || !meta) { - mpp_loge_f("invalid impl %p or meta %p\n", impl, meta); + if (!frame || !meta) { + mpp_loge_f("invalid frame %p meta %p\n", frame, meta); return rk_nok; } - if (impl->self_meta) { - *meta = impl->self_meta; + priv = (KmppFramePriv *)kmpp_obj_to_priv(frame); + if (priv->meta) { + *meta = priv->meta; return rk_ok; } kmpp_obj_get_shm(frame, "meta", &sptr); - ret = kmpp_obj_get_by_sptr_f(&impl->self_meta, &sptr); + ret = kmpp_obj_get_by_sptr_f(&priv->meta, &sptr); if (ret) { *meta = NULL; mpp_loge_f("self_meta get obj by sptr failed, ret %d\n", ret); return ret; } - *meta = impl->self_meta; + *meta = priv->meta; + + return rk_ok; +} + +static rk_s32 kmpp_frame_impl_init(void *entry, KmppObj obj, const char *caller) +{ + KmppFramePriv *priv = (KmppFramePriv *)kmpp_obj_to_priv(obj); + (void)entry; + + if (!priv) { + mpp_loge_f("invalid %p without priv at %s\n", obj, caller); + return rk_nok; + } + + priv->meta = NULL; + + return rk_ok; +} + +static rk_s32 kmpp_frame_impl_deinit(void *entry, KmppObj obj, const char *caller) +{ + KmppFramePriv *priv = (KmppFramePriv *)kmpp_obj_to_priv(obj); + (void)entry; + + if (!priv) { + mpp_loge_f("invalid %p without priv at %s\n", obj, caller); + return rk_nok; + } + + if (priv->meta) { + kmpp_obj_put_impl(priv->meta, caller); + priv->meta = NULL; + } + return rk_ok; } #define KMPP_OBJ_NAME kmpp_frame #define KMPP_OBJ_INTF_TYPE KmppFrame #define KMPP_OBJ_IMPL_TYPE KmppFrameImpl +#define KMPP_OBJ_FUNC_INIT kmpp_frame_impl_init #define KMPP_OBJ_FUNC_DEINIT kmpp_frame_impl_deinit #define KMPP_OBJ_SGLN_ID MPP_SGLN_KMPP_FRAME #define KMPP_OBJ_ENTRY_TABLE KMPP_FRAME_ENTRY_TABLE +#define KMPP_OBJ_PRIV_SIZE sizeof(KmppFramePriv) #include "kmpp_obj_helper.h" diff --git a/kmpp/base/kmpp_packet.c b/kmpp/base/kmpp_packet.c index 779a2062..d87d923d 100644 --- a/kmpp/base/kmpp_packet.c +++ b/kmpp/base/kmpp_packet.c @@ -5,9 +5,75 @@ #include "kmpp_packet_impl.h" +rk_s32 kmpp_packet_get_meta(KmppPacket packet, KmppMeta *meta) +{ + KmppPacketPriv *priv = NULL; + KmppShmPtr sptr; + rk_s32 ret; + + if (!packet || !meta) { + mpp_loge_f("invalid packet %p meta %p\n", packet, meta); + return rk_nok; + } + + priv = (KmppPacketPriv *)kmpp_obj_to_priv(packet); + if (priv->meta) { + *meta = priv->meta; + return rk_ok; + } + + kmpp_obj_get_shm(packet, "meta", &sptr); + ret = kmpp_obj_get_by_sptr_f(priv->meta, &sptr); + if (ret) { + *meta = NULL; + mpp_loge_f("self_meta get obj by sptr failed, ret %d\n", ret); + return ret; + } + + *meta = priv->meta; + + return rk_ok; +} + +static rk_s32 kmpp_packet_impl_init(void *entry, KmppObj obj, const char *caller) +{ + KmppPacketPriv *priv = (KmppPacketPriv *)kmpp_obj_to_priv(obj); + (void)entry; + + if (!priv) { + mpp_loge_f("invalid %p without priv at %s\n", obj, caller); + return rk_nok; + } + + priv->meta = NULL; + + return rk_ok; +} + +static rk_s32 kmpp_packet_impl_deinit(void *entry, KmppObj obj, const char *caller) +{ + KmppPacketPriv *priv = (KmppPacketPriv *)kmpp_obj_to_priv(obj); + (void)entry; + + if (!priv) { + mpp_loge_f("invalid %p without priv at %s\n", obj, caller); + return rk_nok; + } + + if (priv->meta) { + kmpp_obj_put_impl(priv->meta, caller); + priv->meta = NULL; + } + + return rk_ok; +} + #define KMPP_OBJ_NAME kmpp_packet #define KMPP_OBJ_INTF_TYPE KmppPacket #define KMPP_OBJ_IMPL_TYPE KmppPacketImpl +#define KMPP_OBJ_FUNC_INIT kmpp_packet_impl_init +#define KMPP_OBJ_FUNC_DEINIT kmpp_packet_impl_deinit #define KMPP_OBJ_SGLN_ID MPP_SGLN_KMPP_PACKET #define KMPP_OBJ_ENTRY_TABLE KMPP_PACKET_ENTRY_TABLE +#define KMPP_OBJ_PRIV_SIZE sizeof(KmppPacketPriv) #include "kmpp_obj_helper.h" \ No newline at end of file