提交 ea7409ca 编写于 作者: Z Zhang Rui

ff_ffplay: recycle message to reduce memory allocation

上级 32c4ba71
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include "ff_ffinc.h" #include "ff_ffinc.h"
#include "ff_ffmsg.h" #include "ff_ffmsg.h"
// #define FFP_SHOW_MSG_RECYCLE
typedef struct AVMessage { typedef struct AVMessage {
int what; int what;
int arg1; int arg1;
...@@ -40,6 +42,10 @@ typedef struct MessageQueue { ...@@ -40,6 +42,10 @@ typedef struct MessageQueue {
int abort_request; int abort_request;
SDL_mutex *mutex; SDL_mutex *mutex;
SDL_cond *cond; SDL_cond *cond;
AVMessage *recycle_msg;
int recycle_count;
int alloc_count;
} MessageQueue; } MessageQueue;
// TODO: 9 msg pool // TODO: 9 msg pool
...@@ -50,9 +56,27 @@ inline static int msg_queue_put_private(MessageQueue *q, AVMessage *msg) ...@@ -50,9 +56,27 @@ inline static int msg_queue_put_private(MessageQueue *q, AVMessage *msg)
if (q->abort_request) if (q->abort_request)
return -1; return -1;
#ifdef FFP_MERGE
msg1 = av_malloc(sizeof(AVMessage));
#else
msg1 = q->recycle_msg;
if (msg1) {
q->recycle_msg = msg1->next;
q->recycle_count++;
} else {
q->alloc_count++;
msg1 = av_malloc(sizeof(AVMessage)); msg1 = av_malloc(sizeof(AVMessage));
}
#ifdef FFP_SHOW_MSG_RECYCLE
int total_count = q->recycle_count + q->alloc_count;
if (!(total_count % 50)) {
ALOGE("msg-recycle \t%d + \t%d = \t%d\n", q->recycle_count, q->alloc_count, total_count);
}
#endif
#endif
if (!msg1) if (!msg1)
return -1; return -1;
*msg1 = *msg; *msg1 = *msg;
msg1->next = NULL; msg1->next = NULL;
...@@ -124,7 +148,12 @@ inline static void msg_queue_flush(MessageQueue *q) ...@@ -124,7 +148,12 @@ inline static void msg_queue_flush(MessageQueue *q)
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
for (msg = q->first_msg; msg != NULL; msg = msg1) { for (msg = q->first_msg; msg != NULL; msg = msg1) {
msg1 = msg->next; msg1 = msg->next;
#ifdef FFP_MERGE
av_freep(&msg); av_freep(&msg);
#else
msg->next = q->recycle_msg;
q->recycle_msg = msg;
#endif
} }
q->last_msg = NULL; q->last_msg = NULL;
q->first_msg = NULL; q->first_msg = NULL;
...@@ -137,6 +166,15 @@ inline static void msg_queue_destroy(MessageQueue *q) ...@@ -137,6 +166,15 @@ inline static void msg_queue_destroy(MessageQueue *q)
msg_queue_flush(q); msg_queue_flush(q);
SDL_DestroyMutex(q->mutex); SDL_DestroyMutex(q->mutex);
SDL_DestroyCond(q->cond); SDL_DestroyCond(q->cond);
SDL_LockMutex(q->mutex);
while(q->recycle_msg) {
AVMessage *msg = q->recycle_msg;
if (msg)
q->recycle_msg = msg->next;
av_freep(&msg);
}
SDL_UnlockMutex(q->mutex);
} }
inline static void msg_queue_abort(MessageQueue *q) inline static void msg_queue_abort(MessageQueue *q)
...@@ -183,7 +221,12 @@ inline static int msg_queue_get(MessageQueue *q, AVMessage *msg, int block) ...@@ -183,7 +221,12 @@ inline static int msg_queue_get(MessageQueue *q, AVMessage *msg, int block)
q->last_msg = NULL; q->last_msg = NULL;
q->nb_messages--; q->nb_messages--;
*msg = *msg1; *msg = *msg1;
#ifdef FFP_MERGE
av_free(msg1); av_free(msg1);
#else
msg1->next = q->recycle_msg;
q->recycle_msg = msg1;
#endif
ret = 1; ret = 1;
break; break;
} else if (!block) { } else if (!block) {
...@@ -211,7 +254,12 @@ inline static void msg_queue_remove(MessageQueue *q, int what) ...@@ -211,7 +254,12 @@ inline static void msg_queue_remove(MessageQueue *q, int what)
// ALOGE("remove msg %d", msg->what); // ALOGE("remove msg %d", msg->what);
*p_msg = msg->next; *p_msg = msg->next;
p_msg = &msg->next; p_msg = &msg->next;
#ifdef FFP_MERGE
av_free(msg); av_free(msg);
#else
msg->next = q->recycle_msg;
q->recycle_msg = msg;
#endif
} else { } else {
// ALOGE("retain msg %d", msg->what); // ALOGE("retain msg %d", msg->what);
last_msg = msg; last_msg = msg;
......
...@@ -163,6 +163,10 @@ static void packet_queue_flush(PacketQueue *q) ...@@ -163,6 +163,10 @@ static void packet_queue_flush(PacketQueue *q)
static void packet_queue_destroy(PacketQueue *q) static void packet_queue_destroy(PacketQueue *q)
{ {
packet_queue_flush(q);
SDL_DestroyMutex(q->mutex);
SDL_DestroyCond(q->cond);
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
while(q->recycle_pkt) { while(q->recycle_pkt) {
MyAVPacketList *pkt = q->recycle_pkt; MyAVPacketList *pkt = q->recycle_pkt;
...@@ -171,10 +175,6 @@ static void packet_queue_destroy(PacketQueue *q) ...@@ -171,10 +175,6 @@ static void packet_queue_destroy(PacketQueue *q)
av_freep(&pkt); av_freep(&pkt);
} }
SDL_UnlockMutex(q->mutex); SDL_UnlockMutex(q->mutex);
packet_queue_flush(q);
SDL_DestroyMutex(q->mutex);
SDL_DestroyCond(q->cond);
} }
static void packet_queue_abort(PacketQueue *q) static void packet_queue_abort(PacketQueue *q)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册