[FFmpeg-cvslog] libstagefright: limit the output queue size
Mohamed Naufal
git at videolan.org
Fri Oct 7 15:38:33 CEST 2011
ffmpeg | branch: master | Mohamed Naufal <naufal22 at gmail.com> | Fri Oct 7 17:39:09 2011 +0530| [295f13953dc57be8c2ad7e41f6254d0a036582a8] | committer: Mohamed Naufal
libstagefright: limit the output queue size
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=295f13953dc57be8c2ad7e41f6254d0a036582a8
---
libavcodec/libstagefright.cpp | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/libavcodec/libstagefright.cpp b/libavcodec/libstagefright.cpp
index 7f3b785..1f8bdc4 100644
--- a/libavcodec/libstagefright.cpp
+++ b/libavcodec/libstagefright.cpp
@@ -174,7 +174,15 @@ void* decode_thread(void *arg)
decode_done = 1;
}
}
- pthread_mutex_lock(&s->out_mutex);
+ while (true) {
+ pthread_mutex_lock(&s->out_mutex);
+ if (s->out_queue->size() >= 10) {
+ pthread_mutex_unlock(&s->out_mutex);
+ usleep(10000);
+ continue;
+ }
+ break;
+ }
s->out_queue->push_back(frame);
pthread_mutex_unlock(&s->out_mutex);
} while (!decode_done && !s->stop_decode);
@@ -435,6 +443,17 @@ static av_cold int Stagefright_close(AVCodecContext *avctx)
if (!s->thread_exited) {
s->stop_decode = 1;
+ // Make sure decode_thread() doesn't get stuck
+ pthread_mutex_lock(&s->out_mutex);
+ while (!s->out_queue->empty()) {
+ frame = *s->out_queue->begin();
+ s->out_queue->erase(s->out_queue->begin());
+ if (frame->size)
+ frame->mbuffer->release();
+ av_freep(&frame);
+ }
+ pthread_mutex_unlock(&s->out_mutex);
+
// Feed a dummy frame prior to signalling EOF.
// This is required to terminate the decoder(OMX.SEC)
// when only one frame is read during stream info detection.
More information about the ffmpeg-cvslog
mailing list