#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,
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;
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;
gboolean anchor_element;
gboolean encode_as_rap;
- rose_sem_pu_mode_e pu_mode;
guint time_scale;
guint pts_delta;
gchar *abs_time_scheme;
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;
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);
/* 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)
{
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");
}
}
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;
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)
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);
}
-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) {
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