GF_EXPORT GF_Err gf_bifs_decode_au(GF_BifsDecoder *codec, u16 ESID, const char *data, u32 data_length, Double ts_offset) { GF_BitStream *bs; GF_Err e; if (!codec || !data || codec->dec_memory_mode) return GF_BAD_PARAM; // gf_mx_p(codec->mx); codec->info = gf_bifs_dec_get_stream(codec, ESID); if (!codec->info) { // gf_mx_v(codec->mx); return GF_BAD_PARAM; } /*setup current scene graph*/ codec->current_graph = codec->scenegraph; codec->cts_offset = ts_offset; bs = gf_bs_new(data, data_length, GF_BITSTREAM_READ); gf_bs_set_eos_callback(bs, BD_EndOfStream, codec); if (codec->info->config.elementaryMasks) { e = GF_NOT_SUPPORTED; } else { e = gf_bifs_dec_command(codec, bs); } gf_bs_del(bs); /*reset current config*/ codec->info = NULL; codec->current_graph = NULL; // gf_mx_v(codec->mx); return e; }
static void Conditional_execute(M_Conditional *node) { char *buffer; u32 len; GF_BitStream *bs; GF_BifsDecoder *codec; GF_Proto *prevproto; GF_SceneGraph *prev_graph; ConditionalStack *priv = (ConditionalStack*)gf_node_get_private((GF_Node*)node); if (!priv) return; /*set the codec working graph to the node one (to handle conditional in protos)*/ prev_graph = priv->codec->current_graph; priv->codec->current_graph = gf_node_get_graph((GF_Node*)node); assert(priv->codec->current_graph); priv->codec->info = priv->info; prevproto = priv->codec->pCurrentProto; priv->codec->pCurrentProto = NULL; if (priv->codec->current_graph->pOwningProto) priv->codec->pCurrentProto = priv->codec->current_graph->pOwningProto->proto_interface; /*set isActive - to clarify in the specs*/ node->isActive = 1; gf_node_event_out((GF_Node *)node, 3/*"isActive"*/); if (!node->buffer.bufferSize) return; /*we may replace ourselves*/ buffer = (char*)node->buffer.buffer; len = node->buffer.bufferSize; node->buffer.buffer = NULL; node->buffer.bufferSize = 0; bs = gf_bs_new(buffer, len, GF_BITSTREAM_READ); codec = priv->codec; codec->cts_offset = gf_node_get_scene_time((GF_Node*)node); /*a conditional may destroy/replace itself - to prevent that, protect node by a register/unregister ...*/ gf_node_register((GF_Node*)node, NULL); #ifdef GF_SELF_REPLACE_ENABLE /*and a conditional may destroy the entire scene!*/ cur_graph->graph_has_been_reset = 0; #endif gf_bifs_dec_command(codec, bs); gf_bs_del(bs); #ifdef GF_SELF_REPLACE_ENABLE if (cur_graph->graph_has_been_reset) { return; } #endif if (node->buffer.buffer) { gf_free(buffer); } else { node->buffer.buffer = (u8*)buffer; node->buffer.bufferSize = len; } //set isActive - to clarify in the specs // node->isActive = 0; gf_node_unregister((GF_Node*)node, NULL); codec->cts_offset = 0; codec->pCurrentProto = prevproto; codec->current_graph = prev_graph; }