mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-09 02:50:06 +08:00
[mpp_enc]: fix memory leak and flow error in Android recording flow
git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@1068 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
@@ -316,6 +316,7 @@ static MPP_RET get_val_by_key(MppMetaImpl *meta, MppMetaKey key, MppMetaType typ
|
|||||||
MppMetaNode *node = service->find_node(meta, index);
|
MppMetaNode *node = service->find_node(meta, index);
|
||||||
if (node) {
|
if (node) {
|
||||||
*val = node->val;
|
*val = node->val;
|
||||||
|
service->put_node(node);
|
||||||
ret = MPP_OK;
|
ret = MPP_OK;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -282,7 +282,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 */
|
/* we must ensure that all task return to init status */
|
||||||
mpp_assert(p->tasks[i].status == MPP_INPUT_PORT);
|
mpp_assert(p->tasks[i].status == MPP_INPUT_PORT ||
|
||||||
|
p->tasks[i].status == MPP_INPUT_HOLD);
|
||||||
mpp_meta_put(p->tasks[i].meta);
|
mpp_meta_put(p->tasks[i].meta);
|
||||||
}
|
}
|
||||||
mpp_free(p->tasks);
|
mpp_free(p->tasks);
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
#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)
|
static MPP_RET release_task_in_port(MppPort port)
|
||||||
{
|
{
|
||||||
MPP_RET ret = MPP_OK;
|
MPP_RET ret = MPP_OK;
|
||||||
MppPacket packet = NULL;
|
MppPacket packet = NULL;
|
||||||
@@ -36,23 +36,26 @@ static MPP_RET release_task_in_port(MppPort output)
|
|||||||
MppTask mpp_task;
|
MppTask mpp_task;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = mpp_port_dequeue(output, &mpp_task);
|
ret = mpp_port_dequeue(port, &mpp_task);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (mpp_task) {
|
if (mpp_task) {
|
||||||
packet = NULL;
|
packet = NULL;
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
mpp_task_meta_get_frame (mpp_task, MPP_META_KEY_INPUT_FRM, &frame);
|
ret = mpp_task_meta_get_frame(mpp_task, MPP_META_KEY_INPUT_FRM, &frame);
|
||||||
if (frame) {
|
if (frame) {
|
||||||
mpp_frame_deinit(&frame);
|
mpp_frame_deinit(&frame);
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
}
|
}
|
||||||
mpp_task_meta_get_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet);
|
ret = mpp_task_meta_get_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, &packet);
|
||||||
if (packet) {
|
if (packet) {
|
||||||
mpp_frame_deinit(&packet);
|
mpp_packet_deinit(&packet);
|
||||||
packet = NULL;
|
packet = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpp_port_enqueue(port, mpp_task);
|
||||||
|
mpp_task = NULL;
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
} while (1);
|
} while (1);
|
||||||
@@ -134,13 +137,17 @@ void *mpp_enc_control_thread(void *data)
|
|||||||
if (mpp_frame_get_eos(frame))
|
if (mpp_frame_get_eos(frame))
|
||||||
mpp_packet_set_eos(packet);
|
mpp_packet_set_eos(packet);
|
||||||
|
|
||||||
// enqueue task back to input input
|
/*
|
||||||
|
* first clear output packet
|
||||||
|
* then enqueue task back to input port
|
||||||
|
* final user will release the mpp_frame they had input
|
||||||
|
*/
|
||||||
|
mpp_task_meta_set_frame(mpp_task, MPP_META_KEY_INPUT_FRM, frame);
|
||||||
mpp_port_enqueue(input, mpp_task);
|
mpp_port_enqueue(input, mpp_task);
|
||||||
mpp_task = NULL;
|
mpp_task = NULL;
|
||||||
|
|
||||||
// send finished task to output port
|
// send finished task to output port
|
||||||
mpp_port_dequeue(output, &mpp_task);
|
mpp_port_dequeue(output, &mpp_task);
|
||||||
mpp_task_meta_set_frame(mpp_task, MPP_META_KEY_INPUT_FRM, frame);
|
|
||||||
mpp_task_meta_set_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, packet);
|
mpp_task_meta_set_packet(mpp_task, MPP_META_KEY_OUTPUT_PKT, packet);
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -162,6 +169,7 @@ void *mpp_enc_control_thread(void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// clear remain task in output port
|
// clear remain task in output port
|
||||||
|
release_task_in_port(mpp->mInputPort);
|
||||||
release_task_in_port(input);
|
release_task_in_port(input);
|
||||||
release_task_in_port(mpp->mOutputPort);
|
release_task_in_port(mpp->mOutputPort);
|
||||||
|
|
||||||
|
25
mpp/mpp.cpp
25
mpp/mpp.cpp
@@ -60,6 +60,7 @@ Mpp::Mpp()
|
|||||||
mInputBlock(0),
|
mInputBlock(0),
|
||||||
mOutputBlock(0),
|
mOutputBlock(0),
|
||||||
mMultiFrame(0),
|
mMultiFrame(0),
|
||||||
|
mInputTask(NULL),
|
||||||
mStatus(0),
|
mStatus(0),
|
||||||
mParserFastMode(0),
|
mParserFastMode(0),
|
||||||
mParserNeedSplit(0),
|
mParserNeedSplit(0),
|
||||||
@@ -282,7 +283,7 @@ MPP_RET Mpp::put_frame(MppFrame frame)
|
|||||||
return MPP_NOK;
|
return MPP_NOK;
|
||||||
|
|
||||||
MPP_RET ret = MPP_NOK;
|
MPP_RET ret = MPP_NOK;
|
||||||
MppTask task = NULL;
|
MppTask task = mInputTask;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (NULL == task) {
|
if (NULL == task) {
|
||||||
@@ -317,11 +318,26 @@ MPP_RET Mpp::put_frame(MppFrame frame)
|
|||||||
while (MPP_NOK == mpp_port_can_dequeue(mInputPort)) {
|
while (MPP_NOK == mpp_port_can_dequeue(mInputPort)) {
|
||||||
msleep(2);
|
msleep(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = dequeue(MPP_PORT_INPUT, &task);
|
||||||
|
if (ret) {
|
||||||
|
mpp_log_f("failed to dequeue from input port ret %d\n", ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpp_assert(task);
|
||||||
|
ret = mpp_task_meta_get_frame(task, MPP_META_KEY_INPUT_FRM, &frame);
|
||||||
|
if (frame) {
|
||||||
|
mpp_frame_deinit(&frame);
|
||||||
|
frame = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
|
mInputTask = task;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +348,6 @@ MPP_RET Mpp::get_packet(MppPacket *packet)
|
|||||||
|
|
||||||
MPP_RET ret = MPP_OK;
|
MPP_RET ret = MPP_OK;
|
||||||
MppTask task = NULL;
|
MppTask task = NULL;
|
||||||
MppFrame frame = NULL;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (NULL == task) {
|
if (NULL == task) {
|
||||||
@@ -355,12 +370,6 @@ MPP_RET Mpp::get_packet(MppPacket *packet)
|
|||||||
|
|
||||||
mpp_assert(task);
|
mpp_assert(task);
|
||||||
|
|
||||||
mpp_task_meta_get_frame(task, MPP_META_KEY_INPUT_FRM, &frame);
|
|
||||||
if (frame) {
|
|
||||||
mpp_frame_deinit(&frame);
|
|
||||||
frame = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = mpp_task_meta_get_packet(task, MPP_META_KEY_OUTPUT_PKT, packet);
|
ret = mpp_task_meta_get_packet(task, MPP_META_KEY_OUTPUT_PKT, packet);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mpp_log_f("failed to get output packet from task ret %d\n", ret);
|
mpp_log_f("failed to get output packet from task ret %d\n", ret);
|
||||||
|
Reference in New Issue
Block a user