[h264e/h265e]: Add segment info on header gen

Change-Id: I8bba93efe03e262a0684f62a9e2a2a03d223f5f2
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2022-05-10 17:02:51 +08:00
parent 12858d56d1
commit 31aac54a4f
6 changed files with 25 additions and 9 deletions

View File

@@ -70,9 +70,12 @@ typedef struct {
void *hdr_buf; void *hdr_buf;
size_t hdr_size; size_t hdr_size;
size_t hdr_len; size_t hdr_len;
RK_S32 sps_offset;
RK_S32 sps_len; RK_S32 sps_len;
RK_S32 pps_offset;
RK_S32 pps_len; RK_S32 pps_len;
RK_S32 sei_len; RK_S32 prefix_offset;
RK_S32 prefix_len;
H264ePrefixNal prefix; H264ePrefixNal prefix;
/* rate control config */ /* 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); h264e_dpb_setup(&p->dpb, p->cfg, &p->sps);
mpp_packet_reset(p->hdr_pkt); mpp_packet_reset(p->hdr_pkt);
h264e_sps_to_packet(&p->sps, p->hdr_pkt, &p->sps_offset, &p->sps_len);
h264e_sps_to_packet(&p->sps, p->hdr_pkt, &p->sps_len); h264e_pps_to_packet(&p->pps, p->hdr_pkt, &p->pps_offset, &p->pps_len);
h264e_pps_to_packet(&p->pps, p->hdr_pkt, &p->pps_len);
p->hdr_len = mpp_packet_get_length(p->hdr_pkt); p->hdr_len = mpp_packet_get_length(p->hdr_pkt);
if (pkt) { if (pkt) {
mpp_packet_write(pkt, 0, p->hdr_buf, p->hdr_len); mpp_packet_write(pkt, 0, p->hdr_buf, p->hdr_len);
mpp_packet_set_length(pkt, 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"); h264e_dbg_func("leave\n");

View File

@@ -104,7 +104,7 @@ MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg)
return MPP_OK; 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 *pos = mpp_packet_get_pos(packet);
void *data = mpp_packet_get_data(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); pps_size = mpp_writer_bytes(bit);
if (len) if (len)
*len = pps_size; *len = pps_size;
if (offset)
*offset = length;
mpp_packet_set_length(packet, length + pps_size); mpp_packet_set_length(packet, length + pps_size);

View File

@@ -61,7 +61,7 @@ extern "C" {
#endif #endif
MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg); 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); MPP_RET h264e_pps_dump(H264ePps *pps);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -227,7 +227,7 @@ MPP_RET h264e_sps_update(H264eSps *sps, MppEncCfgSet *cfg)
return MPP_OK; 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 *pos = mpp_packet_get_pos(packet);
void *data = mpp_packet_get_data(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); sps_size = mpp_writer_bytes(bit);
if (len) if (len)
*len = sps_size; *len = sps_size;
if (offset)
*offset = length;
mpp_packet_set_length(packet, length + sps_size); mpp_packet_set_length(packet, length + sps_size);

View File

@@ -126,7 +126,7 @@ extern "C" {
#endif #endif
MPP_RET h264e_sps_update(H264eSps *sps, MppEncCfgSet *cfg); 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); MPP_RET h264e_sps_dump(H264eSps *sps);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -18,8 +18,11 @@
#include <string.h> #include <string.h>
#include "mpp_common.h"
#include "mpp_mem.h" #include "mpp_mem.h"
#include "mpp_common.h"
#include "mpp_packet_impl.h"
#include "h265e_ps.h" #include "h265e_ps.h"
#include "h265e_header_gen.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", h265e_dbg(H265E_DBG_HEADER, "get extra info nal type %d, size %d bytes",
src->nal[k].i_type, src->nal[k].i_payload); 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_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; offset += src->nal[k].i_payload;
} }
mpp_packet_set_length(pkt_out, offset); mpp_packet_set_length(pkt_out, offset);