mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-09 11:00:53 +08:00
[mpp_dec] modify eos flow, fixed eos no notify to user
git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@967 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
@@ -561,12 +561,13 @@ MPP_RET h264d_flush(void *decoder)
|
|||||||
if (p_Dec->mvc_valid) {
|
if (p_Dec->mvc_valid) {
|
||||||
FUN_CHECK(ret = output_dpb(p_Dec, p_Dec->p_Vid->p_Dpb_layer[1]));
|
FUN_CHECK(ret = output_dpb(p_Dec, p_Dec->p_Vid->p_Dpb_layer[1]));
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
if (p_Dec->last_frame_slot_idx >= 0) {
|
if (p_Dec->last_frame_slot_idx >= 0) {
|
||||||
mpp_buf_slot_set_prop(p_Dec->frame_slots, p_Dec->last_frame_slot_idx,
|
mpp_buf_slot_set_prop(p_Dec->frame_slots, p_Dec->last_frame_slot_idx,
|
||||||
SLOT_EOS, &p_Dec->p_Inp->has_get_eos);
|
SLOT_EOS, &p_Dec->p_Inp->has_get_eos);
|
||||||
p_Dec->last_frame_slot_idx = -1;
|
p_Dec->last_frame_slot_idx = -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
__RETURN:
|
__RETURN:
|
||||||
FunctionOut(p_Dec->logctx.parr[RUN_PARSE]);
|
FunctionOut(p_Dec->logctx.parr[RUN_PARSE]);
|
||||||
return ret = MPP_OK;
|
return ret = MPP_OK;
|
||||||
|
@@ -1720,15 +1720,15 @@ MPP_RET h265d_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
|
|||||||
return MPP_FAIL_SPLIT_FRAME;
|
return MPP_FAIL_SPLIT_FRAME;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
pos = buf + length;
|
pos = buf + length;
|
||||||
s->pts = pts;
|
s->pts = pts;
|
||||||
mpp_packet_set_pos(pkt, pos);
|
mpp_packet_set_pos(pkt, pos);
|
||||||
if (s->eos) {
|
if (s->eos && !length) {
|
||||||
task->valid = 0;
|
task->valid = 0;
|
||||||
task->flags.eos = 1;
|
task->flags.eos = 1;
|
||||||
|
mpp_log_f("hevc flush eos");
|
||||||
h265d_flush(ctx);
|
h265d_flush(ctx);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef dump
|
#ifdef dump
|
||||||
@@ -1796,15 +1796,9 @@ MPP_RET h265d_parse(void *ctx, HalDecTask *task)
|
|||||||
} else {
|
} else {
|
||||||
if (s->eos) {
|
if (s->eos) {
|
||||||
h265d_flush(ctx);
|
h265d_flush(ctx);
|
||||||
|
s->task->flags.eos = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
|
|
||||||
HEVCFrame *frame = &s->DPB[i];
|
|
||||||
if (frame->poc != INT_MAX)
|
|
||||||
mpp_err("poc[%d] = %d", i, frame->poc);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
s->nb_frame++;
|
s->nb_frame++;
|
||||||
if (s->is_decoded) {
|
if (s->is_decoded) {
|
||||||
h265d_dbg(H265D_DBG_GLOBAL, "Decoded frame with POC %d.\n", s->poc);
|
h265d_dbg(H265D_DBG_GLOBAL, "Decoded frame with POC %d.\n", s->poc);
|
||||||
@@ -1972,21 +1966,9 @@ MPP_RET h265d_init(void *ctx, ParserCfg *parser_cfg)
|
|||||||
MPP_RET h265d_flush(void *ctx)
|
MPP_RET h265d_flush(void *ctx)
|
||||||
{
|
{
|
||||||
RK_S32 ret = 0;
|
RK_S32 ret = 0;
|
||||||
H265dContext_t *h265dctx = (H265dContext_t *)ctx;
|
|
||||||
HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
|
|
||||||
HEVCFrame *frame = NULL;
|
|
||||||
do {
|
do {
|
||||||
ret = mpp_hevc_output_frame(ctx, 1);
|
ret = mpp_hevc_output_frame(ctx, 1);
|
||||||
} while (ret);
|
} while (ret);
|
||||||
frame = &s->DPB[s->output_frame_idx];
|
|
||||||
if ((frame->slot_index < 0xff) && s->eos) {
|
|
||||||
mpp_buf_slot_set_prop(s->slots, frame->slot_index, SLOT_EOS, &s->eos);
|
|
||||||
} else {
|
|
||||||
if (s->notify_cb.callBack != NULL && s->eos) {
|
|
||||||
s->notify_cb.callBack(s->notify_cb.opaque, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MPP_OK;
|
return MPP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -329,6 +329,7 @@ MPP_RET m2vd_parser_flush(void *ctx)
|
|||||||
mpp_buf_slot_enqueue(p->frame_slots, p->frame_ref0->slot_index, QUEUE_DISPLAY);
|
mpp_buf_slot_enqueue(p->frame_slots, p->frame_ref0->slot_index, QUEUE_DISPLAY);
|
||||||
p->frame_ref0->flags = 0;
|
p->frame_ref0->flags = 0;
|
||||||
exit:
|
exit:
|
||||||
|
#if 0
|
||||||
if (p->eos) {
|
if (p->eos) {
|
||||||
if ( p->frame_ref0->slot_index < 0xff) {
|
if ( p->frame_ref0->slot_index < 0xff) {
|
||||||
mpp_buf_slot_set_prop(p->frame_slots, p->frame_ref0->slot_index, SLOT_EOS, &p->eos);
|
mpp_buf_slot_set_prop(p->frame_slots, p->frame_ref0->slot_index, SLOT_EOS, &p->eos);
|
||||||
@@ -338,6 +339,7 @@ exit:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,6 +436,7 @@ MPP_RET m2vd_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
|
|||||||
|
|
||||||
if (out_size == 0 && p->eos) {
|
if (out_size == 0 && p->eos) {
|
||||||
m2vd_parser_flush(ctx);
|
m2vd_parser_flush(ctx);
|
||||||
|
task->flags.eos = 1;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -440,9 +440,7 @@ MPP_RET vp8d_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
|
|||||||
mpp_packet_set_pos(pkt, pos);
|
mpp_packet_set_pos(pkt, pos);
|
||||||
|
|
||||||
if (out_size == 0 && p->eos) {
|
if (out_size == 0 && p->eos) {
|
||||||
if (p->notify_cb.callBack != NULL) {
|
task->flags.eos = p->eos;
|
||||||
p->notify_cb.callBack(p->notify_cb.opaque, NULL);
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1197,13 +1195,7 @@ MPP_RET vp8d_parser_parse(void *ctx, HalDecTask *in_task)
|
|||||||
in_task->output = p->frame_out->slot_index;
|
in_task->output = p->frame_out->slot_index;
|
||||||
in_task->valid = 1;
|
in_task->valid = 1;
|
||||||
if (p->eos) {
|
if (p->eos) {
|
||||||
if (p->showFrame) {
|
in_task->flags.eos = p->eos;
|
||||||
mpp_buf_slot_set_prop(p->frame_slots, p->frame_out->slot_index, SLOT_EOS, &p->eos);
|
|
||||||
} else {
|
|
||||||
if (p->notify_cb.callBack != NULL) {
|
|
||||||
p->notify_cb.callBack(p->notify_cb.opaque, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
vp8d_ref_update(p);
|
vp8d_ref_update(p);
|
||||||
|
|
||||||
|
@@ -236,6 +236,16 @@ static void mpp_put_frame(Mpp *mpp, MppFrame frame)
|
|||||||
list->unlock();
|
list->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mpp_put_frame_eos(Mpp *mpp)
|
||||||
|
{
|
||||||
|
MppFrame info_frame = NULL;
|
||||||
|
mpp_frame_init(&info_frame);
|
||||||
|
mpp_assert(NULL == mpp_frame_get_buffer(info_frame));
|
||||||
|
mpp_frame_set_eos(info_frame, 1);
|
||||||
|
mpp_put_frame((Mpp*)mpp, info_frame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static void mpp_dec_push_display(Mpp *mpp)
|
static void mpp_dec_push_display(Mpp *mpp)
|
||||||
{
|
{
|
||||||
RK_S32 index;
|
RK_S32 index;
|
||||||
@@ -257,6 +267,14 @@ static void mpp_dec_push_display(Mpp *mpp)
|
|||||||
mpp->mThreadHal->unlock(THREAD_QUE_DISPLAY);
|
mpp->mThreadHal->unlock(THREAD_QUE_DISPLAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mpp_dec_push_eos_task(Mpp *mpp, DecTask *task)
|
||||||
|
{
|
||||||
|
hal_task_hnd_set_info(task->hnd, &task->info);
|
||||||
|
mpp->mThreadHal->lock();
|
||||||
|
hal_task_hnd_set_status(task->hnd, TASK_PROCESSING);
|
||||||
|
mpp->mThreadHal->unlock();
|
||||||
|
mpp->mThreadHal->signal();
|
||||||
|
}
|
||||||
|
|
||||||
static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
|
static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
|
||||||
{
|
{
|
||||||
@@ -343,13 +361,18 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We may find eos in prepare step and there will be no anymore vaild task generated.
|
|
||||||
* So here we try push all frames to display to avoid eos no notify to display
|
|
||||||
*/
|
|
||||||
mpp_dec_push_display(mpp);
|
|
||||||
|
|
||||||
task->status.curr_task_rdy = task_dec->valid;
|
task->status.curr_task_rdy = task_dec->valid;
|
||||||
|
/*
|
||||||
|
* We may find eos in prepare step and there will be no anymore vaild task generated.
|
||||||
|
* So here we try push eos task to hal, hal will push all frame to display then
|
||||||
|
* push a eos frame to tell all frame decoded
|
||||||
|
*/
|
||||||
|
// mpp_dec_push_display(mpp);
|
||||||
|
if (task_dec->flags.eos && !task_dec->valid) {
|
||||||
|
mpp_dec_push_eos_task(mpp, task);
|
||||||
|
task->hnd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!task->status.curr_task_rdy)
|
if (!task->status.curr_task_rdy)
|
||||||
return MPP_NOK;
|
return MPP_NOK;
|
||||||
|
|
||||||
@@ -435,7 +458,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
|
|||||||
* We may find eos in prepare step and there will be no anymore vaild task generated.
|
* We may find eos in prepare step and there will be no anymore vaild task generated.
|
||||||
* So here we try push all frames to display to avoid eos no notify to display
|
* So here we try push all frames to display to avoid eos no notify to display
|
||||||
*/
|
*/
|
||||||
mpp_dec_push_display(mpp);
|
// mpp_dec_push_display(mpp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 8. send packet data to parser
|
* 8. send packet data to parser
|
||||||
@@ -487,9 +510,19 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
|
|||||||
mpp_assert(task->hnd);
|
mpp_assert(task->hnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// send info change task to hal thread
|
|
||||||
if (task_dec->output < 0) {
|
if (task_dec->output < 0) {
|
||||||
hal_task_hnd_set_status(task->hnd, TASK_IDLE);
|
/*
|
||||||
|
* We may find eos in parser step and there will be no anymore vaild task generated.
|
||||||
|
* So here we try push eos task to hal, hal will push all frame to display then
|
||||||
|
* push a eos frame to tell all frame decoded
|
||||||
|
*/
|
||||||
|
if (task_dec->flags.eos) {
|
||||||
|
mpp_dec_push_eos_task(mpp, task);
|
||||||
|
} else {
|
||||||
|
hal_task_hnd_set_status(task->hnd, TASK_IDLE);
|
||||||
|
}
|
||||||
|
|
||||||
mpp->mTaskPutCount++;
|
mpp->mTaskPutCount++;
|
||||||
task->hnd = NULL;
|
task->hnd = NULL;
|
||||||
if (task->status.dec_pkt_copy_rdy) {
|
if (task->status.dec_pkt_copy_rdy) {
|
||||||
@@ -690,6 +723,19 @@ void *mpp_dec_hal_thread(void *data)
|
|||||||
mpp->mThreadCodec->signal();
|
mpp->mThreadCodec->signal();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* check eos task
|
||||||
|
* if this task is invalid then eos flag come we will flush display que
|
||||||
|
* then push eos frame to tell all frame decoded
|
||||||
|
*/
|
||||||
|
if (task_dec->flags.eos && !task_dec->valid) {
|
||||||
|
mpp_dec_push_display(mpp);
|
||||||
|
mpp_put_frame_eos(mpp);
|
||||||
|
hal_task_hnd_set_status(task, TASK_IDLE);
|
||||||
|
mpp->mThreadCodec->signal();
|
||||||
|
task = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
mpp_hal_hw_wait(dec->hal, &task_info);
|
mpp_hal_hw_wait(dec->hal, &task_info);
|
||||||
p_e = mpp_time();
|
p_e = mpp_time();
|
||||||
cur_deat = (p_e - p_s);
|
cur_deat = (p_e - p_s);
|
||||||
@@ -732,6 +778,14 @@ void *mpp_dec_hal_thread(void *data)
|
|||||||
mpp_dec_flush(dec);
|
mpp_dec_flush(dec);
|
||||||
}
|
}
|
||||||
mpp_dec_push_display(mpp);
|
mpp_dec_push_display(mpp);
|
||||||
|
/*
|
||||||
|
* check eos task
|
||||||
|
* if this task is valid then eos flag come we will flush display que
|
||||||
|
* then push eos frame to tell all frame decoded
|
||||||
|
*/
|
||||||
|
if (task_dec->flags.eos) {
|
||||||
|
mpp_put_frame_eos(mpp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ static const ParserApi *parsers[] = {
|
|||||||
&api_avsd_parser,
|
&api_avsd_parser,
|
||||||
&api_m2vd_parser,
|
&api_m2vd_parser,
|
||||||
&api_mpg4d_parser,
|
&api_mpg4d_parser,
|
||||||
&api_vp8d_parser,
|
&api_vp8d_parser,
|
||||||
&dummy_dec_parser,
|
&dummy_dec_parser,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -229,6 +229,7 @@ MPP_RET hal_task_info_init(HalTaskInfo *task, MppCtxType type)
|
|||||||
HalDecTask *p = &task->dec;
|
HalDecTask *p = &task->dec;
|
||||||
p->valid = 0;
|
p->valid = 0;
|
||||||
p->flags.val = 0;
|
p->flags.val = 0;
|
||||||
|
p->flags.eos = 0;
|
||||||
p->prev_status = 0;
|
p->prev_status = 0;
|
||||||
p->input_packet = NULL;
|
p->input_packet = NULL;
|
||||||
p->output = -1;
|
p->output = -1;
|
||||||
|
Reference in New Issue
Block a user