diff --git a/mpp/codec/enc/h264/h264e_api_v2.c b/mpp/codec/enc/h264/h264e_api_v2.c index c48e8978..36575231 100644 --- a/mpp/codec/enc/h264/h264e_api_v2.c +++ b/mpp/codec/enc/h264/h264e_api_v2.c @@ -70,9 +70,12 @@ typedef struct { void *hdr_buf; size_t hdr_size; size_t hdr_len; + RK_S32 sps_offset; RK_S32 sps_len; + RK_S32 pps_offset; RK_S32 pps_len; - RK_S32 sei_len; + RK_S32 prefix_offset; + RK_S32 prefix_len; H264ePrefixNal prefix; /* rate control config */ @@ -532,14 +535,18 @@ static MPP_RET h264e_gen_hdr(void *ctx, MppPacket pkt) h264e_dpb_setup(&p->dpb, p->cfg, &p->sps); mpp_packet_reset(p->hdr_pkt); - - h264e_sps_to_packet(&p->sps, p->hdr_pkt, &p->sps_len); - h264e_pps_to_packet(&p->pps, p->hdr_pkt, &p->pps_len); + h264e_sps_to_packet(&p->sps, p->hdr_pkt, &p->sps_offset, &p->sps_len); + h264e_pps_to_packet(&p->pps, p->hdr_pkt, &p->pps_offset, &p->pps_len); p->hdr_len = mpp_packet_get_length(p->hdr_pkt); if (pkt) { mpp_packet_write(pkt, 0, p->hdr_buf, p->hdr_len); mpp_packet_set_length(pkt, p->hdr_len); + + mpp_packet_add_segment_info(pkt, H264_NALU_TYPE_SPS, + p->sps_offset, p->sps_len); + mpp_packet_add_segment_info(pkt, H264_NALU_TYPE_PPS, + p->pps_offset, p->pps_len); } h264e_dbg_func("leave\n"); diff --git a/mpp/codec/enc/h264/h264e_pps.c b/mpp/codec/enc/h264/h264e_pps.c index 15e37199..492e08f5 100644 --- a/mpp/codec/enc/h264/h264e_pps.c +++ b/mpp/codec/enc/h264/h264e_pps.c @@ -104,7 +104,7 @@ MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg) return MPP_OK; } -RK_S32 h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *len) +RK_S32 h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *offset, RK_S32 *len) { void *pos = mpp_packet_get_pos(packet); void *data = mpp_packet_get_data(packet); @@ -186,6 +186,8 @@ RK_S32 h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *len) pps_size = mpp_writer_bytes(bit); if (len) *len = pps_size; + if (offset) + *offset = length; mpp_packet_set_length(packet, length + pps_size); diff --git a/mpp/codec/enc/h264/h264e_pps.h b/mpp/codec/enc/h264/h264e_pps.h index 2c255e71..251636be 100644 --- a/mpp/codec/enc/h264/h264e_pps.h +++ b/mpp/codec/enc/h264/h264e_pps.h @@ -61,7 +61,7 @@ extern "C" { #endif MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg); -MPP_RET h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *len); +MPP_RET h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *offset, RK_S32 *len); MPP_RET h264e_pps_dump(H264ePps *pps); #ifdef __cplusplus diff --git a/mpp/codec/enc/h264/h264e_sps.c b/mpp/codec/enc/h264/h264e_sps.c index 1f84b2c5..e848e2da 100644 --- a/mpp/codec/enc/h264/h264e_sps.c +++ b/mpp/codec/enc/h264/h264e_sps.c @@ -227,7 +227,7 @@ MPP_RET h264e_sps_update(H264eSps *sps, MppEncCfgSet *cfg) return MPP_OK; } -MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *len) +MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *offset, RK_S32 *len) { void *pos = mpp_packet_get_pos(packet); void *data = mpp_packet_get_data(packet); @@ -423,6 +423,8 @@ MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *len) sps_size = mpp_writer_bytes(bit); if (len) *len = sps_size; + if (offset) + *offset = length; mpp_packet_set_length(packet, length + sps_size); diff --git a/mpp/codec/enc/h264/h264e_sps.h b/mpp/codec/enc/h264/h264e_sps.h index b191b0da..18643a9c 100644 --- a/mpp/codec/enc/h264/h264e_sps.h +++ b/mpp/codec/enc/h264/h264e_sps.h @@ -126,7 +126,7 @@ extern "C" { #endif MPP_RET h264e_sps_update(H264eSps *sps, MppEncCfgSet *cfg); -MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *len); +MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *offset, RK_S32 *len); MPP_RET h264e_sps_dump(H264eSps *sps); #ifdef __cplusplus diff --git a/mpp/codec/enc/h265/h265e_header_gen.c b/mpp/codec/enc/h265/h265e_header_gen.c index d53965e9..1fdaea23 100644 --- a/mpp/codec/enc/h265/h265e_header_gen.c +++ b/mpp/codec/enc/h265/h265e_header_gen.c @@ -18,8 +18,11 @@ #include -#include "mpp_common.h" #include "mpp_mem.h" +#include "mpp_common.h" + +#include "mpp_packet_impl.h" + #include "h265e_ps.h" #include "h265e_header_gen.h" @@ -700,6 +703,8 @@ MPP_RET h265e_get_extra_info(H265eCtx *ctx, MppPacket pkt_out) h265e_dbg(H265E_DBG_HEADER, "get extra info nal type %d, size %d bytes", src->nal[k].i_type, src->nal[k].i_payload); mpp_packet_write(pkt_out, offset, src->nal[k].p_payload, src->nal[k].i_payload); + mpp_packet_add_segment_info(pkt_out, src->nal[k].i_type, + offset, src->nal[k].i_payload); offset += src->nal[k].i_payload; } mpp_packet_set_length(pkt_out, offset);