Change SEM data and parsing simply 13/213613/2
authorGilbok Lee <gilbok.lee@samsung.com>
Mon, 9 Sep 2019 07:05:33 +0000 (16:05 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 9 Sep 2019 07:08:54 +0000 (16:08 +0900)
Change-Id: I53d3ccab16cf86e100b819918cefc4e6cddb1063

include/rose_tizen_sem_parse.h
packaging/capi-media-rose-tizen.spec
src/rose_tizen_sem_parse.c

index 518a34d96a784f29f1da8522a024a7aa0a743e29..3cf70f81cd870bc72628ebc8d8f36887a5af6a4a 100644 (file)
@@ -26,35 +26,15 @@ extern "C" {
 #endif
 
 typedef struct _rose_sem_base_attr rose_sem_base_attr;
-typedef struct _rose_sem_adaptability_attr rose_sem_adaptability_attr;
 typedef struct _rose_sem rose_sem;
-typedef struct _rose_sem_any_attr_type rose_sem_any_attr_type;
 typedef struct _rose_sem_si_attr rose_sem_si_attr;
-typedef struct _rose_sem_any_attr rose_sem_any_attr;
-
-// TODO
-// typedef struct _rose_sem_desc_metadata rose_sem_desc_metadata;
-typedef struct _rose_sem_declarations rose_sem_declarations;
-typedef struct _rose_sem_group_effect rose_sem_group_effect;
 typedef struct _rose_sem_effect_base_type rose_sem_effect_base_type;
 typedef struct _rose_sem_effect rose_sem_effect;
-typedef struct _rose_sem_ref_effect rose_sem_ref_effect;
-typedef struct _rose_sem_parameter rose_sem_parameter;
-
-typedef struct _rose_sem_elements rose_sem_elements;
 typedef struct _rose_sem_effects rose_sem_effects;
 
 typedef struct _rose_sem_namespace rose_sem_namespace;
 
-typedef enum {
-       SEM_ELEMENT_NONE,
-       SEM_ELEMENT_DECLARATIONS,  /**< Declaration of sensory effects, group of sensory effects, or parameters */
-       SEM_ELEMENT_GROUP_EFFECTS, /**< Group of sensory effects */
-       SEM_ELEMENT_EFFECT,        /**< Sensory effect */
-       SEM_ELEMENT_REF_EFFECTS,   /**< Reference to a sensory effect, group of sensory effects, or parameter */
-       SEM_ELEMENT_PARAMETER,     /**< Parameter for a sensory effect */
-       SEM_ELEMENT_MAX,
-} rose_sem_element_type_e;
+typedef struct _rose_sem_effect_elements rose_sem_effect_elements;
 
 typedef enum {
        SEM_EFFECT_NONE,
@@ -66,25 +46,6 @@ typedef enum {
        SEM_EFFECT_MAX,
 } rose_sem_effect_type_e;
 
-typedef enum {
-       SEM_ADAPT_TYPE_NONE,
-       SEM_ADAPT_TYPE_STRICT,
-       SEM_ADAPT_TYPE_UNDER,
-       SEM_ADAPT_TYPE_OVER,
-       SEM_ADAPT_TYPE_BOTH,
-} rose_sem_adapt_type_e;
-
-typedef enum {
-       SEM_PU_MODE_NONE,
-       SEM_PU_MODE_SELF,
-       SEM_PU_MODE_ANCESTORS,
-       SEM_PU_MODE_DESCENDANTS,
-       SEM_PU_MODE_ANCESTORS_DESCENDANTS,
-       SEM_PU_MODE_PRECEDING,
-       SEM_PU_MODE_PRECEDING_SIBLINGS,
-       SEM_PU_MODE_SEQUENTIAL,
-} rose_sem_pu_mode_e;
-
 struct _rose_sem_base_attr {
        gboolean activate_flag;
        gboolean duration_flag;
@@ -99,42 +60,21 @@ struct _rose_sem_base_attr {
        gchar *alt;
        guint priority;
        gchar *location;
-       rose_sem_adaptability_attr *adat_attr;
-};
-
-struct _rose_sem_adaptability_attr {
-       gboolean adapt_type_flag;
-       gboolean adapt_range_flag;
-
-       rose_sem_adapt_type_e adapt_type;
-       /*min:0, max 100 */
-       guint adapt_range;
 };
 
 struct _rose_sem {
        gboolean time_scale_flag;
        guint time_scale;
-       /* Description metadata flag */
-       // gboolean desc_metadata_flag;
-       // rose_sem_desc_metadata *desc_metadata;
-       /* namespace list data is rose_sem_namespace struct */
        GList *namespace;
-       // rose_sem_desc_metadata *desc_metadata;
-       /* elements data is rose_sem_elements */
-       GList *elements;
-       rose_sem_any_attr_type *any_attr_type;
-};
-
-struct _rose_sem_any_attr_type {
-       gboolean any_attr_flag;
        rose_sem_si_attr *si_attr;
-       GList *any_attr;
+       /* effect_elements is rose_sem_effect_elements */
+       GList *effect_elements;
+
 };
 
 struct _rose_sem_si_attr {
        gboolean anchor_element_flag;
        gboolean encode_as_rap_flag;
-       gboolean pu_mode_flag;
        gboolean time_scale_flag;
        gboolean pts_delta_flag;
        gboolean abs_time_scheme_flag;
@@ -143,7 +83,6 @@ struct _rose_sem_si_attr {
 
        gboolean anchor_element;
        gboolean encode_as_rap;
-       rose_sem_pu_mode_e pu_mode;
        guint time_scale;
        guint pts_delta;
        gchar *abs_time_scheme;
@@ -151,45 +90,13 @@ struct _rose_sem_si_attr {
        guint pts;
 };
 
-struct _rose_sem_any_attr {
-       gchar *any_attr;
-};
-
-// TODO
-// struct _rose_sem_desc_metadata
-// {
-
-// };
-
-struct _rose_sem_declarations {
-       gchar *id;
-       /* restricted GroupEffects, Effect, Parameter */
-       GList *elements;
-};
-
-struct _rose_sem_elements {
-       rose_sem_element_type_e element_type;
-       rose_sem_declarations *declarations;
-       rose_sem_group_effect *group_effect;
-       rose_sem_effect *effect;
-       rose_sem_ref_effect *ref_effect;
-};
-
 struct _rose_sem_namespace {
        gchar *prefix;
        gchar *href;
 };
 
-struct _rose_sem_effect_base_type {
-       /* Supplemental information flag */
-       gboolean supplemental_info_flag;
-       gboolean auto_extraction_flag;
-       gchar *id;
-
-       rose_sem_base_attr *effect_base;
-};
 
-struct _rose_sem_effect {
+struct _rose_sem_effect_elements {
        gboolean intensity_value_flag;
        gboolean intensity_range_flag;
        gboolean color_type_flag;
@@ -200,27 +107,13 @@ struct _rose_sem_effect {
        gfloat intensity_value;
        gfloat min_intensity;
        gfloat max_intensity;
-       guint pts;
        gchar *color_type;
        guint frequency;
-       rose_sem_base_attr *effect_base;
-       rose_sem_any_attr_type *any_attr_type;
-};
 
-struct _rose_sem_group_effect {
-       gchar *id;
-       rose_sem_any_attr_type *any_attr_type;
-       guint pts;
-       rose_sem_base_attr *effect_base;
-       GList *elements;
+       rose_sem_base_attr *base_attr;
+       rose_sem_si_attr *si_attr;
 };
 
-struct _rose_sem_ref_effect {
-       gchar *id;
-       gchar *uri;
-       rose_sem_base_attr *effect_base;
-       rose_sem_any_attr_type *any_attr_type;
-};
 
 int rose_sem_parse(xmlNode * a_node, rose_sem ** sem);
 void rose_sem_free(rose_sem * sem);
index bc49dd1aa5c6e9f61ce82cbcf494a52100edd37c..00337cf2f0cdd437f0f8065e4c16a5e1263670c5 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-rose-tizen
 Summary:    For RoSE(Representation Of Sensory Effect) APIs
-Version:    0.0.4
+Version:    0.0.5
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index c23091ef6f98ee68f94790614eb9abbb4f9304ab..891d28e774d19528a8c4b4cbf0f7480ac772bfac 100644 (file)
 
 /* node parsing */
 static gboolean _parse_namespace(xmlNode * node, rose_sem * sem);
-static gboolean _parse_declarations(xmlNode * node, rose_sem_declarations ** declarations);
-static gboolean _parse_group_effect(xmlNode * node, rose_sem_group_effect ** group_effect);
-static gboolean _parse_effect(xmlNode * node, rose_sem_effect ** effect);
+static gboolean _parse_declarations(xmlNode * node, rose_sem * sem);
+static gboolean _parse_group_effect(xmlNode * node, rose_sem * sem);
+static gboolean _parse_effect(xmlNode * node, rose_sem * sem, rose_sem_base_attr *base_attr, rose_sem_si_attr *si_attr);
+
 static gboolean _parse_si_attr(xmlNode * node, rose_sem_si_attr ** si_attr);
-static gboolean _parse_any_attr(xmlNode * node, rose_sem_any_attr_type ** attr_type);
 static gboolean _parse_effect_base_attr(xmlNode * node, rose_sem_base_attr ** attr);
 
-static gboolean _parse_and_add_element(xmlNode * node, GList ** elements, rose_sem_element_type_e type);
-
-/* node free */
 static void _free_namespace(rose_sem_namespace * namespace);
-static void _free_declarations(rose_sem_declarations * declarations);
-static void _free_elements(rose_sem_elements * elements);
-static void _free_group_effect(rose_sem_group_effect * node);
-static void _free_effect(rose_sem_effect * node);
+static void _free_effect_elements(rose_sem_effect_elements *elements);
 static void _free_si_attr(rose_sem_si_attr * si_attr);
-static void _free_any_attr(rose_sem_any_attr_type * attr_type);
 static void _free_effect_base_attr(rose_sem_base_attr * attr);
 
-static gboolean _get_xml_prop_pu_mode(xmlNode * node, const gchar * property_name,
-       rose_sem_pu_mode_e * property_value)
-{
-       xmlChar *prop_string;
-       gboolean exists = TRUE;
-
-       ROSE_CHECK_NULL_FALSE(property_value);
-
-       *property_value = SEM_PU_MODE_SELF;
-       prop_string = xmlGetProp(node, (const xmlChar *)property_name);
-       if (!prop_string)
-               return FALSE;
-
-       if (xmlStrstr(prop_string, (xmlChar *) "self")) {
-               *property_value = SEM_PU_MODE_SELF;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "ancestors")) {
-               *property_value = SEM_PU_MODE_ANCESTORS;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "descendants")) {
-               *property_value = SEM_PU_MODE_DESCENDANTS;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "ancestorsDescendants")) {
-               *property_value = SEM_PU_MODE_ANCESTORS_DESCENDANTS;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "preceding")) {
-               *property_value = SEM_PU_MODE_PRECEDING;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "precedingSiblings")) {
-               *property_value = SEM_PU_MODE_PRECEDING_SIBLINGS;
-               LOGD(" - %s: self", property_name);
-       } else if (xmlStrstr(prop_string, (xmlChar *) "sequential")) {
-               *property_value = SEM_PU_MODE_SEQUENTIAL;
-               LOGD(" - %s: self", property_name);
-       } else {
-               exists = FALSE;
-               LOGW("failed to parse PU_MODE type property %s from xml string %s", property_name, prop_string);
-       }
-
-       xmlFree(prop_string);
-
-       return exists;
-}
+static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_base_attr * attr);
+static void _save_si_attr(rose_sem_effect_elements * effect, rose_sem_si_attr * attr);
 
 static gboolean _get_xml_prop_effect_type(xmlNode * node, const gchar * property_name, rose_sem_effect_type_e * property_value)
 {
@@ -157,29 +109,33 @@ int rose_sem_parse(xmlNode * node, rose_sem ** sem)
        exist |= _parse_namespace(node, new_sem);
 
        LOGD("attributes of root SEM node:");
-       exist |= _parse_any_attr(node, &new_sem->any_attr_type);
+       exist |= _parse_si_attr(node, &new_sem->si_attr);
+
+       if (new_sem->si_attr) {
+               if (new_sem->si_attr->time_scale_flag) {
+                       new_sem->time_scale_flag = TRUE;
+                       new_sem->time_scale = new_sem->si_attr->time_scale;
+               }
+       }
 
        /* Parsing elements nodes */
        for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
-               if (cur_node->type == XML_ELEMENT_NODE) {
-                       if (xmlStrstr(cur_node->name, (xmlChar *) "Declarations")) {
-                               LOGD("Parsing Declaration");
-                               exist |= _parse_and_add_element(cur_node, &new_sem->elements, SEM_ELEMENT_DECLARATIONS);
-                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "GroupOfEffects")) {
-                               LOGD("Parsing GroupOfEffects");
-                               exist |= _parse_and_add_element(cur_node, &new_sem->elements, SEM_ELEMENT_GROUP_EFFECTS);
-                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
-                               LOGD("Parsing Effect");
-                               exist |= _parse_and_add_element(cur_node, &new_sem->elements, SEM_ELEMENT_EFFECT);
-                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "ReferenceEffect")) {
-                               LOGD("Parsing ReferenceEffect");
-                               exist |= _parse_and_add_element(cur_node, &new_sem->elements, SEM_ELEMENT_REF_EFFECTS);
-                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "Parameter")) {
-                               LOGD("Parsing Parameter");
-                               exist |= _parse_and_add_element(cur_node, &new_sem->elements, SEM_ELEMENT_PARAMETER);
-                       } else {
-                               LOGW("there is no node in SEM");
-                       }
+               if (cur_node->type != XML_ELEMENT_NODE)
+                       continue;
+               if (xmlStrstr(cur_node->name, (xmlChar *) "Declarations")) {
+                       LOGD("Parsing Declaration");
+                       _parse_declarations(cur_node, new_sem);
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "GroupOfEffects")) {
+                       _parse_group_effect(cur_node, new_sem);
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
+                       _parse_effect(cur_node, new_sem, NULL, NULL);
+                       LOGD("Parsing Effect");
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "ReferenceEffect")) {
+                       LOGD("Parsing ReferenceEffect");
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "Parameter")) {
+                       LOGD("Parsing Parameter");
+               } else {
+                       LOGW("there is no node in SEM");
                }
        }
 
@@ -197,6 +153,18 @@ int rose_sem_parse(xmlNode * node, rose_sem ** sem)
        return ret;
 }
 
+void rose_sem_free(rose_sem * sem)
+{
+       if (!sem)
+               return;
+
+       g_list_free_full(sem->namespace, (GDestroyNotify) _free_namespace);
+       g_list_free_full(sem->effect_elements, (GDestroyNotify) _free_effect_elements);
+       _free_si_attr(sem->si_attr);
+
+       g_slice_free(rose_sem, sem);
+}
+
 static gboolean _parse_namespace(xmlNode * node, rose_sem * sem)
 {
        xmlNs *curr_ns;
@@ -234,72 +202,106 @@ static void _free_namespace(rose_sem_namespace * namespace)
        g_slice_free(rose_sem_namespace, namespace);
 }
 
-void rose_sem_free(rose_sem * sem)
+static gboolean _parse_declarations(xmlNode * node, rose_sem * sem)
 {
-       if (!sem)
-               return;
-
-       g_list_free_full(sem->namespace, (GDestroyNotify) _free_namespace);
-
-       g_list_free_full(sem->elements, (GDestroyNotify) _free_elements);
+       gboolean exist = FALSE;
+       xmlNode *cur_node;
 
-       _free_any_attr(sem->any_attr_type);
+       for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
+               if (xmlStrstr(cur_node->name, (xmlChar *) "GroupOfEffects")) {
+                       LOGD("Parsing ReferenceEffect");
+                       exist |= _parse_group_effect(cur_node, sem);
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
+                       LOGD("Parsing Effect");
+                       exist |= _parse_effect(cur_node, sem, NULL, NULL);
+               } else if (xmlStrstr(cur_node->name, (xmlChar *) "Parameter")) {
+                       LOGD("Parsing Parameter");
+               } else {
+                       LOGW("there is no node in SEM");
+               }
+       }
 
-       g_slice_free(rose_sem, sem);
+       return exist;
 }
 
-static void _free_elements(rose_sem_elements * elements)
+static gboolean _parse_group_effect(xmlNode * node, rose_sem * sem)
 {
-       if (!elements)
-               return;
+       gboolean exist = FALSE;
+       xmlNode *cur_node;
+       rose_sem_si_attr *si_attr = NULL;
+       rose_sem_base_attr *base_attr = NULL;
+
+       exist |= _parse_si_attr(node, &si_attr);
+       exist |= _parse_effect_base_attr(node, &base_attr);
 
-       switch (elements->element_type) {
-       case SEM_ELEMENT_GROUP_EFFECTS:
-               _free_group_effect(elements->group_effect);
-               break;
-       case SEM_ELEMENT_EFFECT:
-               _free_effect(elements->effect);
-               break;
-       case SEM_ELEMENT_REF_EFFECTS:
-               break;
-       default:
-               break;
+       for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
+               if (cur_node->type == XML_ELEMENT_NODE) {
+                       if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
+                               LOGD("Parsing Effect");
+                               exist |= _parse_effect(cur_node, sem, base_attr, si_attr);
+                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "ReferenceEffect")) {
+                               LOGD("Parsing ReferenceEffect");
+                       } else {
+                               LOGW("there is no children node in GroupEffects");
+                       }
+               }
        }
-       g_slice_free(rose_sem_elements, elements);
-}
 
-static void _free_declarations(rose_sem_declarations * declarations)
-{
-       if (!declarations)
-               return;
+       _free_si_attr(si_attr);
+       _free_effect_base_attr(base_attr);
 
-       xmlFree(declarations->id);
-       g_list_free_full(declarations->elements, (GDestroyNotify) _free_elements);
-       g_slice_free(rose_sem_declarations, declarations);
+       return exist;
 }
 
-static void _free_group_effect(rose_sem_group_effect * group_effect)
+static gboolean _parse_effect(xmlNode * node, rose_sem * sem,
+                                                               rose_sem_base_attr *base_attr,
+                                                               rose_sem_si_attr *si_attr)
 {
-       if (!group_effect)
-               return;
+       rose_sem_effect_elements *new_effect = NULL;
+       gboolean exist = FALSE;
 
-       xmlFree(group_effect->id);
-       _free_any_attr(group_effect->any_attr_type);
-       _free_effect_base_attr(group_effect->effect_base);
-       g_list_free_full(group_effect->elements, (GDestroyNotify) _free_elements);
-       g_slice_free(rose_sem_group_effect, group_effect);
-}
+       new_effect = g_slice_new0(rose_sem_effect_elements);
 
-static void _free_effect(rose_sem_effect * effect)
-{
-       if (!effect)
-               return;
+       exist |= _get_xml_prop_string(node, "id", &new_effect->id);
+
+       exist |= _get_xml_prop_effect_type(node, "type", &new_effect->type);
+
+       if (new_effect->type > SEM_EFFECT_NONE) {
+               switch (new_effect->type) {
+               case SEM_EFFECT_FLASH:
+                       exist |= new_effect->frequency_flag = _get_xml_prop_unsigned_integer(node, "frequency", &new_effect->frequency);
+               case SEM_EFFECT_LIGHT:
+                       exist |= new_effect->color_type_flag = _get_xml_prop_string(node, "color", &new_effect->color_type);
+                       break;
+               case SEM_EFFECT_TEMPERATURE:
+                       break;
+               case SEM_EFFECT_WIND:
+                       break;
+               case SEM_EFFECT_VIBRATION:
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       exist |= new_effect->intensity_range_flag = _get_xml_prop_intensity_range(node, "intensity-range", &new_effect->min_intensity, &new_effect->max_intensity);
+       exist |= new_effect->intensity_value_flag = _get_xml_prop_float(node, "intensity-value", &new_effect->intensity_value);
+
+       exist |= _parse_effect_base_attr(node, &new_effect->base_attr);
+       exist |= _parse_si_attr(node, &new_effect->si_attr);
+
+       if (!exist) {
+               g_slice_free(rose_sem_effect_elements, new_effect);
+               new_effect = NULL;
+               return FALSE;
+       }
+
+       _save_effect_base_attr(new_effect, base_attr);
+       _save_si_attr(new_effect, si_attr);
 
-       xmlFree(effect->id);
-       xmlFree(effect->color_type);
-       _free_effect_base_attr(effect->effect_base);
-       _free_any_attr(effect->any_attr_type);
-       g_slice_free(rose_sem_effect, effect);
+       sem->effect_elements = g_list_append(sem->effect_elements, new_effect);
+
+       return exist;
 }
 
 static void _free_si_attr(rose_sem_si_attr * si_attr)
@@ -325,7 +327,6 @@ static gboolean _parse_si_attr(xmlNode * node, rose_sem_si_attr ** si_attr)
 
        exist |= new_si_attr->anchor_element_flag = _get_xml_prop_boolean(node, "anchorElement", &new_si_attr->anchor_element);
        exist |= new_si_attr->encode_as_rap_flag = _get_xml_prop_boolean(node, "encodeAsRAP", &new_si_attr->encode_as_rap);
-       exist |= new_si_attr->pu_mode_flag = _get_xml_prop_pu_mode(node, "puMode", &new_si_attr->pu_mode);
        exist |= new_si_attr->time_scale_flag = _get_xml_prop_unsigned_integer(node, "timeScale", &new_si_attr->time_scale);
        exist |= new_si_attr->pts_delta_flag = _get_xml_prop_unsigned_integer(node, "ptsDelta", &new_si_attr->pts_delta);
        exist |= new_si_attr->abs_time_scheme_flag = _get_xml_prop_string(node, "absTimeScheme", &new_si_attr->abs_time_scheme);
@@ -343,74 +344,6 @@ static gboolean _parse_si_attr(xmlNode * node, rose_sem_si_attr ** si_attr)
 
 }
 
-static void _free_any_attr(rose_sem_any_attr_type * attr_type)
-{
-       if (attr_type) {
-               _free_si_attr(attr_type->si_attr);
-               g_list_free_full(attr_type->any_attr, xmlFree);
-               g_slice_free(rose_sem_any_attr_type, attr_type);
-       }
-}
-
-static gboolean _parse_any_attr(xmlNode * node, rose_sem_any_attr_type ** attr_type)
-{
-       rose_sem_any_attr_type *new_attr_type;
-       gboolean exist = FALSE;
-
-       _free_any_attr(*attr_type);
-       *attr_type = NULL;
-
-       new_attr_type = g_slice_new0(rose_sem_any_attr_type);
-       exist = _parse_si_attr(node, &new_attr_type->si_attr);
-
-       if (!exist) {
-               g_slice_free(rose_sem_any_attr_type, new_attr_type);
-               return FALSE;
-       }
-
-       *attr_type = new_attr_type;
-       return TRUE;
-}
-
-static gboolean _parse_and_add_element(xmlNode * node, GList ** elements, rose_sem_element_type_e type)
-{
-       gboolean ret = FALSE;
-       rose_sem_elements *new_elements;
-       new_elements = g_slice_new0(rose_sem_elements);
-       new_elements->element_type = type;
-
-       switch (type) {
-       case SEM_ELEMENT_DECLARATIONS:
-               ret = _parse_declarations(node, &new_elements->declarations);
-               break;
-       case SEM_ELEMENT_GROUP_EFFECTS:
-               ret = _parse_group_effect(node, &new_elements->group_effect);
-               break;
-       case SEM_ELEMENT_EFFECT:
-               ret = _parse_effect(node, &new_elements->effect);
-               break;
-       case SEM_ELEMENT_REF_EFFECTS:
-               // ret = rose_sem_parse_ref_effects (node, &new_elements->ref_effect);
-               break;
-       case SEM_ELEMENT_PARAMETER:
-               // ret = rose_sem_parse_parameter (node, &new_elements->parameter);
-               break;
-       default:
-               break;
-       }
-
-       if (!ret) {
-               LOGD("no children element, return false");
-               g_slice_free(rose_sem_elements, new_elements);
-               return ret;
-       }
-
-       *elements = g_list_append(*elements, new_elements);
-       LOGD("Add List %p in %p", new_elements, *elements);
-
-       return ret;
-}
-
 static void _free_effect_base_attr(rose_sem_base_attr * attr)
 {
        if (attr) {
@@ -447,122 +380,90 @@ static gboolean _parse_effect_base_attr(xmlNode * node, rose_sem_base_attr ** at
        return exist;
 }
 
-static gboolean _parse_declarations(xmlNode * node, rose_sem_declarations ** declarations)
+static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_base_attr * attr)
 {
-       rose_sem_declarations *new_dec;
-       gboolean exist = FALSE;
-       xmlNode *cur_node;
-
-       _free_declarations(*declarations);
-       *declarations = NULL;
-
-       new_dec = g_slice_new0(rose_sem_declarations);
-       exist |= _get_xml_prop_string(node, "id", &new_dec->id);
+       if (!effect || !attr)
+               return;
 
-       for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
-               if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
-                       LOGD("Parsing Effect");
-                       exist |= _parse_and_add_element(cur_node, &new_dec->elements, SEM_ELEMENT_EFFECT);
-               } else if (xmlStrstr(cur_node->name, (xmlChar *) "ReferenceEffect")) {
-                       LOGD("Parsing ReferenceEffect");
-                       exist |= _parse_and_add_element(cur_node, &new_dec->elements, SEM_ELEMENT_REF_EFFECTS);
-               } else if (xmlStrstr(cur_node->name, (xmlChar *) "Parameter")) {
-                       LOGD("Parsing Parameter");
-                       exist |= _parse_and_add_element(cur_node, &new_dec->elements, SEM_ELEMENT_PARAMETER);
-               } else {
-                       LOGW("there is no node in SEM");
-               }
+       if (!effect->base_attr) {
+               LOGD("copy parent base attr");
+               effect->base_attr = g_slice_dup(rose_sem_base_attr, attr);
+               return;
        }
 
-       if (!exist) {
-               g_slice_free(rose_sem_declarations, new_dec);
-               new_dec = NULL;
+       if (!effect->base_attr->activate_flag && attr->activate_flag) {
+               effect->base_attr->activate_flag = attr->activate_flag;
+               effect->base_attr->activate = attr->activate;
        }
 
-       *declarations = new_dec;
-       return exist;
-}
-
-static gboolean _parse_group_effect(xmlNode * node, rose_sem_group_effect ** group_effect)
-{
-       rose_sem_group_effect *new_group_effect;
-       gboolean exist = FALSE;
-       xmlNode *cur_node;
-
-       _free_group_effect(*group_effect);
-       *group_effect = NULL;
-
-       new_group_effect = g_slice_new0(rose_sem_group_effect);
-       exist |= _get_xml_prop_string(node, "id", &new_group_effect->id);
-       exist |= _parse_any_attr(node, &new_group_effect->any_attr_type);
-       exist |= _parse_effect_base_attr(node, &new_group_effect->effect_base);
+       if (!effect->base_attr->duration_flag && attr->duration_flag) {
+               effect->base_attr->duration_flag = attr->duration_flag;
+               effect->base_attr->duration = attr->duration;
+       }
 
-       for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
-               if (cur_node->type == XML_ELEMENT_NODE) {
-                       if (xmlStrstr(cur_node->name, (xmlChar *) "Effect")) {
-                               LOGD("Parsing Effect");
-                               exist |= _parse_and_add_element(cur_node, &new_group_effect->elements, SEM_ELEMENT_EFFECT);
-                       } else if (xmlStrstr(cur_node->name, (xmlChar *) "ReferenceEffect")) {
-                               LOGD("Parsing ReferenceEffect");
-                               exist |= _parse_and_add_element(cur_node, &new_group_effect->elements, SEM_ELEMENT_REF_EFFECTS);
-                       } else {
-                               LOGW("there is no children node in GroupEffects");
-                       }
-               }
+       if (!effect->base_attr->fade_flag && attr->fade_flag) {
+               effect->base_attr->fade_flag = attr->fade_flag;
+               effect->base_attr->fade = attr->fade;
        }
 
-       if (!exist) {
-               g_slice_free(rose_sem_group_effect, new_group_effect);
-               new_group_effect = NULL;
+       if (!effect->base_attr->priority_flag && attr->priority_flag) {
+               effect->base_attr->priority_flag = attr->priority_flag;
+               effect->base_attr->priority = attr->priority;
        }
 
-       *group_effect = new_group_effect;
-       return exist;
+       if (!effect->base_attr->location_flag && attr->location_flag) {
+               effect->base_attr->location_flag = attr->location_flag;
+               strncpy(effect->base_attr->location, attr->location, strlen(attr->location));
+       }
 }
 
-static gboolean _parse_effect(xmlNode * node, rose_sem_effect ** effect)
+static void _save_si_attr(rose_sem_effect_elements * effect, rose_sem_si_attr * attr)
 {
-       rose_sem_effect *new_effect;
-       gboolean exist = FALSE;
+       if (!effect || !attr)
+               return;
 
-       _free_effect(*effect);
-       *effect = NULL;
+       if (!effect->si_attr) {
+               LOGD("copy parent si attr");
+               effect->si_attr = g_slice_dup(rose_sem_si_attr, attr);
+               return;
+       }
 
-       new_effect = g_slice_new0(rose_sem_effect);
+       if (!effect->si_attr->time_scale_flag && attr->time_scale_flag) {
+               effect->si_attr->time_scale_flag = attr->time_scale_flag;
+               effect->si_attr->time_scale = attr->time_scale;
+       }
 
-       exist |= _get_xml_prop_string(node, "id", &new_effect->id);
+       if (!effect->si_attr->pts_delta_flag && attr->pts_delta_flag) {
+               effect->si_attr->pts_delta_flag = attr->pts_delta_flag;
+               effect->si_attr->pts_delta = attr->pts_delta;
+       }
 
-       exist |= _get_xml_prop_effect_type(node, "type", &new_effect->type);
+       if (!effect->si_attr->pts_delta_flag && attr->pts_delta_flag) {
+               effect->si_attr->pts_delta_flag = attr->pts_delta_flag;
+               effect->si_attr->pts_delta = attr->pts_delta;
+       }
 
-       if (new_effect->type > SEM_EFFECT_NONE) {
-               switch (new_effect->type) {
-               case SEM_EFFECT_FLASH:
-                       exist |= new_effect->frequency_flag = _get_xml_prop_unsigned_integer(node, "frequency", &new_effect->frequency);
-               case SEM_EFFECT_LIGHT:
-                       exist |= new_effect->color_type_flag = _get_xml_prop_string(node, "color", &new_effect->color_type);
-                       break;
-               case SEM_EFFECT_TEMPERATURE:
-                       break;
-               case SEM_EFFECT_WIND:
-                       break;
-               case SEM_EFFECT_VIBRATION:
-                       break;
-               default:
-                       break;
-               }
+       if (!effect->si_attr->abs_time_flag && attr->abs_time_flag) {
+               effect->si_attr->abs_time_flag = attr->abs_time_flag;
+               strncpy(effect->si_attr->abs_time, attr->abs_time, strlen(attr->abs_time));
        }
 
-       exist |= _parse_effect_base_attr(node, &new_effect->effect_base);
-       exist |= new_effect->intensity_range_flag = _get_xml_prop_intensity_range(node, "intensity-range", &new_effect->min_intensity, &new_effect->max_intensity);
-       exist |= new_effect->intensity_value_flag = _get_xml_prop_float(node, "intensity-value", &new_effect->intensity_value);
+       if (!effect->si_attr->pts_flag && attr->pts_flag) {
+               effect->si_attr->pts_flag = attr->pts_flag;
+               effect->si_attr->pts = attr->pts;
+       }
+}
 
-       exist |= _parse_any_attr(node, &new_effect->any_attr_type);
+static void _free_effect_elements(rose_sem_effect_elements * elements)
+{
+       if (!elements)
+               return;
 
-       if (!exist) {
-               g_slice_free(rose_sem_effect, new_effect);
-               new_effect = NULL;
-       }
+       g_free(elements->id)            ;
+       g_free(elements->color_type);
+       _free_effect_base_attr(elements->base_attr);
+       _free_si_attr(elements->si_attr);
+       g_slice_free(rose_sem_effect_elements, elements);
+
+}
 
-       *effect = new_effect;
-       return exist;
-}
\ No newline at end of file