GF_EXPORT void gf_mse_mediasource_open(GF_HTML_MediaSource *ms, struct _mediaobj *mo) { if (!ms) return; if (!mo) { GF_LOG(GF_LOG_DEBUG, GF_LOG_MEDIA, ("[MSE] Cannot open media source without a media object\n")); return; } ms->readyState = MEDIA_SOURCE_READYSTATE_OPEN; /* getting the Scene Tree node attached to this media source */ ms->node = (GF_Node *)gf_event_target_get_node(gf_mo_event_target_get(mo, 0)); ms->sg = gf_node_get_graph(ms->node); gf_mse_fire_event(ms->evt_target, GF_EVENT_HTML_MSE_SOURCE_OPEN); }
GF_EXPORT Bool gf_mo_get_visual_info(GF_MediaObject *mo, u32 *width, u32 *height, u32 *stride, u32 *pixel_ar, u32 *pixelFormat, Bool *is_flipped) { GF_CodecCapability cap; if ((mo->type != GF_MEDIA_OBJECT_VIDEO) && (mo->type!=GF_MEDIA_OBJECT_TEXT)) return GF_FALSE; if (width) { cap.CapCode = GF_CODEC_WIDTH; gf_codec_get_capability(mo->odm->codec, &cap); *width = cap.cap.valueInt; } if (height) { cap.CapCode = GF_CODEC_HEIGHT; gf_codec_get_capability(mo->odm->codec, &cap); *height = cap.cap.valueInt; } if (mo->type==GF_MEDIA_OBJECT_TEXT) return GF_TRUE; if (is_flipped) { cap.CapCode = GF_CODEC_FLIP; cap.cap.valueInt = 0; gf_codec_get_capability(mo->odm->codec, &cap); *is_flipped = cap.cap.valueInt ? GF_TRUE : GF_FALSE; } if (stride) { cap.CapCode = GF_CODEC_STRIDE; gf_codec_get_capability(mo->odm->codec, &cap); *stride = cap.cap.valueInt; } if (pixelFormat) { cap.CapCode = GF_CODEC_PIXEL_FORMAT; gf_codec_get_capability(mo->odm->codec, &cap); *pixelFormat = cap.cap.valueInt; if (mo->odm && mo->odm->parentscene->is_dynamic_scene) { #ifndef GPAC_DISABLE_VRML const char *name = gf_node_get_name(gf_event_target_get_node(gf_mo_event_target_get(mo, 0))); if (name && !strcmp(name, "DYN_VIDEO")) { const char *opt; u32 r, g, b, a; M_Background2D *back = (M_Background2D *) gf_sg_find_node_by_name(mo->odm->parentscene->graph, "DYN_BACK"); if (back) { switch (cap.cap.valueInt) { case GF_PIXEL_ARGB: case GF_PIXEL_RGBA: case GF_PIXEL_YUVA: opt = gf_cfg_get_key(mo->odm->term->user->config, "Compositor", "BackColor"); if (!opt) { gf_cfg_set_key(mo->odm->term->user->config, "Compositor", "BackColor", "FF999999"); opt = "FF999999"; } sscanf(opt, "%02X%02X%02X%02X", &a, &r, &g, &b); back->backColor.red = INT2FIX(r)/255; back->backColor.green = INT2FIX(g)/255; back->backColor.blue = INT2FIX(b)/255; break; default: back->backColor.red = back->backColor.green = back->backColor.blue = 0; break; } gf_node_dirty_set((GF_Node *)back, 0, GF_TRUE); } } #endif } } /*get PAR settings*/ if (pixel_ar) { cap.CapCode = GF_CODEC_PAR; gf_codec_get_capability(mo->odm->codec, &cap); *pixel_ar = cap.cap.valueInt; if (! (*pixel_ar & 0x0000FFFF)) *pixel_ar = 0; if (! (*pixel_ar & 0xFFFF0000)) *pixel_ar = 0; /**/ if (! *pixel_ar) { GF_Channel *ch; GF_NetworkCommand com; com.base.command_type = GF_NET_CHAN_GET_PIXEL_AR; ch = (GF_Channel *)gf_list_get(mo->odm->channels, 0); if (!ch) return GF_FALSE; com.base.on_channel = ch; com.par.hSpacing = com.par.vSpacing = 0; if (gf_term_service_command(ch->service, &com) == GF_OK) { if ((com.par.hSpacing>65535) || (com.par.vSpacing>65535)) { com.par.hSpacing>>=16; com.par.vSpacing>>=16; } if (com.par.hSpacing|| com.par.vSpacing) *pixel_ar = (com.par.hSpacing<<16) | com.par.vSpacing; } }