void gf_sc_on_node_init(GF_Compositor *compositor, GF_Node *node) { switch (gf_node_get_tag(node)) { #ifndef GPAC_DISABLE_VRML case TAG_MPEG4_AnimationStream: compositor_init_animationstream(compositor, node); break; case TAG_MPEG4_AudioBuffer: compositor_init_audiobuffer(compositor, node); break; case TAG_MPEG4_AudioSource: compositor_init_audiosource(compositor, node); break; case TAG_MPEG4_AudioClip: #ifndef GPAC_DISABLE_X3D case TAG_X3D_AudioClip: #endif compositor_init_audioclip(compositor, node); break; case TAG_MPEG4_TimeSensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_TimeSensor: #endif compositor_init_timesensor(compositor, node); break; case TAG_MPEG4_ImageTexture: #ifndef GPAC_DISABLE_X3D case TAG_X3D_ImageTexture: #endif case TAG_MPEG4_CacheTexture: compositor_init_imagetexture(compositor, node); break; case TAG_MPEG4_PixelTexture: #ifndef GPAC_DISABLE_X3D case TAG_X3D_PixelTexture: #endif compositor_init_pixeltexture(compositor, node); break; case TAG_MPEG4_MovieTexture: #ifndef GPAC_DISABLE_X3D case TAG_X3D_MovieTexture: #endif compositor_init_movietexture(compositor, node); break; case TAG_MPEG4_Background2D: compositor_init_background2d(compositor, node); break; case TAG_MPEG4_Bitmap: compositor_init_bitmap(compositor, node); break; case TAG_MPEG4_ColorTransform: compositor_init_colortransform(compositor, node); break; case TAG_MPEG4_Circle: compositor_init_circle(compositor, node); break; case TAG_MPEG4_Curve2D: compositor_init_curve2d(compositor, node); break; case TAG_MPEG4_XCurve2D: compositor_init_curve2d(compositor, node); break; case TAG_MPEG4_Ellipse: compositor_init_ellipse(compositor, node); break; case TAG_MPEG4_OrderedGroup: compositor_init_orderedgroup(compositor, node); break; case TAG_MPEG4_PointSet2D: compositor_init_pointset2d(compositor, node); break; case TAG_MPEG4_Transform2D: compositor_init_transform2d(compositor, node); break; case TAG_MPEG4_TransformMatrix2D: compositor_init_transformmatrix2d(compositor, node); break; case TAG_MPEG4_LineProperties: compositor_init_lineprops(compositor, node); break; case TAG_MPEG4_XLineProperties: compositor_init_lineprops(compositor, node); break; case TAG_MPEG4_Viewport: compositor_init_viewport(compositor, node); break; case TAG_MPEG4_IndexedLineSet2D: compositor_init_indexed_line_set2d(compositor, node); break; case TAG_MPEG4_IndexedFaceSet2D: compositor_init_indexed_face_set2d(compositor, node); break; case TAG_MPEG4_Sound2D: compositor_init_sound2d(compositor, node); break; case TAG_MPEG4_LinearGradient: compositor_init_linear_gradient(compositor, node); break; case TAG_MPEG4_RadialGradient: compositor_init_radial_gradient(compositor, node); break; case TAG_MPEG4_CompositeTexture2D: compositor_init_compositetexture2d(compositor, node); break; case TAG_MPEG4_MatteTexture: compositor_init_mattetexture(compositor, node); break; case TAG_MPEG4_Form: compositor_init_form(compositor, node); break; case TAG_MPEG4_Layer2D: compositor_init_layer2d(compositor, node); break; case TAG_MPEG4_Layout: compositor_init_layout(compositor, node); break; case TAG_MPEG4_PathLayout: compositor_init_path_layout(compositor, node); break; /*sensors*/ case TAG_MPEG4_Anchor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Anchor: #endif compositor_init_anchor(compositor, node); break; case TAG_MPEG4_DiscSensor: compositor_init_disc_sensor(compositor, node); break; case TAG_MPEG4_PlaneSensor2D: compositor_init_plane_sensor2d(compositor, node); break; case TAG_MPEG4_ProximitySensor2D: compositor_init_proximity_sensor2d(compositor, node); break; case TAG_MPEG4_TouchSensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_TouchSensor: #endif compositor_init_touch_sensor(compositor, node); break; case TAG_MPEG4_Group: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Group: #endif compositor_init_group(compositor, node); break; case TAG_MPEG4_Rectangle: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Rectangle2D: #endif compositor_init_rectangle(compositor, node); break; case TAG_MPEG4_Shape: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Shape: #endif compositor_init_shape(compositor, node); break; case TAG_MPEG4_Switch: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Switch: #endif compositor_init_switch(compositor, node); break; case TAG_MPEG4_Text: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Text: #endif compositor_init_text(compositor, node); break; #ifndef GPAC_DISABLE_3D case TAG_MPEG4_Background: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Background: #endif compositor_init_background(compositor, node); break; case TAG_MPEG4_CylinderSensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_CylinderSensor: #endif compositor_init_cylinder_sensor(compositor, node); break; case TAG_MPEG4_PlaneSensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_PlaneSensor: #endif compositor_init_plane_sensor(compositor, node); break; case TAG_MPEG4_ProximitySensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_ProximitySensor: #endif compositor_init_proximity_sensor(compositor, node); break; case TAG_MPEG4_SphereSensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_SphereSensor: #endif compositor_init_sphere_sensor(compositor, node); break; case TAG_MPEG4_VisibilitySensor: #ifndef GPAC_DISABLE_X3D case TAG_X3D_VisibilitySensor: #endif compositor_init_visibility_sensor(compositor, node); break; case TAG_MPEG4_Box: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Box: #endif compositor_init_box(compositor, node); break; case TAG_MPEG4_Cone: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Cone: #endif compositor_init_cone(compositor, node); break; case TAG_MPEG4_Cylinder: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Cylinder: #endif compositor_init_cylinder(compositor, node); break; case TAG_MPEG4_ElevationGrid: #ifndef GPAC_DISABLE_X3D case TAG_X3D_ElevationGrid: #endif compositor_init_elevation_grid(compositor, node); break; case TAG_MPEG4_Extrusion: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Extrusion: #endif compositor_init_extrusion(compositor, node); break; case TAG_MPEG4_IndexedFaceSet: #ifndef GPAC_DISABLE_X3D case TAG_X3D_IndexedFaceSet: #endif compositor_init_ifs(compositor, node); break; case TAG_MPEG4_IndexedLineSet: #ifndef GPAC_DISABLE_X3D case TAG_X3D_IndexedLineSet: #endif compositor_init_ils(compositor, node); break; case TAG_MPEG4_PointSet: #ifndef GPAC_DISABLE_X3D case TAG_X3D_PointSet: #endif compositor_init_point_set(compositor, node); break; case TAG_MPEG4_Sphere: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Sphere: #endif compositor_init_sphere(compositor, node); break; case TAG_MPEG4_Billboard: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Billboard: #endif compositor_init_billboard(compositor, node); break; case TAG_MPEG4_Collision: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Collision: #endif compositor_init_collision(compositor, node); break; case TAG_MPEG4_LOD: #ifndef GPAC_DISABLE_X3D case TAG_X3D_LOD: #endif compositor_init_lod(compositor, node); break; case TAG_MPEG4_Transform: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Transform: #endif compositor_init_transform(compositor, node); break; case TAG_MPEG4_Sound: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Sound: #endif compositor_init_sound(compositor, node); break; case TAG_MPEG4_Viewpoint: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Viewpoint: #endif compositor_init_viewpoint(compositor, node); break; case TAG_MPEG4_NavigationInfo: #ifndef GPAC_DISABLE_X3D case TAG_X3D_NavigationInfo: #endif compositor_init_navigation_info(compositor, node); break; case TAG_MPEG4_Fog: #ifndef GPAC_DISABLE_X3D case TAG_X3D_Fog: #endif compositor_init_fog(compositor, node); break; case TAG_MPEG4_DirectionalLight: #ifndef GPAC_DISABLE_X3D case TAG_X3D_DirectionalLight: #endif compositor_init_directional_light(compositor, node); break; case TAG_MPEG4_PointLight: #ifndef GPAC_DISABLE_X3D case TAG_X3D_PointLight: #endif compositor_init_point_light(compositor, node); break; case TAG_MPEG4_SpotLight: #ifndef GPAC_DISABLE_X3D case TAG_X3D_SpotLight: #endif compositor_init_spot_light(compositor, node); break; case TAG_MPEG4_NonLinearDeformer: compositor_init_non_linear_deformer(compositor, node); break; case TAG_MPEG4_Layer3D: compositor_init_layer3d(compositor, node); break; case TAG_MPEG4_CompositeTexture3D: compositor_init_compositetexture3d(compositor, node); break; case TAG_MPEG4_EnvironmentTest: compositor_init_envtest(compositor, node); break; #endif /*X3D nodes*/ #ifndef GPAC_DISABLE_X3D case TAG_X3D_StaticGroup: compositor_init_static_group(compositor, node); break; case TAG_X3D_Disk2D: compositor_init_disk2d(compositor, node); break; case TAG_X3D_Arc2D: case TAG_X3D_ArcClose2D: compositor_init_arc2d(compositor, node); break; case TAG_X3D_Polyline2D: compositor_init_polyline2d(compositor, node); break; case TAG_X3D_TriangleSet2D: compositor_init_triangle_set2d(compositor, node); break; #ifndef GPAC_DISABLE_3D case TAG_X3D_Polypoint2D: compositor_init_polypoint2d(compositor, node); break; case TAG_X3D_LineSet: compositor_init_lineset(compositor, node); break; case TAG_X3D_TriangleSet: compositor_init_triangle_set(compositor, node); break; case TAG_X3D_TriangleStripSet: compositor_init_triangle_strip_set(compositor, node); break; case TAG_X3D_TriangleFanSet: compositor_init_triangle_fan_set(compositor, node); break; case TAG_X3D_IndexedTriangleFanSet: compositor_init_indexed_triangle_fan_set(compositor, node); break; case TAG_X3D_IndexedTriangleStripSet: compositor_init_indexed_triangle_strip_set(compositor, node); break; case TAG_X3D_IndexedTriangleSet: compositor_init_indexed_triangle_set(compositor, node); break; #endif #endif /*GPAC_DISABLE_X3D*/ case TAG_ProtoNode: compositor_init_hardcoded_proto(compositor, node); break; case TAG_MPEG4_SBVCAnimation: compositor_init_afx_node(compositor, node, & ((M_SBVCAnimation *)node)->url); break; case TAG_MPEG4_BitWrapper: compositor_init_afx_node(compositor, node, & ((M_BitWrapper *)node)->url); break; #endif /*GPAC_DISABLE_VRML*/ #ifndef GPAC_DISABLE_SVG /* SVG Part */ case TAG_SVG_svg: compositor_init_svg_svg(compositor, node); break; case TAG_SVG_g: compositor_init_svg_g(compositor, node); break; case TAG_SVG_switch: compositor_init_svg_switch(compositor, node); break; case TAG_SVG_rect: compositor_init_svg_rect(compositor, node); break; case TAG_SVG_path: compositor_init_svg_path(compositor, node); break; case TAG_SVG_circle: compositor_init_svg_circle(compositor, node); break; case TAG_SVG_ellipse: compositor_init_svg_ellipse(compositor, node); break; case TAG_SVG_line: compositor_init_svg_line(compositor, node); break; case TAG_SVG_polyline: compositor_init_svg_polyline(compositor, node); break; case TAG_SVG_polygon: compositor_init_svg_polygon(compositor, node); break; case TAG_SVG_a: compositor_init_svg_a(compositor, node); break; case TAG_SVG_linearGradient: compositor_init_svg_linearGradient(compositor, node); break; case TAG_SVG_radialGradient: compositor_init_svg_radialGradient(compositor, node); break; case TAG_SVG_solidColor: compositor_init_svg_solidColor(compositor, node); break; case TAG_SVG_stop: compositor_init_svg_stop(compositor, node); break; case TAG_SVG_text: compositor_init_svg_text(compositor, node); break; case TAG_SVG_tspan: compositor_init_svg_tspan(compositor, node); break; case TAG_SVG_textArea: compositor_init_svg_textarea(compositor, node); break; case TAG_SVG_tbreak: compositor_init_svg_tbreak(compositor, node); break; case TAG_SVG_image: compositor_init_svg_image(compositor, node); break; case TAG_SVG_video: compositor_init_svg_video(compositor, node); break; case TAG_SVG_audio: compositor_init_svg_audio(compositor, node, 0); break; /*SVG font support - note that we initialize the font when parsing the font-face element, not the font element*/ case TAG_SVG_font_face: compositor_init_svg_font(compositor, node); break; case TAG_SVG_missing_glyph: case TAG_SVG_glyph: compositor_init_svg_glyph(compositor, node); break; case TAG_SVG_font_face_uri: compositor_init_svg_font_face_uri(compositor, node); break; case TAG_SVG_use: compositor_init_svg_use(compositor, node); break; case TAG_SVG_animation: compositor_init_svg_animation(compositor, node); break; case TAG_SVG_foreignObject: compositor_init_svg_foreign_object(compositor, node); break; case TAG_SVG_filter: compositor_init_svg_filter(compositor, node); break; case TAG_LSR_updates: compositor_init_svg_updates(compositor, node); break; #endif default: GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[Compositor] node %s will not be rendered\n", gf_node_get_class_name(node))); break; } }
static void SVG_Update_video(GF_TextureHandler *txh) { GF_FieldInfo init_vis_info; SVG_video_stack *stack = (SVG_video_stack *) gf_node_get_private(txh->owner); if (!txh->is_open) { SVG_InitialVisibility init_vis; if (stack->first_frame_fetched) return; init_vis = SVG_INITIALVISIBILTY_WHENSTARTED; if (gf_node_get_attribute_by_tag(txh->owner, TAG_SVG_ATT_initialVisibility, GF_FALSE, GF_FALSE, &init_vis_info) == GF_OK) { init_vis = *(SVG_InitialVisibility *)init_vis_info.far_ptr; } /*opens stream only at first access to fetch first frame if needed*/ if (init_vis == SVG_INITIALVISIBILTY_ALWAYS) { svg_play_texture((SVG_video_stack*)stack, NULL); gf_sc_invalidate(txh->compositor, NULL); } return; } /*when fetching the first frame disable resync*/ gf_sc_texture_update_frame(txh, GF_FALSE); /* only when needs_refresh = 1, first frame is fetched */ if (!stack->first_frame_fetched) { if (txh->needs_refresh) { stack->first_frame_fetched = GF_TRUE; /*stop stream if needed*/ if (!gf_smil_timing_is_active(txh->owner)) { gf_sc_texture_stop(txh); //make sure the refresh flag is not cleared txh->needs_refresh = GF_TRUE; } } } if (!stack->audio && stack->audio_dirty) { u32 res = gf_mo_has_audio(stack->txh.stream); if (res != 2) { stack->audio_dirty = GF_FALSE; if (res) { GF_FieldInfo att_vid, att_aud; stack->audio = gf_node_new(gf_node_get_graph(stack->txh.owner), TAG_SVG_audio); gf_node_register(stack->audio, NULL); if (gf_node_get_attribute_by_tag(stack->txh.owner, TAG_XLINK_ATT_href, GF_FALSE, GF_FALSE, &att_vid)==GF_OK) { gf_node_get_attribute_by_tag(stack->audio, TAG_XLINK_ATT_href, GF_TRUE, GF_FALSE, &att_aud); gf_svg_attributes_copy(&att_aud, &att_vid, GF_FALSE); } /*BYPASS SMIL TIMING MODULE!!*/ compositor_init_svg_audio(stack->txh.compositor, stack->audio, GF_TRUE); } } } /*we have no choice but retraversing the graph until we're inactive since the movie framerate and the compositor framerate are likely to be different */ if (!txh->stream_finished) if (txh->needs_refresh) gf_sc_invalidate(txh->compositor, NULL); if (stack->stop_requested) { stack->stop_requested = GF_FALSE; gf_sc_texture_stop(&stack->txh); } }