mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 09:06:50 +08:00
[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:
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -82,7 +82,7 @@ public:
|
||||
MppQueue *mPackets;
|
||||
mpp_list *mFrames;
|
||||
mpp_list *mTasks;
|
||||
|
||||
MppQueue *mTimeStamps;
|
||||
/* counters for debug */
|
||||
RK_U32 mPacketPutCount;
|
||||
RK_U32 mPacketGetCount;
|
||||
|
@@ -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;
|
||||
|
@@ -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 : {
|
||||
|
Reference in New Issue
Block a user