From 22308f01fe7f277e8badf2060995437403caed62 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Tue, 10 Dec 2024 14:31:32 +0800 Subject: [PATCH] feat[mpp_dec]: Add jpeg put/get decode support Signed-off-by: Herman Chen Change-Id: I2c183d6157b1bcca29cf8559dfe903c92d5ae1de --- mpp/codec/inc/mpp_dec_impl.h | 1 + mpp/codec/mpp_dec_debug.h | 2 +- mpp/codec/mpp_dec_normal.cpp | 59 ++++++++++++++++++++++++++++-------- mpp/inc/mpp.h | 2 ++ mpp/mpp.cpp | 58 +++++++++++++++++++---------------- 5 files changed, 83 insertions(+), 39 deletions(-) diff --git a/mpp/codec/inc/mpp_dec_impl.h b/mpp/codec/inc/mpp_dec_impl.h index 7a7650cc..87c4b856 100644 --- a/mpp/codec/inc/mpp_dec_impl.h +++ b/mpp/codec/inc/mpp_dec_impl.h @@ -205,6 +205,7 @@ typedef union DecTaskStatus_u { RK_U32 info_task_gen_rdy : 1; RK_U32 curr_task_rdy : 1; RK_U32 task_parsed_rdy : 1; + RK_U32 mpp_in_frm_at_pkt : 1; }; } DecTaskStatus; diff --git a/mpp/codec/mpp_dec_debug.h b/mpp/codec/mpp_dec_debug.h index 0820dabe..31e20cdd 100644 --- a/mpp/codec/mpp_dec_debug.h +++ b/mpp/codec/mpp_dec_debug.h @@ -31,7 +31,7 @@ #define dec_dbg_func(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_FUNCTION, fmt, ## __VA_ARGS__) #define dec_dbg_status(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_STATUS, fmt, ## __VA_ARGS__) -#define dec_dbg_detail(fmt, ...) mpp_dec_dbg(MPP_DEC_DBG_DETAIL, fmt, ## __VA_ARGS__) +#define dec_dbg_detail(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_DETAIL, fmt, ## __VA_ARGS__) #define dec_dbg_reset(fmt, ...) mpp_dec_dbg(MPP_DEC_DBG_RESET, fmt, ## __VA_ARGS__) #define dec_dbg_notify(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_NOTIFY, fmt, ## __VA_ARGS__) diff --git a/mpp/codec/mpp_dec_normal.cpp b/mpp/codec/mpp_dec_normal.cpp index 986056d4..459816a7 100644 --- a/mpp/codec/mpp_dec_normal.cpp +++ b/mpp/codec/mpp_dec_normal.cpp @@ -979,6 +979,16 @@ void *mpp_dec_advanced_thread(void *data) mpp_task_meta_get_packet(mpp_task, KEY_INPUT_PACKET, &packet); mpp_task_meta_get_frame (mpp_task, KEY_OUTPUT_FRAME, &frame); + if (!frame && packet) { + MppMeta meta = mpp_packet_get_meta(packet); + + if (meta) { + mpp_meta_get_frame(meta, KEY_OUTPUT_FRAME, &frame); + if (frame) + task.status.mpp_in_frm_at_pkt = 1; + } + } + if (NULL == packet || NULL == frame) { mpp_port_enqueue(input, mpp_task); task.status.mpp_pkt_in_rdy = 0; @@ -1022,18 +1032,21 @@ void *mpp_dec_advanced_thread(void *data) goto DEC_OUT; } + dec_dbg_detail("slot change %d\n", mpp_buf_slot_is_changed(frame_slots)); if (mpp_buf_slot_is_changed(frame_slots)) { size_t slot_size = mpp_buf_slot_get_size(frame_slots); size_t buffer_size = mpp_buffer_get_size(output_buffer); + dec_dbg_detail("change size required %d vs input %d\n", slot_size, buffer_size); if (slot_size == buffer_size) { mpp_buf_slot_ready(frame_slots); } + mpp_assert(slot_size <= buffer_size); + if (slot_size > buffer_size) { mpp_err_f("required buffer size %d is larger than input buffer size %d\n", slot_size, buffer_size); - mpp_assert(slot_size <= buffer_size); } } @@ -1080,19 +1093,41 @@ void *mpp_dec_advanced_thread(void *data) * final user will release the mpp_frame they had input */ DEC_OUT: - mpp_task_meta_set_packet(mpp_task, KEY_INPUT_PACKET, packet); - mpp_port_enqueue(input, mpp_task); - mpp_task = NULL; + if (task.status.mpp_in_frm_at_pkt) { + mpp_list *list = mpp->mFrmOut; + MppMeta meta = mpp_frame_get_meta(frame); - // send finished task to output port - mpp_port_poll(output, MPP_POLL_BLOCK); - mpp_port_dequeue(output, &mpp_task); - mpp_task_meta_set_frame(mpp_task, KEY_OUTPUT_FRAME, frame); - mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(frame)); + if (meta) + mpp_meta_set_packet(meta, KEY_INPUT_PACKET, packet); + + mpp_dbg_pts("output frame pts %lld\n", mpp_frame_get_pts(frame)); + + list->lock(); + list->add_at_tail(&frame, sizeof(frame)); + mpp->mFramePutCount++; + list->signal(); + list->unlock(); + + mpp_port_enqueue(input, mpp_task); + mpp_task = NULL; + + task.status.mpp_in_frm_at_pkt = 0; + } else { + mpp_task_meta_set_packet(mpp_task, KEY_INPUT_PACKET, packet); + mpp_port_enqueue(input, mpp_task); + mpp_task = NULL; + + // send finished task to output port + mpp_port_poll(output, MPP_POLL_BLOCK); + mpp_port_dequeue(output, &mpp_task); + mpp_task_meta_set_frame(mpp_task, KEY_OUTPUT_FRAME, frame); + mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(frame)); + + // setup output task here + mpp_port_enqueue(output, mpp_task); + mpp_task = NULL; + } - // setup output task here - mpp_port_enqueue(output, mpp_task); - mpp_task = NULL; packet = NULL; frame = NULL; diff --git a/mpp/inc/mpp.h b/mpp/inc/mpp.h index c4a621db..7dc56bac 100644 --- a/mpp/inc/mpp.h +++ b/mpp/inc/mpp.h @@ -178,6 +178,8 @@ public: MppPort mMppOutPort; MppTaskQueue mInputTaskQueue; MppTaskQueue mOutputTaskQueue; + RK_S32 mInputTaskCount; + RK_S32 mOutputTaskCount; MppPollType mInputTimeout; MppPollType mOutputTimeout; diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index c6d8e1fd..81890df8 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -108,6 +108,8 @@ Mpp::Mpp(MppCtx ctx) mMppOutPort(NULL), mInputTaskQueue(NULL), mOutputTaskQueue(NULL), + mInputTaskCount(1), + mOutputTaskCount(1), mInputTimeout(MPP_POLL_BUTT), mOutputTimeout(MPP_POLL_BUTT), mInputTask(NULL), @@ -176,13 +178,13 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) mpp_buffer_group_get_internal(&mPacketGroup, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE); mpp_buffer_group_limit_config(mPacketGroup, 0, 3); - mpp_task_queue_setup(mInputTaskQueue, 4); - mpp_task_queue_setup(mOutputTaskQueue, 4); - } else { - mpp_task_queue_setup(mInputTaskQueue, 1); - mpp_task_queue_setup(mOutputTaskQueue, 1); + mInputTaskCount = 4; + mOutputTaskCount = 4; } + mpp_task_queue_setup(mInputTaskQueue, mInputTaskCount); + mpp_task_queue_setup(mOutputTaskQueue, mOutputTaskCount); + mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT); mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT); mMppInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_OUTPUT); @@ -223,13 +225,14 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) if (mInputTimeout == MPP_POLL_NON_BLOCK) { mEncAyncIo = 1; - input_task_count = check_frm_task_cnt_cap(coding); - if (input_task_count == 1) + mInputTaskCount = check_frm_task_cnt_cap(coding); + if (mInputTaskCount == 1) mInputTimeout = MPP_POLL_BLOCK; } + mOutputTaskCount = 8; - mpp_task_queue_setup(mInputTaskQueue, input_task_count); - mpp_task_queue_setup(mOutputTaskQueue, 8); + mpp_task_queue_setup(mInputTaskQueue, mInputTaskCount); + mpp_task_queue_setup(mOutputTaskQueue, mOutputTaskCount); mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT); mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT); @@ -388,24 +391,27 @@ MPP_RET Mpp::put_packet(MppPacket packet) put_packet(extra); } - if (!mEosTask) { - /* handle eos packet on block mode */ - ret = poll(MPP_PORT_INPUT, MPP_POLL_BLOCK); - if (ret < 0) - goto RET; + /* non-jpeg mode - reserve extra task for incoming eos packet */ + if (mInputTaskCount > 1) { + if (!mEosTask) { + /* handle eos packet on block mode */ + ret = poll(MPP_PORT_INPUT, MPP_POLL_BLOCK); + if (ret < 0) + goto RET; - dequeue(MPP_PORT_INPUT, &mEosTask); - if (NULL == mEosTask) { - mpp_err_f("fail to reserve eos task\n", ret); - ret = MPP_NOK; - goto RET; + dequeue(MPP_PORT_INPUT, &mEosTask); + if (NULL == mEosTask) { + mpp_err_f("fail to reserve eos task\n", ret); + ret = MPP_NOK; + goto RET; + } } - } - if (mpp_packet_get_eos(packet)) { - mpp_assert(mEosTask); - task_dequeue = mEosTask; - mEosTask = NULL; + if (mpp_packet_get_eos(packet)) { + mpp_assert(mEosTask); + task_dequeue = mEosTask; + mEosTask = NULL; + } } /* Use reserved task to send eos packet */ @@ -441,8 +447,8 @@ MPP_RET Mpp::put_packet(MppPacket packet) ret = MPP_OK; } else { /* packet zero copy path */ - mpp_log_f("not support zero copy path\n"); timeout = MPP_POLL_BLOCK; + ret = MPP_OK; } /* setup task */ @@ -466,7 +472,7 @@ MPP_RET Mpp::put_packet(MppPacket packet) mPacketPutCount++; if (timeout && !pkt_copy) - ret = poll(MPP_PORT_INPUT, timeout); + poll(MPP_PORT_INPUT, timeout); RET: /* wait enqueued task finished */