chore[mpp_dec]: Decoder changes to cacheable buffer

Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
Change-Id: I839cd04d14a38f4553785c44667758df69aa9929
This commit is contained in:
Herman Chen
2023-11-09 17:16:42 +08:00
parent dbdccc6818
commit 5d89c2cc32
6 changed files with 21 additions and 11 deletions

View File

@@ -136,7 +136,6 @@ MPP_RET mpp_dec_decode(MppDec ctx, MppPacket packet)
* 6. copy data to hardware buffer * 6. copy data to hardware buffer
*/ */
if (!status->dec_pkt_copy_rdy) { if (!status->dec_pkt_copy_rdy) {
void *dst = mpp_buffer_get_ptr(task->hal_pkt_buf_in);
void *src = mpp_packet_get_data(task_dec->input_packet); void *src = mpp_packet_get_data(task_dec->input_packet);
size_t length = mpp_packet_get_length(task_dec->input_packet); size_t length = mpp_packet_get_length(task_dec->input_packet);
@@ -144,7 +143,8 @@ MPP_RET mpp_dec_decode(MppDec ctx, MppPacket packet)
mpp_assert(task_dec->input_packet); mpp_assert(task_dec->input_packet);
dec_dbg_detail("detail: %p copy to hw length %d\n", dec, length); dec_dbg_detail("detail: %p copy to hw length %d\n", dec, length);
memcpy(dst, src, length); mpp_buffer_write(task->hal_pkt_buf_in, 0, src, length);
mpp_buffer_sync_partial_end(task->hal_pkt_buf_in, 0, length);
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_CODEC_READY); mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_CODEC_READY);
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT);

View File

@@ -440,11 +440,11 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
* 6. copy prepared stream to hardware buffer * 6. copy prepared stream to hardware buffer
*/ */
if (!task->status.dec_pkt_copy_rdy) { if (!task->status.dec_pkt_copy_rdy) {
void *dst = mpp_buffer_get_ptr(hal_buf_in);
void *src = mpp_packet_get_data(task_dec->input_packet); void *src = mpp_packet_get_data(task_dec->input_packet);
size_t length = mpp_packet_get_length(task_dec->input_packet); size_t length = mpp_packet_get_length(task_dec->input_packet);
memcpy(dst, src, length); mpp_buffer_write(hal_buf_in, 0, src, length);
mpp_buffer_sync_partial_end(hal_buf_in, 0, length);
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_CODEC_READY); mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_CODEC_READY);
mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT); mpp_buf_slot_set_flag(packet_slots, task_dec->input, SLOT_HAL_INPUT);
task->status.dec_pkt_copy_rdy = 1; task->status.dec_pkt_copy_rdy = 1;
@@ -571,7 +571,7 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task)
/* 10. whether the frame buffer group is internal or external */ /* 10. whether the frame buffer group is internal or external */
if (NULL == mpp->mFrameGroup) { if (NULL == mpp->mFrameGroup) {
mpp_log("mpp_dec use internal frame buffer group\n"); mpp_log("mpp_dec use internal frame buffer group\n");
mpp_buffer_group_get_internal(&mpp->mFrameGroup, MPP_BUFFER_TYPE_ION); mpp_buffer_group_get_internal(&mpp->mFrameGroup, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
} }
/* 10.1 look for a unused hardware buffer for output */ /* 10.1 look for a unused hardware buffer for output */
@@ -1064,6 +1064,7 @@ void *mpp_dec_advanced_thread(void *data)
mpp_port_poll(output, MPP_POLL_BLOCK); mpp_port_poll(output, MPP_POLL_BLOCK);
mpp_port_dequeue(output, &mpp_task); mpp_port_dequeue(output, &mpp_task);
mpp_task_meta_set_frame(mpp_task, KEY_OUTPUT_FRAME, frame); 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 // setup output task here
mpp_port_enqueue(output, mpp_task); mpp_port_enqueue(output, mpp_task);

View File

@@ -160,7 +160,7 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding)
mOutputTimeout = MPP_POLL_NON_BLOCK; mOutputTimeout = MPP_POLL_NON_BLOCK;
if (mCoding != MPP_VIDEO_CodingMJPEG) { if (mCoding != MPP_VIDEO_CodingMJPEG) {
mpp_buffer_group_get_internal(&mPacketGroup, MPP_BUFFER_TYPE_ION); 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); mpp_task_queue_setup(mInputTaskQueue, 4);
@@ -497,9 +497,15 @@ MPP_RET Mpp::get_frame(MppFrame *frame)
} }
if (mFrmOut->list_size()) { if (mFrmOut->list_size()) {
MppBuffer buffer;
mFrmOut->del_at_head(&frm, sizeof(frame)); mFrmOut->del_at_head(&frm, sizeof(frame));
mFrameGetCount++; mFrameGetCount++;
notify(MPP_OUTPUT_DEQUEUE); notify(MPP_OUTPUT_DEQUEUE);
buffer = mpp_frame_get_buffer(frm);
if (buffer)
mpp_buffer_sync_ro_begin(buffer);
} else { } else {
// NOTE: Add signal here is not efficient // NOTE: Add signal here is not efficient
// This is for fix bug of stucking on decoder parser thread // This is for fix bug of stucking on decoder parser thread
@@ -530,6 +536,7 @@ MPP_RET Mpp::get_frame_noblock(MppFrame *frame)
mFrmOut->lock(); mFrmOut->lock();
if (mFrmOut->list_size()) { if (mFrmOut->list_size()) {
mFrmOut->del_at_head(&first, sizeof(frame)); mFrmOut->del_at_head(&first, sizeof(frame));
mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(first));
mFrameGetCount++; mFrameGetCount++;
} }
mFrmOut->unlock(); mFrmOut->unlock();
@@ -559,6 +566,7 @@ MPP_RET Mpp::decode(MppPacket packet, MppFrame *frame)
if (mFrmOut->list_size()) { if (mFrmOut->list_size()) {
mFrmOut->del_at_head(frame, sizeof(*frame)); mFrmOut->del_at_head(frame, sizeof(*frame));
mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(*frame));
mFrameGetCount++; mFrameGetCount++;
return MPP_OK; return MPP_OK;
} }
@@ -578,6 +586,7 @@ MPP_RET Mpp::decode(MppPacket packet, MppFrame *frame)
if (mFrmOut->list_size()) { if (mFrmOut->list_size()) {
mFrmOut->del_at_head(frame, sizeof(*frame)); mFrmOut->del_at_head(frame, sizeof(*frame));
mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(*frame));
mFrameGetCount++; mFrameGetCount++;
frm_rdy = 1; frm_rdy = 1;
} }

View File

@@ -154,7 +154,7 @@ void *thread_output(void *arg)
if (NULL == data->frm_grp) { if (NULL == data->frm_grp) {
/* If buffer group is not set create one and limit it */ /* If buffer group is not set create one and limit it */
ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION); ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
if (ret) { if (ret) {
mpp_err("get mpp buffer group failed ret %d\n", ret); mpp_err("get mpp buffer group failed ret %d\n", ret);
break; break;

View File

@@ -158,7 +158,7 @@ static int multi_dec_simple(MpiDecMultiCtx *data)
if (NULL == data->frm_grp) { if (NULL == data->frm_grp) {
/* If buffer group is not set create one and limit it */ /* If buffer group is not set create one and limit it */
ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION); ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
if (ret) { if (ret) {
mpp_err("get mpp buffer group failed ret %d\n", ret); mpp_err("get mpp buffer group failed ret %d\n", ret);
break; break;
@@ -438,7 +438,7 @@ void* multi_dec_decode(void *cmd_ctx)
RK_U32 hor_stride = MPP_ALIGN(width, 16); RK_U32 hor_stride = MPP_ALIGN(width, 16);
RK_U32 ver_stride = MPP_ALIGN(height, 16); RK_U32 ver_stride = MPP_ALIGN(height, 16);
ret = mpp_buffer_group_get_internal(&dec_ctx->frm_grp, MPP_BUFFER_TYPE_ION); ret = mpp_buffer_group_get_internal(&dec_ctx->frm_grp, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
if (ret) { if (ret) {
mpp_err("failed to get buffer group for input frame ret %d\n", ret); mpp_err("failed to get buffer group for input frame ret %d\n", ret);
goto MPP_TEST_OUT; goto MPP_TEST_OUT;

View File

@@ -206,7 +206,7 @@ static int dec_simple(MpiDecLoopData *data)
if (NULL == data->frm_grp) { if (NULL == data->frm_grp) {
/* If buffer group is not set create one and limit it */ /* If buffer group is not set create one and limit it */
ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION); ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
if (ret) { if (ret) {
mpp_err("%p get mpp buffer group failed ret %d\n", ctx, ret); mpp_err("%p get mpp buffer group failed ret %d\n", ctx, ret);
break; break;
@@ -580,7 +580,7 @@ int dec_decode(MpiDecTestCmd *cmd)
RK_U32 hor_stride = MPP_ALIGN(width, 16); RK_U32 hor_stride = MPP_ALIGN(width, 16);
RK_U32 ver_stride = MPP_ALIGN(height, 16); RK_U32 ver_stride = MPP_ALIGN(height, 16);
ret = mpp_buffer_group_get_internal(&data.frm_grp, MPP_BUFFER_TYPE_ION); ret = mpp_buffer_group_get_internal(&data.frm_grp, MPP_BUFFER_TYPE_ION | MPP_BUFFER_FLAGS_CACHABLE);
if (ret) { if (ret) {
mpp_err("failed to get buffer group for input frame ret %d\n", ret); mpp_err("failed to get buffer group for input frame ret %d\n", ret);
goto MPP_TEST_OUT; goto MPP_TEST_OUT;