mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 17:16:50 +08:00
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:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
11
mpp/mpp.cpp
11
mpp/mpp.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user