summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Vrac <avrac@freebox.fr>2013-01-31 14:03:40 +0100
committerSebastian Dröge <sebastian@centricular.com>2015-08-19 16:54:41 +0300
commit6a884bf08d21921af5907249a72c9ea26e4fa8ea (patch)
tree8c5c5d6c7901ba65835b5325bff59e6a4f95f35e
parent697f117ddda44d0386e46e082dbd6190d837db2a (diff)
downloadgstreamer-plugins-bad-6a884bf08d21921af5907249a72c9ea26e4fa8ea.tar.gz
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
-rw-r--r--ext/assrender/gstassrender.c45
1 files 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);