}
static void
+gst_dvd_spu_reset_composition (GstDVDSpu * dvdspu)
+{
+ if (dvdspu->composition) {
+ gst_video_overlay_composition_unref (dvdspu->composition);
+ dvdspu->composition = NULL;
+ }
+}
+
+static void
gst_dvd_spu_clear (GstDVDSpu * dvdspu)
{
gst_dvd_spu_flush_spu_info (dvdspu, FALSE);
default:
break;
}
+
+ gst_dvd_spu_reset_composition (dvdspu);
}
static gboolean
GstVideoOverlayComposition *composition;
GstVideoFrame frame;
- composition = gstspu_render_composition (dvdspu);
- if (!composition)
- return;
+ if (!dvdspu->composition) {
+ dvdspu->composition = gstspu_render_composition (dvdspu);
+ if (!dvdspu->composition)
+ return;
+ }
+
+ composition = dvdspu->composition;
if (dvdspu->attach_compo_to_buffer) {
gst_buffer_add_video_overlay_composition_meta (buf, composition);
- goto done;
+ return;
}
if (!gst_video_frame_map (&frame, &dvdspu->spu_state.info, buf,
GST_MAP_READWRITE)) {
GST_WARNING_OBJECT (dvdspu, "failed to map video frame for blending");
- goto done;
+ return;
}
gst_video_overlay_composition_blend (composition, &frame);
gst_video_frame_unmap (&frame);
-
-done:
- gst_video_overlay_composition_unref (composition);
}
/* With SPU LOCK */
break;
}
+ if (hl_change)
+ gst_dvd_spu_reset_composition (dvdspu);
+
if (hl_change && (dvdspu->spu_state.flags & SPU_STATE_STILL_FRAME)) {
gst_dvd_spu_redraw_still (dvdspu, FALSE);
}
GST_TIME_ARGS (dvdspu->video_seg.position),
packet->buf ? "buffer" : "event");
+ gst_dvd_spu_reset_composition (dvdspu);
+
if (packet->buf) {
switch (dvdspu->spu_input_type) {
case SPU_INPUT_TYPE_VOBSUB:
GstCaps *caps;
gboolean attach = FALSE;
+ gst_dvd_spu_reset_composition (dvdspu);
+
GST_DEBUG_OBJECT (dvdspu, "performing negotiation");
caps = gst_pad_get_current_caps (dvdspu->srcpad);