mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-18 15:10:39 +08:00
[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:
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user