From 8acffd0c9b4f5cd08e1ff306f204c1f2a864a583 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Wed, 5 Jan 2011 19:32:47 +0200 Subject: [PATCH] Fix render picture out-of-memory handling --- src/video_output/video_output.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index b8d7ced199..9c1150c42b 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -912,6 +912,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) if (filtered && (vout->p->decoder_pool != vout->p->display_pool || subpic)) { picture_t *render; + if (vout->p->is_decoder_pool_slow) render = picture_NewFromFormat(&vd->source); else if (vout->p->decoder_pool != vout->p->display_pool) @@ -919,17 +920,24 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) else render = picture_pool_Get(vout->p->private_pool); - if (render) { - picture_Copy(render, filtered); - - spu_RenderSubpictures(vout->p->spu, - render, &vd->source, - subpic, &vd->source, spu_render_time); + if (unlikely(render == NULL)) { + picture_Release(filtered); + return VLC_EGENERIC; } + + picture_Copy(render, filtered); + spu_RenderSubpictures(vout->p->spu, + render, &vd->source, + subpic, &vd->source, spu_render_time); + if (vout->p->is_decoder_pool_slow) { direct = picture_pool_Get(vout->p->display_pool); - if (direct) - picture_Copy(direct, render); + if (unlikely(direct == NULL)) { + picture_Release(render); + picture_Release(filtered); + return VLC_EGENERIC; + } + picture_Copy(direct, render); picture_Release(render); } else { @@ -937,13 +945,12 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) } VideoFormatCopyCropAr(&direct->format, &filtered->format); picture_Release(filtered); - filtered = NULL; + } else { direct = filtered; } - if (!direct) - return VLC_EGENERIC; + assert (direct != NULL); /* * Take a snapshot if requested -- 2.39.5