From baf6eb9d893991c10dd825af1ec0c9792933d5f0 Mon Sep 17 00:00:00 2001 From: ChenHengming Date: Thu, 21 Jul 2016 11:20:45 +0000 Subject: [PATCH] [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 --- mpp/base/mpp_task_impl.cpp | 2 ++ mpp/codec/mpp_enc.cpp | 44 +++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/mpp/base/mpp_task_impl.cpp b/mpp/base/mpp_task_impl.cpp index bdd18d4b..08aafaa1 100644 --- a/mpp/base/mpp_task_impl.cpp +++ b/mpp/base/mpp_task_impl.cpp @@ -281,6 +281,8 @@ MPP_RET mpp_task_queue_deinit(MppTaskQueue queue) } if (p->tasks) { 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_free(p->tasks); diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index 62f27980..86e4b695 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -28,6 +28,38 @@ #include "mpp_packet_impl.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) { 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); MppTask mpp_task = NULL; MPP_RET ret = MPP_OK; + MppFrame frame = NULL; + MppPacket packet = NULL; memset(&task_info, 0, sizeof(HalTaskInfo)); @@ -51,9 +85,6 @@ void *mpp_enc_control_thread(void *data) thd_enc->unlock(); 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_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet); @@ -125,8 +156,15 @@ void *mpp_enc_control_thread(void *data) // setup output task here mpp_port_enqueue(output, mpp_task); 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; }