[mpp_enc]: Use metadata to send intra flag.

Use MppMeta in MppPacket to carry flags and data instead of MppTask.

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I274cf4163914938f22e983eca35c7fee8a9435dc
This commit is contained in:
Herman Chen
2020-03-31 09:16:37 +08:00
parent 3e03d9c074
commit 6df1c1ec62
4 changed files with 23 additions and 30 deletions

View File

@@ -22,7 +22,6 @@
#define MPP_PACKET_FLAG_EOS (0x00000001)
#define MPP_PACKET_FLAG_EXTRA_DATA (0x00000002)
#define MPP_PACKET_FLAG_INTERNAL (0x00000004)
#define MPP_PACKET_FLAG_INTRA (0x00000008)
/*
* mpp_packet_imp structure

View File

@@ -334,23 +334,15 @@ void *mpp_enc_control_thread(void *data)
* task_in may be null if output port is awaken by Mpp::clear()
*/
if (task_out) {
//set motion info buffer to output task
MppMeta meta = mpp_packet_get_meta(packet);
if (mv_info)
mpp_task_meta_set_buffer(task_out, KEY_MOTION_INFO, mv_info);
mpp_meta_set_buffer(meta, KEY_MOTION_INFO, mv_info);
mpp_task_meta_set_packet(task_out, KEY_OUTPUT_PACKET, packet);
{
RK_S32 is_intra = hal_task->is_intra;
RK_U32 flag = mpp_packet_get_flag(packet);
mpp_task_meta_set_s32(task_out, KEY_OUTPUT_INTRA, is_intra);
if (is_intra) {
mpp_packet_set_flag(packet, flag | MPP_PACKET_FLAG_INTRA);
}
}
mpp_meta_set_s32(meta, KEY_OUTPUT_INTRA, hal_task->is_intra);
// setup output task here
mpp_task_meta_set_packet(task_out, KEY_OUTPUT_PACKET, packet);
mpp_port_enqueue(output, task_out);
} else {
mpp_packet_deinit(&packet);

View File

@@ -731,22 +731,16 @@ void *mpp_enc_thread(void *data)
}
TASK_DONE:
/* setup output packet and meta data */
mpp_packet_set_length(packet, hal_task->length);
/*
* task_in may be null if output port is awaken by Mpp::clear()
*/
if (hal_task->mv_info)
mpp_task_meta_set_buffer(task_out, KEY_MOTION_INFO, hal_task->mv_info);
{
RK_S32 is_intra = hal_task->is_intra;
RK_U32 flag = mpp_packet_get_flag(packet);
MppMeta meta = mpp_packet_get_meta(packet);
mpp_task_meta_set_s32(task_out, KEY_OUTPUT_INTRA, is_intra);
if (is_intra) {
mpp_packet_set_flag(packet, flag | MPP_PACKET_FLAG_INTRA);
}
if (hal_task->mv_info)
mpp_meta_set_buffer(meta, KEY_MOTION_INFO, hal_task->mv_info);
mpp_meta_set_s32(meta, KEY_OUTPUT_INTRA, frm->is_intra);
}
TASK_RETURN:

View File

@@ -1113,8 +1113,9 @@ RK_S32 VpuApiLegacy::encode(VpuCodecContext *ctx, EncInputStream_t *aEncInStrm,
if (packet) {
RK_U32 eos = mpp_packet_get_eos(packet);
RK_S64 pts = mpp_packet_get_pts(packet);
RK_U32 flag = mpp_packet_get_flag(packet);
size_t length = mpp_packet_get_length(packet);
MppMeta meta = mpp_packet_get_meta(packet);
RK_S32 is_intra = 0;
if (!fd_output) {
RK_U8 *src = (RK_U8 *)mpp_packet_get_data(packet);
@@ -1131,9 +1132,11 @@ RK_S32 VpuApiLegacy::encode(VpuCodecContext *ctx, EncInputStream_t *aEncInStrm,
}
}
mpp_meta_get_s32(meta, KEY_OUTPUT_INTRA, &is_intra);
aEncOut->size = (RK_S32)length;
aEncOut->timeUs = pts;
aEncOut->keyFrame = (flag & MPP_PACKET_FLAG_INTRA) ? (1) : (0);
aEncOut->keyFrame = is_intra;
vpu_api_dbg_output("get packet %p size %d pts %lld keyframe %d eos %d\n",
packet, length, pts, aEncOut->keyFrame, eos);
@@ -1293,8 +1296,9 @@ RK_S32 VpuApiLegacy::encoder_getstream(VpuCodecContext *ctx, EncoderOut_t *aEncO
RK_U8 *src = (RK_U8 *)mpp_packet_get_data(packet);
RK_U32 eos = mpp_packet_get_eos(packet);
RK_S64 pts = mpp_packet_get_pts(packet);
RK_U32 flag = mpp_packet_get_flag(packet);
size_t length = mpp_packet_get_length(packet);
MppMeta meta = mpp_packet_get_meta(packet);
RK_S32 is_intra = 0;
RK_U32 offset = 0;
if (ctx->videoCoding == OMX_RK_VIDEO_CodingAVC) {
@@ -1307,9 +1311,13 @@ RK_S32 VpuApiLegacy::encoder_getstream(VpuCodecContext *ctx, EncoderOut_t *aEncO
if (aEncOut->data)
memcpy(aEncOut->data, src + offset, length);
}
mpp_meta_get_s32(meta, KEY_OUTPUT_INTRA, &is_intra);
aEncOut->size = (RK_S32)length;
aEncOut->timeUs = pts;
aEncOut->keyFrame = (flag & MPP_PACKET_FLAG_INTRA) ? (1) : (0);
aEncOut->keyFrame = is_intra;
vpu_api_dbg_output("get packet %p size %d pts %lld keyframe %d eos %d\n",
packet, length, pts, aEncOut->keyFrame, eos);