diff --git a/inc/rk_mpi_cmd.h b/inc/rk_mpi_cmd.h index 5eaf6c60..89f53f77 100644 --- a/inc/rk_mpi_cmd.h +++ b/inc/rk_mpi_cmd.h @@ -97,6 +97,7 @@ typedef enum { MPP_DEC_SET_VC1_EXTRA_DATA, 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_PRESENT_TIME_ORDER, /* use input time order for output */ MPP_DEC_CMD_END, MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC, diff --git a/mpp/codec/inc/mpp_dec.h b/mpp/codec/inc/mpp_dec.h index 1049bd29..93a7a943 100644 --- a/mpp/codec/inc/mpp_dec.h +++ b/mpp/codec/inc/mpp_dec.h @@ -41,7 +41,7 @@ struct MppDec_t { RK_U32 parser_fast_mode; RK_U32 parser_internal_pts; RK_U32 disable_error; - + RK_U32 use_preset_time_order; // dec parser thread runtime resource context MppPacket mpp_pkt_in; void *mpp; diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index 424604e1..180e06b8 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -175,13 +175,14 @@ static RK_U32 reset_dec_task(Mpp *mpp, DecTask *task) mpp_buffer_put(buffer); 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) { mpp_buf_slot_clr_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); task->status.dec_pkt_copy_rdy = 0; task_dec->input = -1; } - - task->status.task_parsed_rdy = 0; parser->unlock(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_put_frame((Mpp*)mpp, info_frame); + if (mpp->mDec->use_preset_time_order) { + mpp->mTimeStamps->flush(); + } return; } @@ -241,6 +245,16 @@ static void mpp_dec_push_display(Mpp *mpp, RK_U32 flag) /* deal with current frame */ if (flag && mpp_slots_is_empty(frame_slots, QUEUE_DISPLAY)) 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) 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))) 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++; } @@ -1110,6 +1133,9 @@ MPP_RET mpp_dec_control(MppDec *dec, MpiCmd cmd, void *param) case MPP_DEC_SET_DISABLE_ERROR: { dec->disable_error = *((RK_U32 *)param); } + case MPP_DEC_SET_PRESENT_TIME_ORDER: { + dec->use_preset_time_order = *((RK_U32 *)param); + } default : { } break; } diff --git a/mpp/inc/mpp.h b/mpp/inc/mpp.h index 278467c8..47197159 100755 --- a/mpp/inc/mpp.h +++ b/mpp/inc/mpp.h @@ -82,7 +82,7 @@ public: MppQueue *mPackets; mpp_list *mFrames; mpp_list *mTasks; - + MppQueue *mTimeStamps; /* counters for debug */ RK_U32 mPacketPutCount; RK_U32 mPacketGetCount; diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index a66c5e29..d0e3ef40 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -1403,7 +1403,7 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) mpicmd = MPP_DEC_SET_EXT_BUF_GROUP; } break; case VPU_API_USE_PRESENT_TIME_ORDER: { - mpicmd = MPP_DEC_SET_INTERNAL_PTS_ENABLE; + mpicmd = MPP_DEC_SET_PRESENT_TIME_ORDER; } break; case VPU_API_SET_INFO_CHANGE: { mpicmd = MPP_DEC_SET_INFO_CHANGE_READY; diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 8a944838..a08367e7 100755 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -38,6 +38,7 @@ Mpp::Mpp() : mPackets(NULL), mFrames(NULL), mTasks(NULL), + mTimeStamps(NULL), mPacketPutCount(0), mPacketGetCount(0), mFramePutCount(0), @@ -84,6 +85,7 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) mPackets = new MppQueue((node_destructor)mpp_packet_deinit); mFrames = new mpp_list((node_destructor)mpp_frame_deinit); mTasks = new mpp_list((node_destructor)NULL); + mTimeStamps = new MppQueue((node_destructor)mpp_packet_deinit); MppDecCfg cfg = { coding, @@ -247,6 +249,10 @@ void Mpp::clear() delete mTasks; mTasks = NULL; } + if (mTimeStamps) { + delete mTimeStamps; + mTimeStamps = NULL; + } if (mPacketGroup) { mpp_buffer_group_put(mPacketGroup); mPacketGroup = NULL; @@ -769,7 +775,8 @@ MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param) } break; case MPP_DEC_GET_VPUMEM_USED_COUNT: 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); } default : {