/* Creates a subscene from the xlink:href */ static GF_Scene *gf_svg_get_subscene(GF_Node *elt, XLinkAttributesPointers *xlinkp, SMILSyncAttributesPointers *syncp, Bool use_sync, Bool primary_resource) { MFURL url; Bool lock_timelines = 0; GF_MediaObject *mo; GF_SceneGraph *graph = gf_node_get_graph(elt); GF_Scene *scene = (GF_Scene *)gf_sg_get_private(graph); if (!scene) return NULL; if (use_sync && syncp) { switch ((syncp->syncBehavior?*syncp->syncBehavior:SMIL_SYNCBEHAVIOR_DEFAULT)) { case SMIL_SYNCBEHAVIOR_LOCKED: case SMIL_SYNCBEHAVIOR_CANSLIP: lock_timelines = 1; break; case SMIL_SYNCBEHAVIOR_DEFAULT: { #if 0 if (svg && syncp) { switch ((syncp->syncBehaviorDefault ? *syncp->syncBehaviorDefault : SMIL_SYNCBEHAVIOR_LOCKED)) { case SMIL_SYNCBEHAVIOR_LOCKED: case SMIL_SYNCBEHAVIOR_CANSLIP: lock_timelines = 1; break; default: break; } } #endif } default: break; } } memset(&url, 0, sizeof(MFURL)); if (!xlinkp->href) return NULL; gf_term_get_mfurl_from_xlink(elt, &url); while (scene->secondary_resource && scene->root_od->parentscene) scene = scene->root_od->parentscene; mo = gf_scene_get_media_object_ex(scene, &url, GF_MEDIA_OBJECT_SCENE, lock_timelines, NULL, primary_resource, elt); gf_sg_vrml_mf_reset(&url, GF_SG_VRML_MFURL); if (!mo || !mo->odm) return NULL; mo->odm->subscene->secondary_resource = primary_resource ? 0 : 1; return mo->odm->subscene; }
static Bool gf_inline_set_scene(M_Inline *root) { GF_MediaObject *mo; GF_Scene *parent; GF_SceneGraph *graph = gf_node_get_graph((GF_Node *) root); parent = (GF_Scene *)gf_sg_get_private(graph); if (!parent) return 0; mo = gf_scene_get_media_object_ex(parent, &root->url, GF_MEDIA_OBJECT_SCENE, 0, NULL, 0, (GF_Node*)root); if (!mo || !mo->odm) return 0; if (!mo->odm->subscene) { gf_term_invalidate_compositor(parent->root_od->term); return 0; } /*assign inline scene as private stack of inline node, and remember inline node for event propagation*/ gf_node_set_private((GF_Node *)root, mo->odm->subscene); /*play*/ gf_mo_play(mo, 0, -1, 0); return 1; }
GF_EXPORT GF_MediaObject *gf_mo_register(GF_Node *node, MFURL *url, Bool lock_timelines, Bool force_new_res) { u32 obj_type; #ifndef GPAC_DISABLE_SVG Bool post_pone; GF_FieldInfo info; #endif GF_Scene *scene; GF_MediaObject *res, *syncRef; GF_SceneGraph *sg = gf_node_get_graph(node); if (!sg) return NULL; scene = (GF_Scene*)gf_sg_get_private(sg); if (!scene) return NULL; syncRef = NULL; /*keep track of the kind of object expected if URL is not using OD scheme*/ switch (gf_node_get_tag(node)) { #ifndef GPAC_DISABLE_VRML /*MPEG-4 / VRML / X3D only*/ case TAG_MPEG4_AudioClip: case TAG_MPEG4_AudioSource: #ifndef GPAC_DISABLE_X3D case TAG_X3D_AudioClip: #endif obj_type = GF_MEDIA_OBJECT_AUDIO; break; case TAG_MPEG4_SBVCAnimation: case TAG_MPEG4_AnimationStream: obj_type = GF_MEDIA_OBJECT_UPDATES; break; case TAG_MPEG4_BitWrapper: obj_type = GF_MEDIA_OBJECT_SCENE; break; case TAG_MPEG4_InputSensor: obj_type = GF_MEDIA_OBJECT_INTERACT; break; case TAG_MPEG4_Background2D: case TAG_MPEG4_Background: case TAG_MPEG4_ImageTexture: case TAG_MPEG4_CacheTexture: case TAG_MPEG4_MovieTexture: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Background: case TAG_X3D_ImageTexture: case TAG_X3D_MovieTexture: #endif obj_type = GF_MEDIA_OBJECT_VIDEO; break; case TAG_MPEG4_Inline: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Inline: #endif obj_type = GF_MEDIA_OBJECT_SCENE; break; #endif /*GPAC_DISABLE_VRML*/ /*SVG*/ #ifndef GPAC_DISABLE_SVG case TAG_SVG_audio: obj_type = GF_MEDIA_OBJECT_AUDIO; if (gf_node_get_attribute_by_tag(node, TAG_SVG_ATT_syncReference, GF_FALSE, GF_FALSE, &info)==GF_OK) { syncRef = get_sync_reference(scene, (XMLRI *)info.far_ptr, GF_MEDIA_OBJECT_UNDEF, node, &post_pone); /*syncRef is specified but doesn't exist yet, post-pone*/ if (post_pone) return NULL; } break; case TAG_SVG_video: obj_type = GF_MEDIA_OBJECT_VIDEO; if (gf_node_get_attribute_by_tag(node, TAG_SVG_ATT_syncReference, GF_FALSE, GF_FALSE, &info)==GF_OK) { syncRef = get_sync_reference(scene, (XMLRI *)info.far_ptr, GF_MEDIA_OBJECT_UNDEF, node, &post_pone); /*syncRef is specified but doesn't exist yet, post-pone*/ if (post_pone) return NULL; } break; case TAG_SVG_image: obj_type = GF_MEDIA_OBJECT_VIDEO; break; case TAG_SVG_foreignObject: case TAG_SVG_animation: obj_type = GF_MEDIA_OBJECT_SCENE; break; case TAG_LSR_updates: obj_type = GF_MEDIA_OBJECT_UPDATES; break; #endif default: obj_type = GF_MEDIA_OBJECT_UNDEF; break; } /*move to primary resource handler*/ while (scene->secondary_resource && scene->root_od->parentscene) scene = scene->root_od->parentscene; res = gf_scene_get_media_object_ex(scene, url, obj_type, lock_timelines, syncRef, force_new_res, node); return res; }