diff options
author | Thibaut Mattern <tmattern@users.sourceforge.net> | 2006-09-18 18:51:08 +0000 |
---|---|---|
committer | Thibaut Mattern <tmattern@users.sourceforge.net> | 2006-09-18 18:51:08 +0000 |
commit | 46eb77a2fa44d3ffc0da7f2df4e3d3908316067b (patch) | |
tree | c43f0b408e61fe642253295ae39b03911164ca86 /src | |
parent | 809a64d5911496a24617e3158e719e93c161e582 (diff) | |
download | xine-lib-46eb77a2fa44d3ffc0da7f2df4e3d3908316067b.tar.gz xine-lib-46eb77a2fa44d3ffc0da7f2df4e3d3908316067b.tar.bz2 |
Always use our own get_buffer/release_buffer function.
Clean av_frame->data before calling avcodec_default_get_buffer.
Fixed problems with debug build.
CVS patchset: 8269
CVS date: 2006/09/18 18:51:08
Diffstat (limited to 'src')
-rw-r--r-- | src/libffmpeg/video_decoder.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/libffmpeg/video_decoder.c b/src/libffmpeg/video_decoder.c index 7505dbd22..95fb26389 100644 --- a/src/libffmpeg/video_decoder.c +++ b/src/libffmpeg/video_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: video_decoder.c,v 1.61 2006/08/02 07:15:27 tmmm Exp $ + * $Id: video_decoder.c,v 1.62 2006/09/18 18:51:08 tmattern Exp $ * * xine video decoder plugin using ffmpeg * @@ -113,6 +113,8 @@ struct ff_video_decoder_s { int yuv_init; int cs_convert_init; + int is_direct_rendering_disabled; + AVPaletteControl palette_control; }; @@ -146,11 +148,15 @@ static int get_buffer(AVCodecContext *context, AVFrame *av_frame){ avcodec_align_dimensions(context, &width, &height); if( this->context->pix_fmt != PIX_FMT_YUV420P ) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _("ffmpeg_video_dec: unsupported frame format, DR1 disabled.\n")); + if (!this->is_direct_rendering_disabled) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _("ffmpeg_video_dec: unsupported frame format, DR1 disabled.\n")); + this->is_direct_rendering_disabled = 1; + } - this->context->get_buffer = avcodec_default_get_buffer; - this->context->release_buffer = avcodec_default_release_buffer; + av_frame->data[0]= NULL; + av_frame->data[1]= NULL; + av_frame->data[2]= NULL; return avcodec_default_get_buffer(context, av_frame); } @@ -159,11 +165,11 @@ static int get_buffer(AVCodecContext *context, AVFrame *av_frame){ this->crop_right = width - this->bih.biWidth; this->crop_bottom = height - this->bih.biHeight; } else { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _("ffmpeg_video_dec: unsupported frame dimensions, DR1 disabled.\n")); - - this->context->get_buffer = avcodec_default_get_buffer; - this->context->release_buffer = avcodec_default_release_buffer; + if (!this->is_direct_rendering_disabled) { + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, + _("ffmpeg_video_dec: unsupported frame dimensions, DR1 disabled.\n")); + this->is_direct_rendering_disabled = 1; + } return avcodec_default_get_buffer(context, av_frame); } } @@ -196,18 +202,20 @@ static int get_buffer(AVCodecContext *context, AVFrame *av_frame){ } static void release_buffer(struct AVCodecContext *context, AVFrame *av_frame){ - vo_frame_t *img = (vo_frame_t *)av_frame->opaque; + + if (av_frame->type == FF_BUFFER_TYPE_USER) { + vo_frame_t *img = (vo_frame_t *)av_frame->opaque; - assert(av_frame->type == FF_BUFFER_TYPE_USER); - assert(av_frame->opaque); - + assert(av_frame->opaque); + img->free(img); + } else { + avcodec_default_release_buffer(context, av_frame); + } + + av_frame->opaque = NULL; av_frame->data[0]= NULL; av_frame->data[1]= NULL; av_frame->data[2]= NULL; - - img->free(img); - - av_frame->opaque = NULL; } #endif |