summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdgar Hucek <ebsi4711@gmail.com>2012-01-31 14:10:23 +0100
committerEdgar Hucek <ebsi4711@gmail.com>2012-01-31 14:10:23 +0100
commit01062a87c0acfe71f6f5be14dbeb9e0ab66ca7f0 (patch)
treed3feee8c7056fb457afc7fdf3a47678a52768ca6
parentae57a6300677788caeb8dd2b008258b91fe16c47 (diff)
downloadxine-lib-01062a87c0acfe71f6f5be14dbeb9e0ab66ca7f0.tar.gz
xine-lib-01062a87c0acfe71f6f5be14dbeb9e0ab66ca7f0.tar.bz2
frame garbage collector in ff_reset
-rw-r--r--src/combined/ffmpeg/ff_video_decoder.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/combined/ffmpeg/ff_video_decoder.c b/src/combined/ffmpeg/ff_video_decoder.c
index 90eeadffe..ecfa0a88a 100644
--- a/src/combined/ffmpeg/ff_video_decoder.c
+++ b/src/combined/ffmpeg/ff_video_decoder.c
@@ -1647,8 +1647,22 @@ static void ff_reset (video_decoder_t *this_gen) {
this->size = 0;
if(this->context && this->decoder_ok)
+ {
+ xine_list_iterator_t it;
+ AVFrame *av_frame;
+
avcodec_flush_buffers(this->context);
+ /* frame garbage collector here - workaround for buggy ffmpeg codecs that
+ * don't release their DR1 frames */
+ while( (it = xine_list_front(this->dr1_frames)) != NULL )
+ {
+ av_frame = (AVFrame *)xine_list_get_value(this->dr1_frames, it);
+ release_buffer(this->context, av_frame);
+ }
+ xine_list_clear(this->dr1_frames);
+ }
+
if (this->is_mpeg12)
mpeg_parser_reset(this->mpeg_parser);