diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2003-04-23 18:42:39 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2003-04-23 18:42:39 +0000 |
commit | 2ea50320a977043e1dbb61d7fa57f27325a23e4a (patch) | |
tree | 01dbc6fba77420bd0170f60cab980fa0c9d606ba | |
parent | 483bf72bb184a76990634051b6cb673c10eadcbf (diff) | |
download | xine-lib-2ea50320a977043e1dbb61d7fa57f27325a23e4a.tar.gz xine-lib-2ea50320a977043e1dbb61d7fa57f27325a23e4a.tar.bz2 |
ffmpeg buffer management is quite odd.
this hopefuly fixes problems with B frames and DR1
CVS patchset: 4666
CVS date: 2003/04/23 18:42:39
-rw-r--r-- | src/libffmpeg/xine_decoder.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/libffmpeg/xine_decoder.c b/src/libffmpeg/xine_decoder.c index fd386fbee..647c160b4 100644 --- a/src/libffmpeg/xine_decoder.c +++ b/src/libffmpeg/xine_decoder.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xine_decoder.c,v 1.113 2003/04/18 20:45:30 tmmm Exp $ + * $Id: xine_decoder.c,v 1.114 2003/04/23 18:42:39 miguelfreitas Exp $ * * xine decoder plugin using ffmpeg * @@ -167,6 +167,12 @@ static int get_buffer(AVCodecContext *context, AVFrame *av_frame){ this->output_format, VO_BOTH_FIELDS); + /* use drawn as a decoder flag. + * if true: free this frame on release_buffer. + * if false: free this frame after drawing it. + */ + img->drawn = av_frame->reference; + av_frame->opaque = img; av_frame->data[0]= img->base[0]; @@ -197,7 +203,8 @@ static void release_buffer(struct AVCodecContext *context, AVFrame *av_frame){ av_frame->data[1]= NULL; av_frame->data[2]= NULL; - img->free(img); + if(img->drawn) + img->free(img); av_frame->opaque = NULL; } @@ -783,8 +790,9 @@ static void ff_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { offset += len; if (!got_picture || !this->av_frame->data[0]) { - printf ("ffmpeg: didn't get a picture, got %d bytes left\n", - this->size); + if (this->stream->xine->verbosity >= XINE_VERBOSITY_LOG) + printf ("ffmpeg: didn't get a picture, got %d bytes left\n", + this->size); if (this->size>0) memmove (this->buf, &this->buf[offset], this->size); @@ -835,7 +843,7 @@ static void ff_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { if(this->av_frame->type == FF_BUFFER_TYPE_USER){ img = (vo_frame_t*)this->av_frame->opaque; - free_img = 0; + free_img = !img->drawn; } else { img = this->stream->video_out->get_frame (this->stream->video_out, this->context->width, @@ -857,6 +865,9 @@ static void ff_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { if(this->pp_available && this->pp_quality) { if(this->av_frame->type == FF_BUFFER_TYPE_USER) { + if(free_img) + img->free(img); + img = this->stream->video_out->get_frame (this->stream->video_out, this->context->width, this->context->height, |