mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-24 17:40:21 +08:00
[mpp_enc]: fix task leak in async encoder mode
git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@1065 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
@@ -281,6 +281,8 @@ MPP_RET mpp_task_queue_deinit(MppTaskQueue queue)
|
|||||||
}
|
}
|
||||||
if (p->tasks) {
|
if (p->tasks) {
|
||||||
for (RK_S32 i = 0; i < p->task_count; i++) {
|
for (RK_S32 i = 0; i < p->task_count; i++) {
|
||||||
|
/* we must ensure that all task return to init status */
|
||||||
|
mpp_assert(p->tasks[i].status == MPP_INPUT_PORT);
|
||||||
mpp_meta_put(p->tasks[i].meta);
|
mpp_meta_put(p->tasks[i].meta);
|
||||||
}
|
}
|
||||||
mpp_free(p->tasks);
|
mpp_free(p->tasks);
|
||||||
|
|||||||
@@ -28,6 +28,38 @@
|
|||||||
#include "mpp_packet_impl.h"
|
#include "mpp_packet_impl.h"
|
||||||
#include "hal_h264e_api.h"
|
#include "hal_h264e_api.h"
|
||||||
|
|
||||||
|
static MPP_RET release_task_in_port(MppPort output)
|
||||||
|
{
|
||||||
|
MPP_RET ret = MPP_OK;
|
||||||
|
MppPacket packet = NULL;
|
||||||
|
MppFrame frame = NULL;
|
||||||
|
MppTask mpp_task;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ret = mpp_port_dequeue(output, &mpp_task);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (mpp_task) {
|
||||||
|
packet = NULL;
|
||||||
|
frame = NULL;
|
||||||
|
mpp_task_meta_get_frame (mpp_task, MPP_META_KEY_INPUT_FRM, &frame);
|
||||||
|
if (frame) {
|
||||||
|
mpp_frame_deinit(&frame);
|
||||||
|
frame = NULL;
|
||||||
|
}
|
||||||
|
mpp_task_meta_get_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet);
|
||||||
|
if (packet) {
|
||||||
|
mpp_frame_deinit(&packet);
|
||||||
|
packet = NULL;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void *mpp_enc_control_thread(void *data)
|
void *mpp_enc_control_thread(void *data)
|
||||||
{
|
{
|
||||||
Mpp *mpp = (Mpp*)data;
|
Mpp *mpp = (Mpp*)data;
|
||||||
@@ -39,6 +71,8 @@ void *mpp_enc_control_thread(void *data)
|
|||||||
MppPort output = mpp_task_queue_get_port(mpp->mOutputTaskQueue, MPP_PORT_INPUT);
|
MppPort output = mpp_task_queue_get_port(mpp->mOutputTaskQueue, MPP_PORT_INPUT);
|
||||||
MppTask mpp_task = NULL;
|
MppTask mpp_task = NULL;
|
||||||
MPP_RET ret = MPP_OK;
|
MPP_RET ret = MPP_OK;
|
||||||
|
MppFrame frame = NULL;
|
||||||
|
MppPacket packet = NULL;
|
||||||
|
|
||||||
memset(&task_info, 0, sizeof(HalTaskInfo));
|
memset(&task_info, 0, sizeof(HalTaskInfo));
|
||||||
|
|
||||||
@@ -51,9 +85,6 @@ void *mpp_enc_control_thread(void *data)
|
|||||||
thd_enc->unlock();
|
thd_enc->unlock();
|
||||||
|
|
||||||
if (mpp_task != NULL) {
|
if (mpp_task != NULL) {
|
||||||
MppFrame frame = NULL;
|
|
||||||
MppPacket packet = NULL;
|
|
||||||
|
|
||||||
mpp_task_meta_get_frame (mpp_task, MPP_META_KEY_INPUT_FRM, &frame);
|
mpp_task_meta_get_frame (mpp_task, MPP_META_KEY_INPUT_FRM, &frame);
|
||||||
mpp_task_meta_get_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet);
|
mpp_task_meta_get_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet);
|
||||||
|
|
||||||
@@ -125,8 +156,15 @@ void *mpp_enc_control_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;
|
||||||
|
frame = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clear remain task in output port
|
||||||
|
release_task_in_port(input);
|
||||||
|
release_task_in_port(mpp->mOutputPort);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user