[mpp_packet]: Add segment info and segment nb

Change-Id: I26cb5bba11393ccfb3a73b0d682b67f219034c13
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen 2022-05-10 16:02:56 +08:00
parent de864932e3
commit 12858d56d1
5 changed files with 160 additions and 1 deletions

View file

@ -92,6 +92,24 @@ RK_U32 mpp_packet_is_partition(const MppPacket packet);
RK_U32 mpp_packet_is_soi(const MppPacket packet);
RK_U32 mpp_packet_is_eoi(const MppPacket packet);
/*
* packet segement pack info for
* segment number - number of segment
* segment info - base address of segment info
*/
typedef struct MppPktSeg_t MppPktSeg;
struct MppPktSeg_t {
RK_S32 index;
RK_S32 type;
RK_U32 offset;
RK_U32 len;
const MppPktSeg *next;
};
RK_U32 mpp_packet_get_segment_nb(const MppPacket packet);
const MppPktSeg *mpp_packet_get_segment_info(const MppPacket packet);
#ifdef __cplusplus
}
#endif

View file

@ -17,12 +17,14 @@
#ifndef __MPP_PACKET_IMPL_H__
#define __MPP_PACKET_IMPL_H__
#include "mpp_meta.h"
#include "mpp_packet.h"
#define MPP_PACKET_FLAG_EOS (0x00000001)
#define MPP_PACKET_FLAG_EXTRA_DATA (0x00000002)
#define MPP_PACKET_FLAG_INTERNAL (0x00000004)
#define MPP_PKT_SEG_CNT_DEFAULT 8
typedef union MppPacketStatus_t {
RK_U32 val;
struct {
@ -66,6 +68,12 @@ typedef struct MppPacketImpl_t {
MppBuffer buffer;
MppMeta meta;
MppTask task;
RK_U32 segment_nb;
RK_U32 segment_buf_cnt;
MppPktSeg segments_def[MPP_PKT_SEG_CNT_DEFAULT];
MppPktSeg *segments_ext;
MppPktSeg *segments;
} MppPacketImpl;
#ifdef __cplusplus
@ -77,11 +85,16 @@ extern "C" {
MPP_RET mpp_packet_reset(MppPacketImpl *packet);
MPP_RET mpp_packet_copy(MppPacket dst, MppPacket src);
MPP_RET mpp_packet_append(MppPacket dst, MppPacket src);
MPP_RET mpp_packet_set_status(MppPacket packet, MppPacketStatus status);
MPP_RET mpp_packet_get_status(MppPacket packet, MppPacketStatus *status);
void mpp_packet_set_task(MppPacket packet, MppTask task);
MppTask mpp_packet_get_task(MppPacket packet);
void mpp_packet_reset_segment(MppPacket packet);
void mpp_packet_set_segment_nb(MppPacket packet);
MPP_RET mpp_packet_add_segment_info(MppPacket packet, RK_S32 type, RK_S32 offset, RK_S32 len);
/* pointer check function */
MPP_RET check_is_mpp_packet(void *ptr);

View file

@ -53,6 +53,7 @@ MPP_RET mpp_packet_new(MppPacket *packet)
return MPP_ERR_NULL_PTR;
}
setup_mpp_packet_name(p);
p->segment_buf_cnt = MPP_PKT_SEG_CNT_DEFAULT;
return MPP_OK;
}
@ -175,6 +176,8 @@ MPP_RET mpp_packet_deinit(MppPacket *packet)
if (p->meta)
mpp_meta_put(p->meta);
MPP_FREE(p->segments_ext);
mpp_mem_pool_put(mpp_packet_pool, *packet);
*packet = NULL;
return MPP_OK;
@ -266,6 +269,7 @@ MPP_RET mpp_packet_reset(MppPacketImpl *packet)
packet->pos = data;
packet->size = size;
setup_mpp_packet_name(packet);
mpp_packet_reset_segment(packet);
return MPP_OK;
}
@ -415,6 +419,35 @@ MPP_RET mpp_packet_copy(MppPacket dst, MppPacket src)
memcpy(dst_impl->pos, src_impl->pos, src_impl->length);
dst_impl->length = src_impl->length;
if (src_impl->segment_nb) {
MppPktSeg *src_segs = src_impl->segments;
MppPktSeg *dst_segs = NULL;
RK_U32 segment_nb = src_impl->segment_nb;
RK_U32 i;
mpp_packet_reset_segment(dst);
dst_impl->segment_nb = segment_nb;
dst_impl->segment_buf_cnt = src_impl->segment_buf_cnt;
if (segment_nb <= MPP_PKT_SEG_CNT_DEFAULT) {
dst_segs = dst_impl->segments_def;
memcpy(dst_segs, src_segs, sizeof(*dst_segs) * segment_nb);
} else {
dst_segs = mpp_calloc(MppPktSeg, dst_impl->segment_buf_cnt);
mpp_assert(dst_segs);
dst_impl->segments_ext = dst_segs;
memcpy(dst_segs, src_segs, sizeof(*dst_segs) * segment_nb);
}
for (i = 0; i < segment_nb - 1; i++)
dst_segs[i].next = &dst_segs[i + 1];
dst_impl->segments = dst_segs;
}
return MPP_OK;
}
@ -430,10 +463,100 @@ MPP_RET mpp_packet_append(MppPacket dst, MppPacket src)
memcpy((RK_U8 *)dst_impl->pos + dst_impl->length, src_impl->pos,
src_impl->length);
if (src_impl->segment_nb) {
MppPktSeg *segs = src_impl->segments;
RK_U32 offset = dst_impl->length;
RK_U32 i;
for (i = 0; i < src_impl->segment_nb; i++, segs++) {
mpp_packet_add_segment_info(dst, segs->type, offset, segs->len);
offset += segs->len;
}
}
dst_impl->length += src_impl->length;
return MPP_OK;
}
void mpp_packet_reset_segment(MppPacket packet)
{
MppPacketImpl *p = (MppPacketImpl *)packet;
p->segment_nb = 0;
p->segment_buf_cnt = MPP_PKT_SEG_CNT_DEFAULT;
memset(p->segments_def, 0, sizeof(p->segments_def));
p->segments = NULL;
MPP_FREE(p->segments_ext);
}
MPP_RET mpp_packet_add_segment_info(MppPacket packet, RK_S32 type, RK_S32 offset, RK_S32 len)
{
MppPacketImpl *p = (MppPacketImpl *)packet;
RK_U32 old_buf_cnt = p->segment_buf_cnt;
RK_U32 segment_nb = p->segment_nb;
MppPktSeg *seg_buf = p->segments;
if (segment_nb >= old_buf_cnt) {
RK_U32 i;
/* realloc segment info buffer. default 8 segments */
old_buf_cnt *= 2;
if (NULL == p->segments_ext) {
seg_buf = mpp_calloc(MppPktSeg, old_buf_cnt);
if (seg_buf)
memcpy(seg_buf, p->segments_def, sizeof(p->segments_def));
} else {
seg_buf = mpp_realloc(p->segments_ext, MppPktSeg, old_buf_cnt);
}
if (NULL == seg_buf)
return MPP_NOK;
for (i = 0; i < segment_nb - 1; i++)
seg_buf[i].next = &seg_buf[i + 1];
p->segments_ext = seg_buf;
p->segments = seg_buf;
p->segment_buf_cnt = old_buf_cnt;
} else {
if (NULL == seg_buf) {
seg_buf = p->segments_def;
p->segments = seg_buf;
}
}
mpp_assert(seg_buf);
seg_buf += segment_nb;
seg_buf->index = segment_nb;
seg_buf->type = type;
seg_buf->offset = offset;
seg_buf->len = len;
seg_buf->next = NULL;
if (segment_nb)
seg_buf[-1].next = seg_buf;
p->segment_nb++;
mpp_assert(p->segment_nb <= p->segment_buf_cnt);
return MPP_OK;
}
const MppPktSeg *mpp_packet_get_segment_info(const MppPacket packet)
{
if (check_is_mpp_packet(packet))
return NULL;
MppPacketImpl *p = (MppPacketImpl *)packet;
if (!p->segment_nb)
return NULL;
return (const MppPktSeg *)p->segments;
}
/*
* object access function macro
*/
@ -456,3 +579,4 @@ MPP_PACKET_ACCESSORS(RK_S64, pts)
MPP_PACKET_ACCESSORS(RK_S64, dts)
MPP_PACKET_ACCESSORS(RK_U32, flag)
MPP_PACKET_ACCESSORS(MppTask, task)
MPP_PACKET_ACCESSORS(RK_U32, segment_nb)

View file

@ -21,6 +21,7 @@
#include "mpp_common.h"
#include "mpp_bitwrite.h"
#include "mpp_packet_impl.h"
#include "h264e_debug.h"
#include "h264_syntax.h"
@ -87,6 +88,7 @@ MPP_RET h264e_sei_to_packet(MppPacket packet, RK_S32 *len, RK_S32 type,
*len = sei_size;
mpp_packet_set_length(packet, length + sei_size);
mpp_packet_add_segment_info(packet, H264_NALU_TYPE_SEI, length, sei_size);
h264e_dbg_sei("sei data length %d pkt len %d -> %d\n", sei_size,
length, length + sei_size);

View file

@ -23,6 +23,7 @@
#include "rc.h"
#include "mpp_enc_cfg_impl.h"
#include "mpp_packet_impl.h"
#include "h265e_api.h"
#include "h265e_slice.h"
@ -297,6 +298,7 @@ static MPP_RET h265e_add_sei(MppPacket pkt, RK_S32 *length, RK_U8 uuid[16],
*length = new_length;
mpp_packet_set_length(pkt, offset + new_length);
mpp_packet_add_segment_info(pkt, NAL_SEI_PREFIX, offset, new_length);
return MPP_OK;
}