[mpp_dec]: add control to set present time order

tips: when input timestamp has not pts, and set pts=dts,
it should use input timestamp order for output.

Change-Id: I8b3ef9a8d150e5729a3fa94df6c1b448edb8f1fd
Signed-off-by: Ding Wei <leo.ding@rock-chips.com>
This commit is contained in:
Ding Wei
2018-04-20 15:56:25 +08:00
committed by Herman Chen
parent 38d51610f1
commit 2f5bd0bffb
6 changed files with 40 additions and 6 deletions

View File

@@ -97,6 +97,7 @@ typedef enum {
MPP_DEC_SET_VC1_EXTRA_DATA, MPP_DEC_SET_VC1_EXTRA_DATA,
MPP_DEC_SET_OUTPUT_FORMAT, MPP_DEC_SET_OUTPUT_FORMAT,
MPP_DEC_SET_DISABLE_ERROR, /* When set it will disable sw/hw error (H.264 / H.265) */ MPP_DEC_SET_DISABLE_ERROR, /* When set it will disable sw/hw error (H.264 / H.265) */
MPP_DEC_SET_PRESENT_TIME_ORDER, /* use input time order for output */
MPP_DEC_CMD_END, MPP_DEC_CMD_END,
MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC, MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC,

View File

@@ -41,7 +41,7 @@ struct MppDec_t {
RK_U32 parser_fast_mode; RK_U32 parser_fast_mode;
RK_U32 parser_internal_pts; RK_U32 parser_internal_pts;
RK_U32 disable_error; RK_U32 disable_error;
RK_U32 use_preset_time_order;
// dec parser thread runtime resource context // dec parser thread runtime resource context
MppPacket mpp_pkt_in; MppPacket mpp_pkt_in;
void *mpp; void *mpp;

View File

@@ -175,13 +175,14 @@ static RK_U32 reset_dec_task(Mpp *mpp, DecTask *task)
mpp_buffer_put(buffer); mpp_buffer_put(buffer);
mpp_buf_slot_clr_flag(frame_slots, index, SLOT_QUEUE_USE); mpp_buf_slot_clr_flag(frame_slots, index, SLOT_QUEUE_USE);
} }
if (dec->use_preset_time_order) {
mpp->mTimeStamps->flush();
}
if (task->status.dec_pkt_copy_rdy) { if (task->status.dec_pkt_copy_rdy) {
mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT);
task->status.dec_pkt_copy_rdy = 0; task->status.dec_pkt_copy_rdy = 0;
task_dec->input = -1; task_dec->input = -1;
} }
task->status.task_parsed_rdy = 0; task->status.task_parsed_rdy = 0;
parser->unlock(THREAD_RESET); parser->unlock(THREAD_RESET);
parser->signal(THREAD_RESET); parser->signal(THREAD_RESET);
@@ -224,6 +225,9 @@ static void mpp_put_frame_eos(Mpp *mpp, HalDecTaskFlag flags)
mpp_frame_set_discard(info_frame, 1); mpp_frame_set_discard(info_frame, 1);
} }
mpp_put_frame((Mpp*)mpp, info_frame); mpp_put_frame((Mpp*)mpp, info_frame);
if (mpp->mDec->use_preset_time_order) {
mpp->mTimeStamps->flush();
}
return; return;
} }
@@ -241,6 +245,16 @@ static void mpp_dec_push_display(Mpp *mpp, RK_U32 flag)
/* deal with current frame */ /* deal with current frame */
if (flag && mpp_slots_is_empty(frame_slots, QUEUE_DISPLAY)) if (flag && mpp_slots_is_empty(frame_slots, QUEUE_DISPLAY))
mpp_frame_set_eos(frame, 1); mpp_frame_set_eos(frame, 1);
if (dec->use_preset_time_order) {
MppPacket pkt_out = NULL;
mpp->mTimeStamps->pull(&pkt_out, sizeof(pkt_out));
if (pkt_out) {
mpp_frame_set_dts(frame, mpp_packet_get_dts(pkt_out));
mpp_frame_set_pts(frame, mpp_packet_get_pts(pkt_out));
mpp_packet_deinit(&pkt_out);
} else
mpp_err_f("pull out packet error.\n");
}
if (!dec->reset_flag) if (!dec->reset_flag)
mpp_put_frame(mpp, frame); mpp_put_frame(mpp, frame);
@@ -294,6 +308,15 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
if (packets->pull(&dec->mpp_pkt_in, sizeof(dec->mpp_pkt_in))) if (packets->pull(&dec->mpp_pkt_in, sizeof(dec->mpp_pkt_in)))
return MPP_NOK; return MPP_NOK;
if (dec->use_preset_time_order) {
MppPacket pkt_in = NULL;
mpp_packet_new(&pkt_in);
if (pkt_in) {
mpp_packet_set_pts(pkt_in, mpp_packet_get_pts(dec->mpp_pkt_in));
mpp_packet_set_dts(pkt_in, mpp_packet_get_dts(dec->mpp_pkt_in));
mpp->mTimeStamps->push(&pkt_in, sizeof(pkt_in));
}
}
mpp->mPacketGetCount++; mpp->mPacketGetCount++;
} }
@@ -1110,6 +1133,9 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param)
case MPP_DEC_SET_DISABLE_ERROR: { case MPP_DEC_SET_DISABLE_ERROR: {
dec->disable_error = *((RK_U32 *)param); dec->disable_error = *((RK_U32 *)param);
} }
case MPP_DEC_SET_PRESENT_TIME_ORDER: {
dec->use_preset_time_order = *((RK_U32 *)param);
}
default : { default : {
} break; } break;
} }

View File

@@ -82,7 +82,7 @@ public:
MppQueue *mPackets; MppQueue *mPackets;
mpp_list *mFrames; mpp_list *mFrames;
mpp_list *mTasks; mpp_list *mTasks;
MppQueue *mTimeStamps;
/* counters for debug */ /* counters for debug */
RK_U32 mPacketPutCount; RK_U32 mPacketPutCount;
RK_U32 mPacketGetCount; RK_U32 mPacketGetCount;

View File

@@ -1403,7 +1403,7 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param)
mpicmd = MPP_DEC_SET_EXT_BUF_GROUP; mpicmd = MPP_DEC_SET_EXT_BUF_GROUP;
} break; } break;
case VPU_API_USE_PRESENT_TIME_ORDER: { case VPU_API_USE_PRESENT_TIME_ORDER: {
mpicmd = MPP_DEC_SET_INTERNAL_PTS_ENABLE; mpicmd = MPP_DEC_SET_PRESENT_TIME_ORDER;
} break; } break;
case VPU_API_SET_INFO_CHANGE: { case VPU_API_SET_INFO_CHANGE: {
mpicmd = MPP_DEC_SET_INFO_CHANGE_READY; mpicmd = MPP_DEC_SET_INFO_CHANGE_READY;

View File

@@ -38,6 +38,7 @@ Mpp::Mpp()
: mPackets(NULL), : mPackets(NULL),
mFrames(NULL), mFrames(NULL),
mTasks(NULL), mTasks(NULL),
mTimeStamps(NULL),
mPacketPutCount(0), mPacketPutCount(0),
mPacketGetCount(0), mPacketGetCount(0),
mFramePutCount(0), mFramePutCount(0),
@@ -84,6 +85,7 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding)
mPackets = new MppQueue((node_destructor)mpp_packet_deinit); mPackets = new MppQueue((node_destructor)mpp_packet_deinit);
mFrames = new mpp_list((node_destructor)mpp_frame_deinit); mFrames = new mpp_list((node_destructor)mpp_frame_deinit);
mTasks = new mpp_list((node_destructor)NULL); mTasks = new mpp_list((node_destructor)NULL);
mTimeStamps = new MppQueue((node_destructor)mpp_packet_deinit);
MppDecCfg cfg = { MppDecCfg cfg = {
coding, coding,
@@ -247,6 +249,10 @@ void Mpp::clear()
delete mTasks; delete mTasks;
mTasks = NULL; mTasks = NULL;
} }
if (mTimeStamps) {
delete mTimeStamps;
mTimeStamps = NULL;
}
if (mPacketGroup) { if (mPacketGroup) {
mpp_buffer_group_put(mPacketGroup); mpp_buffer_group_put(mPacketGroup);
mPacketGroup = NULL; mPacketGroup = NULL;
@@ -769,7 +775,8 @@ MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param)
} break; } break;
case MPP_DEC_GET_VPUMEM_USED_COUNT: case MPP_DEC_GET_VPUMEM_USED_COUNT:
case MPP_DEC_SET_OUTPUT_FORMAT: case MPP_DEC_SET_OUTPUT_FORMAT:
case MPP_DEC_SET_DISABLE_ERROR: { case MPP_DEC_SET_DISABLE_ERROR:
case MPP_DEC_SET_PRESENT_TIME_ORDER: {
ret = mpp_dec_control(mDec, cmd, param); ret = mpp_dec_control(mDec, cmd, param);
} }
default : { default : {