diff --git a/mpp/codec/mpp_dec_no_thread.cpp b/mpp/codec/mpp_dec_no_thread.cpp index 0872e4b7..cc50c87e 100644 --- a/mpp/codec/mpp_dec_no_thread.cpp +++ b/mpp/codec/mpp_dec_no_thread.cpp @@ -136,7 +136,6 @@ MPP_RET mpp_dec_decode(MppDec ctx, MppPacket packet) * 6. copy data to hardware buffer */ 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); 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); 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_HAL_INPUT); diff --git a/mpp/codec/mpp_dec_normal.cpp b/mpp/codec/mpp_dec_normal.cpp index bbc16b3f..da8b65aa 100644 --- a/mpp/codec/mpp_dec_normal.cpp +++ b/mpp/codec/mpp_dec_normal.cpp @@ -440,11 +440,11 @@ static MPP_RET try_proc_dec_task(Mpp *mpp, DecTask *task) * 6. copy prepared stream to hardware buffer */ 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); 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_HAL_INPUT); 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 */ if (NULL == mpp->mFrameGroup) { 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 */ @@ -1064,6 +1064,7 @@ void *mpp_dec_advanced_thread(void *data) 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); diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 93fd4a58..4f47c253 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -160,7 +160,7 @@ MPP_RET Mpp::init(MppCtxType type, MppCodingType coding) mOutputTimeout = MPP_POLL_NON_BLOCK; 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_task_queue_setup(mInputTaskQueue, 4); @@ -497,9 +497,15 @@ MPP_RET Mpp::get_frame(MppFrame *frame) } if (mFrmOut->list_size()) { + MppBuffer buffer; + mFrmOut->del_at_head(&frm, sizeof(frame)); mFrameGetCount++; notify(MPP_OUTPUT_DEQUEUE); + + buffer = mpp_frame_get_buffer(frm); + if (buffer) + mpp_buffer_sync_ro_begin(buffer); } else { // NOTE: Add signal here is not efficient // 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(); if (mFrmOut->list_size()) { mFrmOut->del_at_head(&first, sizeof(frame)); + mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(first)); mFrameGetCount++; } mFrmOut->unlock(); @@ -559,6 +566,7 @@ MPP_RET Mpp::decode(MppPacket packet, MppFrame *frame) if (mFrmOut->list_size()) { mFrmOut->del_at_head(frame, sizeof(*frame)); + mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(*frame)); mFrameGetCount++; return MPP_OK; } @@ -578,6 +586,7 @@ MPP_RET Mpp::decode(MppPacket packet, MppFrame *frame) if (mFrmOut->list_size()) { mFrmOut->del_at_head(frame, sizeof(*frame)); + mpp_buffer_sync_ro_begin(mpp_frame_get_buffer(*frame)); mFrameGetCount++; frm_rdy = 1; } diff --git a/test/mpi_dec_mt_test.c b/test/mpi_dec_mt_test.c index eace7048..97f02624 100644 --- a/test/mpi_dec_mt_test.c +++ b/test/mpi_dec_mt_test.c @@ -154,7 +154,7 @@ void *thread_output(void *arg) if (NULL == data->frm_grp) { /* 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) { mpp_err("get mpp buffer group failed ret %d\n", ret); break; diff --git a/test/mpi_dec_multi_test.c b/test/mpi_dec_multi_test.c index cf3fce3a..84e83652 100644 --- a/test/mpi_dec_multi_test.c +++ b/test/mpi_dec_multi_test.c @@ -158,7 +158,7 @@ static int multi_dec_simple(MpiDecMultiCtx *data) if (NULL == data->frm_grp) { /* 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) { mpp_err("get mpp buffer group failed ret %d\n", ret); break; @@ -438,7 +438,7 @@ void* multi_dec_decode(void *cmd_ctx) RK_U32 hor_stride = MPP_ALIGN(width, 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) { mpp_err("failed to get buffer group for input frame ret %d\n", ret); goto MPP_TEST_OUT; diff --git a/test/mpi_dec_test.c b/test/mpi_dec_test.c index bace4ceb..2d035248 100644 --- a/test/mpi_dec_test.c +++ b/test/mpi_dec_test.c @@ -206,7 +206,7 @@ static int dec_simple(MpiDecLoopData *data) if (NULL == data->frm_grp) { /* 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) { mpp_err("%p get mpp buffer group failed ret %d\n", ctx, ret); break; @@ -580,7 +580,7 @@ int dec_decode(MpiDecTestCmd *cmd) RK_U32 hor_stride = MPP_ALIGN(width, 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) { mpp_err("failed to get buffer group for input frame ret %d\n", ret); goto MPP_TEST_OUT;