summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorJan Schmidt <thaytan@noraisin.net>2009-05-22 13:07:38 +0100
committerJan Schmidt <thaytan@noraisin.net>2009-05-26 15:31:51 +0100
commita7cd4b03ad403bb49ac217887544451edcdbc59d (patch)
tree0d0663fcd20d3f168f8251298968d228a5f13f9f /gst
parent707eaf7684a5da186448f99e36174801d185ef36 (diff)
downloadgst-plugins-bad-a7cd4b03ad403bb49ac217887544451edcdbc59d.tar.gz
gst-plugins-bad-a7cd4b03ad403bb49ac217887544451edcdbc59d.tar.bz2
gst-plugins-bad-a7cd4b03ad403bb49ac217887544451edcdbc59d.zip
dvdspu: Don't accidentally lose the colour palette when flushing the SPU
Fixes racy startup on DVDs where it sometimes gets entirely the wrong set of colours in the menus and subtitles.
Diffstat (limited to 'gst')
-rw-r--r--gst/dvdspu/gstdvdspu.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c
index 703c405b..dc606d21 100644
--- a/gst/dvdspu/gstdvdspu.c
+++ b/gst/dvdspu/gstdvdspu.c
@@ -101,10 +101,12 @@ static GstFlowReturn gst_dvd_spu_subpic_chain (GstPad * pad, GstBuffer * buf);
static gboolean gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event);
static void gst_dvd_spu_clear (GstDVDSpu * dvdspu);
-static void gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu);
+static void gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu,
+ gboolean process_events);
static void gst_dvd_spu_advance_spu (GstDVDSpu * dvdspu, GstClockTime new_ts);
static GstFlowReturn
dvdspu_handle_vid_buffer (GstDVDSpu * dvdspu, GstBuffer * buf);
+static void gst_dvd_spu_handle_dvd_event (GstDVDSpu * dvdspu, GstEvent * event);
static void
gst_dvd_spu_base_init (gpointer gclass)
@@ -179,7 +181,8 @@ gst_dvd_spu_init (GstDVDSpu * dvdspu, GstDVDSpuClass * gclass)
static void
gst_dvd_spu_clear (GstDVDSpu * dvdspu)
{
- gst_dvd_spu_flush_spu_info (dvdspu);
+ gst_dvd_spu_flush_spu_info (dvdspu, FALSE);
+ gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
gst_buffer_replace (&dvdspu->ref_frame, NULL);
gst_buffer_replace (&dvdspu->pending_frame, NULL);
@@ -223,15 +226,13 @@ gst_dvd_spu_finalize (GObject * object)
/* With SPU lock held, clear the queue of SPU packets */
static void
-gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu)
+gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu, gboolean process_events)
{
SpuPacket *packet;
SpuState *state = &dvdspu->spu_state;
GST_INFO_OBJECT (dvdspu, "Flushing SPU information");
- gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
-
if (dvdspu->partial_spu) {
gst_buffer_unref (dvdspu->partial_spu);
dvdspu->partial_spu = NULL;
@@ -239,10 +240,15 @@ gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu)
packet = (SpuPacket *) g_queue_pop_head (dvdspu->pending_spus);
while (packet != NULL) {
- if (packet->buf)
+ if (packet->buf) {
gst_buffer_unref (packet->buf);
- if (packet->event)
- gst_event_unref (packet->event);
+ g_assert (packet->event == NULL);
+ } else if (packet->event) {
+ if (process_events)
+ gst_dvd_spu_handle_dvd_event (dvdspu, packet->event);
+ else
+ gst_event_unref (packet->event);
+ }
g_free (packet);
packet = (SpuPacket *) g_queue_pop_head (dvdspu->pending_spus);
}
@@ -1386,7 +1392,8 @@ gst_dvd_spu_subpic_event (GstPad * pad, GstEvent * event)
goto done;
case GST_EVENT_FLUSH_STOP:
DVD_SPU_LOCK (dvdspu);
- gst_dvd_spu_flush_spu_info (dvdspu);
+ gst_segment_init (&dvdspu->subp_seg, GST_FORMAT_UNDEFINED);
+ gst_dvd_spu_flush_spu_info (dvdspu, TRUE);
DVD_SPU_UNLOCK (dvdspu);
/* We don't forward flushes on the spu pad */