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_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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 : {
|
||||||
|
Reference in New Issue
Block a user