+static int
+evas_image_sink_event_parse_data (GstEvasImageSink *esink, GstEvent *event)
+{
+ const GstStructure *st;
+ guint st_data_addr = 0;
+ gint st_data_width = 0;
+ gint st_data_height = 0;
+
+ g_return_val_if_fail (event != NULL, FALSE);
+ g_return_val_if_fail (esink != NULL, FALSE);
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_CUSTOM_DOWNSTREAM_OOB) {
+ GST_WARNING ("it's not a custom downstream oob event");
+ return -1;
+ }
+ st = gst_event_get_structure (event);
+ if (st == NULL || !gst_structure_has_name (st, "GstStructureForCustomEvent")) {
+ GST_WARNING ("structure in a given event is not proper");
+ return -1;
+ }
+ if (!gst_structure_get_uint (st, "data-addr", &st_data_addr)) {
+ GST_WARNING ("parsing data-addr failed");
+ return -1;
+ }
+ esink->present_data_addr = st_data_addr;
+
+ return 0;
+}
+
+static gboolean
+gst_evas_image_sink_event (GstBaseSink *sink, GstEvent *event)
+{
+ GstEvasImageSink *esink = GST_EVASIMAGESINK (sink);
+ GstMessage *msg;
+ gchar *str;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ GST_DEBUG ("GST_EVENT_FLUSH_START");
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG ("GST_EVENT_FLUSH_STOP");
+ break;
+ case GST_EVENT_EOS:
+ GST_DEBUG ("GST_EVENT_EOS");
+ break;
+ case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
+ if(!evas_image_sink_event_parse_data(esink, event)) {
+ GST_DEBUG ("GST_EVENT_CUSTOM_DOWNSTREAM_OOB, present_data_addr:%x",esink->present_data_addr);
+ } else {
+ GST_ERROR ("evas_image_sink_event_parse_data() failed");
+ }
+ break;
+ default:
+ break;
+ }
+ if (GST_BASE_SINK_CLASS (parent_class)->event) {
+ return GST_BASE_SINK_CLASS (parent_class)->event (sink, event);
+ } else {
+ return TRUE;
+ }
+}
+
+static GstStateChangeReturn
+gst_evas_image_sink_change_state (GstElement *element, GstStateChange transition)
+{
+ GstStateChangeReturn ret_state = GST_STATE_CHANGE_SUCCESS;
+ GstEvasImageSink *esink = NULL;
+ esink = GST_EVASIMAGESINK(element);
+ int ret = 0;
+
+ if(!esink) {
+ GST_ERROR("can not get evasimagesink from element");
+ }
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_INFO ("*** STATE_CHANGE_NULL_TO_READY ***");
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_INFO ("*** STATE_CHANGE_READY_TO_PAUSED ***");
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_INFO ("*** STATE_CHANGE_PAUSED_TO_PLAYING ***");
+ break;
+ default:
+ break;
+ }
+
+ ret_state = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_INFO ("*** STATE_CHANGE_PLAYING_TO_PAUSED ***");
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_INFO ("*** STATE_CHANGE_PAUSED_TO_READY ***");
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_INFO ("*** STATE_CHANGE_READY_TO_NULL ***");
+ evas_object_event_callback_del(esink->eo, EVAS_CALLBACK_DEL, evas_image_sink_cb_del_eo);
+ evas_object_event_callback_del(esink->eo, EVAS_CALLBACK_RESIZE, evas_image_sink_cb_resize_event);
+ if (esink->epipe) {
+ ecore_pipe_del (esink->epipe);
+ esink->epipe = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret_state;
+}
+