mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-07 01:52:46 +08:00
feat[mpp_dec]: Add jpeg put/get decode support
Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I2c183d6157b1bcca29cf8559dfe903c92d5ae1de
This commit is contained in:
@@ -205,6 +205,7 @@ typedef union DecTaskStatus_u {
|
|||||||
RK_U32 info_task_gen_rdy : 1;
|
RK_U32 info_task_gen_rdy : 1;
|
||||||
RK_U32 curr_task_rdy : 1;
|
RK_U32 curr_task_rdy : 1;
|
||||||
RK_U32 task_parsed_rdy : 1;
|
RK_U32 task_parsed_rdy : 1;
|
||||||
|
RK_U32 mpp_in_frm_at_pkt : 1;
|
||||||
};
|
};
|
||||||
} DecTaskStatus;
|
} DecTaskStatus;
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
#define dec_dbg_func(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_FUNCTION, fmt, ## __VA_ARGS__)
|
#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_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_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__)
|
#define dec_dbg_notify(fmt, ...) mpp_dec_dbg_f(MPP_DEC_DBG_NOTIFY, fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
|
@@ -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_packet(mpp_task, KEY_INPUT_PACKET, &packet);
|
||||||
mpp_task_meta_get_frame (mpp_task, KEY_OUTPUT_FRAME, &frame);
|
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) {
|
if (NULL == packet || NULL == frame) {
|
||||||
mpp_port_enqueue(input, mpp_task);
|
mpp_port_enqueue(input, mpp_task);
|
||||||
task.status.mpp_pkt_in_rdy = 0;
|
task.status.mpp_pkt_in_rdy = 0;
|
||||||
@@ -1022,18 +1032,21 @@ void *mpp_dec_advanced_thread(void *data)
|
|||||||
goto DEC_OUT;
|
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)) {
|
if (mpp_buf_slot_is_changed(frame_slots)) {
|
||||||
size_t slot_size = mpp_buf_slot_get_size(frame_slots);
|
size_t slot_size = mpp_buf_slot_get_size(frame_slots);
|
||||||
size_t buffer_size = mpp_buffer_get_size(output_buffer);
|
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) {
|
if (slot_size == buffer_size) {
|
||||||
mpp_buf_slot_ready(frame_slots);
|
mpp_buf_slot_ready(frame_slots);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpp_assert(slot_size <= buffer_size);
|
||||||
|
|
||||||
if (slot_size > buffer_size) {
|
if (slot_size > buffer_size) {
|
||||||
mpp_err_f("required buffer size %d is larger than input buffer size %d\n",
|
mpp_err_f("required buffer size %d is larger than input buffer size %d\n",
|
||||||
slot_size, buffer_size);
|
slot_size, buffer_size);
|
||||||
mpp_assert(slot_size <= buffer_size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1080,6 +1093,26 @@ void *mpp_dec_advanced_thread(void *data)
|
|||||||
* final user will release the mpp_frame they had input
|
* final user will release the mpp_frame they had input
|
||||||
*/
|
*/
|
||||||
DEC_OUT:
|
DEC_OUT:
|
||||||
|
if (task.status.mpp_in_frm_at_pkt) {
|
||||||
|
mpp_list *list = mpp->mFrmOut;
|
||||||
|
MppMeta meta = mpp_frame_get_meta(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_task_meta_set_packet(mpp_task, KEY_INPUT_PACKET, packet);
|
||||||
mpp_port_enqueue(input, mpp_task);
|
mpp_port_enqueue(input, mpp_task);
|
||||||
mpp_task = NULL;
|
mpp_task = NULL;
|
||||||
@@ -1093,6 +1126,8 @@ void *mpp_dec_advanced_thread(void *data)
|
|||||||
// setup output task here
|
// setup output task here
|
||||||
mpp_port_enqueue(output, mpp_task);
|
mpp_port_enqueue(output, mpp_task);
|
||||||
mpp_task = NULL;
|
mpp_task = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
packet = NULL;
|
packet = NULL;
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
|
|
||||||
|
@@ -178,6 +178,8 @@ public:
|
|||||||
MppPort mMppOutPort;
|
MppPort mMppOutPort;
|
||||||
MppTaskQueue mInputTaskQueue;
|
MppTaskQueue mInputTaskQueue;
|
||||||
MppTaskQueue mOutputTaskQueue;
|
MppTaskQueue mOutputTaskQueue;
|
||||||
|
RK_S32 mInputTaskCount;
|
||||||
|
RK_S32 mOutputTaskCount;
|
||||||
|
|
||||||
MppPollType mInputTimeout;
|
MppPollType mInputTimeout;
|
||||||
MppPollType mOutputTimeout;
|
MppPollType mOutputTimeout;
|
||||||
|
28
mpp/mpp.cpp
28
mpp/mpp.cpp
@@ -108,6 +108,8 @@ Mpp::Mpp(MppCtx ctx)
|
|||||||
mMppOutPort(NULL),
|
mMppOutPort(NULL),
|
||||||
mInputTaskQueue(NULL),
|
mInputTaskQueue(NULL),
|
||||||
mOutputTaskQueue(NULL),
|
mOutputTaskQueue(NULL),
|
||||||
|
mInputTaskCount(1),
|
||||||
|
mOutputTaskCount(1),
|
||||||
mInputTimeout(MPP_POLL_BUTT),
|
mInputTimeout(MPP_POLL_BUTT),
|
||||||
mOutputTimeout(MPP_POLL_BUTT),
|
mOutputTimeout(MPP_POLL_BUTT),
|
||||||
mInputTask(NULL),
|
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_get_internal(&mPacketGroup, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
|
||||||
mpp_buffer_group_limit_config(mPacketGroup, 0, 3);
|
mpp_buffer_group_limit_config(mPacketGroup, 0, 3);
|
||||||
|
|
||||||
mpp_task_queue_setup(mInputTaskQueue, 4);
|
mInputTaskCount = 4;
|
||||||
mpp_task_queue_setup(mOutputTaskQueue, 4);
|
mOutputTaskCount = 4;
|
||||||
} else {
|
|
||||||
mpp_task_queue_setup(mInputTaskQueue, 1);
|
|
||||||
mpp_task_queue_setup(mOutputTaskQueue, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpp_task_queue_setup(mInputTaskQueue, mInputTaskCount);
|
||||||
|
mpp_task_queue_setup(mOutputTaskQueue, mOutputTaskCount);
|
||||||
|
|
||||||
mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT);
|
mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT);
|
||||||
mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT);
|
mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT);
|
||||||
mMppInPort = mpp_task_queue_get_port(mInputTaskQueue, 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) {
|
if (mInputTimeout == MPP_POLL_NON_BLOCK) {
|
||||||
mEncAyncIo = 1;
|
mEncAyncIo = 1;
|
||||||
|
|
||||||
input_task_count = check_frm_task_cnt_cap(coding);
|
mInputTaskCount = check_frm_task_cnt_cap(coding);
|
||||||
if (input_task_count == 1)
|
if (mInputTaskCount == 1)
|
||||||
mInputTimeout = MPP_POLL_BLOCK;
|
mInputTimeout = MPP_POLL_BLOCK;
|
||||||
}
|
}
|
||||||
|
mOutputTaskCount = 8;
|
||||||
|
|
||||||
mpp_task_queue_setup(mInputTaskQueue, input_task_count);
|
mpp_task_queue_setup(mInputTaskQueue, mInputTaskCount);
|
||||||
mpp_task_queue_setup(mOutputTaskQueue, 8);
|
mpp_task_queue_setup(mOutputTaskQueue, mOutputTaskCount);
|
||||||
|
|
||||||
mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT);
|
mUsrInPort = mpp_task_queue_get_port(mInputTaskQueue, MPP_PORT_INPUT);
|
||||||
mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT);
|
mUsrOutPort = mpp_task_queue_get_port(mOutputTaskQueue, MPP_PORT_OUTPUT);
|
||||||
@@ -388,6 +391,8 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
|||||||
put_packet(extra);
|
put_packet(extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* non-jpeg mode - reserve extra task for incoming eos packet */
|
||||||
|
if (mInputTaskCount > 1) {
|
||||||
if (!mEosTask) {
|
if (!mEosTask) {
|
||||||
/* handle eos packet on block mode */
|
/* handle eos packet on block mode */
|
||||||
ret = poll(MPP_PORT_INPUT, MPP_POLL_BLOCK);
|
ret = poll(MPP_PORT_INPUT, MPP_POLL_BLOCK);
|
||||||
@@ -407,6 +412,7 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
|||||||
task_dequeue = mEosTask;
|
task_dequeue = mEosTask;
|
||||||
mEosTask = NULL;
|
mEosTask = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Use reserved task to send eos packet */
|
/* Use reserved task to send eos packet */
|
||||||
if (mInputTask && !task_dequeue) {
|
if (mInputTask && !task_dequeue) {
|
||||||
@@ -441,8 +447,8 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
|||||||
ret = MPP_OK;
|
ret = MPP_OK;
|
||||||
} else {
|
} else {
|
||||||
/* packet zero copy path */
|
/* packet zero copy path */
|
||||||
mpp_log_f("not support zero copy path\n");
|
|
||||||
timeout = MPP_POLL_BLOCK;
|
timeout = MPP_POLL_BLOCK;
|
||||||
|
ret = MPP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup task */
|
/* setup task */
|
||||||
@@ -466,7 +472,7 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
|||||||
mPacketPutCount++;
|
mPacketPutCount++;
|
||||||
|
|
||||||
if (timeout && !pkt_copy)
|
if (timeout && !pkt_copy)
|
||||||
ret = poll(MPP_PORT_INPUT, timeout);
|
poll(MPP_PORT_INPUT, timeout);
|
||||||
|
|
||||||
RET:
|
RET:
|
||||||
/* wait enqueued task finished */
|
/* wait enqueued task finished */
|
||||||
|
Reference in New Issue
Block a user