From 6a884bf08d21921af5907249a72c9ea26e4fa8ea Mon Sep 17 00:00:00 2001 From: Arnaud Vrac Date: Thu, 31 Jan 2013 14:03:40 +0100 Subject: [PATCH] assrender: check video frame mapping succeeded before blending If the mapping fails just skip overlay rendering and push the video frame downstream. https://bugzilla.gnome.org/show_bug.cgi?id=753822 --- ext/assrender/gstassrender.c | 45 ++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c index 711ab04ea..2ff12e237 100644 --- a/ext/assrender/gstassrender.c +++ b/ext/assrender/gstassrender.c @@ -1056,6 +1056,35 @@ gst_ass_render_composite_overlay (GstAssRender * render, ASS_Image * images) return composition; } +static gboolean +gst_ass_render_push_frame (GstAssRender * render, GstBuffer * video_frame) +{ + GstVideoFrame frame; + + if (!render->composition) + goto done; + + video_frame = gst_buffer_make_writable (video_frame); + + if (render->attach_compo_to_buffer) { + gst_buffer_add_video_overlay_composition_meta (video_frame, + render->composition); + goto done; + } + + if (!gst_video_frame_map (&frame, &render->info, video_frame, + GST_MAP_READWRITE)) { + GST_WARNING_OBJECT (render, "failed to map video frame for blending"); + goto done; + } + + gst_video_overlay_composition_blend (render->composition, &frame); + gst_video_frame_unmap (&frame); + +done: + return gst_pad_push (render->srcpad, video_frame); +} + static GstFlowReturn gst_ass_render_chain_video (GstPad * pad, GstObject * parent, GstBuffer * buffer) @@ -1206,26 +1235,12 @@ wait_for_text_buf: if (!render->composition) render->composition = gst_ass_render_composite_overlay (render, ass_image); - - if (render->composition) { - buffer = gst_buffer_make_writable (buffer); - if (render->attach_compo_to_buffer) { - gst_buffer_add_video_overlay_composition_meta (buffer, - render->composition); - } else { - GstVideoFrame frame; - - gst_video_frame_map (&frame, &render->info, buffer, GST_MAP_WRITE); - gst_video_overlay_composition_blend (render->composition, &frame); - gst_video_frame_unmap (&frame); - } - } } else { GST_DEBUG_OBJECT (render, "nothing to render right now"); } /* Push the video frame */ - ret = gst_pad_push (render->srcpad, buffer); + ret = gst_ass_render_push_frame (render, buffer); if (text_running_time_end <= vid_running_time_end) { GST_ASS_RENDER_LOCK (render); -- 2.34.1