static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlxDec *flxdec; gboolean ret; flxdec = GST_FLXDEC (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: { GstSegment segment; gst_event_copy_segment (event, &segment); if (segment.format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (flxdec, "generating TIME segment"); gst_segment_init (&segment, GST_FORMAT_TIME); gst_event_unref (event); event = gst_event_new_segment (&segment); } /* fall-through */ } default: ret = gst_pad_event_default (pad, parent, event); break; } return ret; }
static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstEvent * event) { GstFlxDec *flxdec; gboolean ret; flxdec = GST_FLXDEC (gst_pad_get_parent (pad)); ret = gst_pad_push_event (flxdec->srcpad, event); gst_object_unref (flxdec); return ret; }
static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, GstStateChange transition) { GstFlxDec *flxdec; GstStateChangeReturn ret; flxdec = GST_FLXDEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (flxdec->adapter); flxdec->state = GST_FLXDEC_READ_HEADER; gst_segment_init (&flxdec->segment, GST_FORMAT_UNDEFINED); flxdec->need_segment = TRUE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (flxdec->frame_data) { g_free (flxdec->frame_data); flxdec->frame_data = NULL; } if (flxdec->delta_data) { g_free (flxdec->delta_data); flxdec->delta_data = NULL; } if (flxdec->converter) { flx_colorspace_converter_destroy (flxdec->converter); flxdec->converter = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static GstStateChangeReturn gst_flxdec_change_state (GstElement * element, GstStateChange transition) { GstFlxDec *flxdec; GstStateChangeReturn ret; flxdec = GST_FLXDEC (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (flxdec->adapter); flxdec->state = GST_FLXDEC_READ_HEADER; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (flxdec->frame) { gst_buffer_unref (flxdec->frame); flxdec->frame = NULL; } if (flxdec->delta) { gst_buffer_unref (flxdec->delta); flxdec->delta = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static gboolean gst_flxdec_sink_event_handler (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlxDec *flxdec; gboolean ret; flxdec = GST_FLXDEC (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: { gst_event_copy_segment (event, &flxdec->segment); if (flxdec->segment.format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (flxdec, "generating TIME segment"); gst_segment_init (&flxdec->segment, GST_FORMAT_TIME); gst_event_unref (event); event = gst_event_new_segment (&flxdec->segment); } if (gst_pad_has_current_caps (flxdec->srcpad)) { ret = gst_pad_event_default (pad, parent, event); } else { flxdec->need_segment = TRUE; gst_event_unref (event); ret = TRUE; } break; } case GST_EVENT_FLUSH_STOP: gst_segment_init (&flxdec->segment, GST_FORMAT_UNDEFINED); ret = gst_pad_event_default (pad, parent, event); break; default: ret = gst_pad_event_default (pad, parent, event); break; } return ret; }