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; }
GF_EXPORT GF_Err gf_bifs_decoder_configure_stream(GF_BifsDecoder * codec, u16 ESID, char *DecoderSpecificInfo, u32 DecoderSpecificInfoLength, u32 objectTypeIndication) { GF_BitStream *bs; BIFSStreamInfo *pInfo; GF_Err e; if (!DecoderSpecificInfo) { /* Hack for T-DMB non compliant streams */ GF_SAFEALLOC(pInfo, BIFSStreamInfo); pInfo->ESID = ESID; pInfo->config.PixelMetrics = 1; pInfo->config.version = (objectTypeIndication==2) ? 1 : 2; assert( codec ); assert( codec->streamInfo ); return gf_list_add(codec->streamInfo, pInfo); } // gf_mx_p(codec->mx); assert( codec ); if (gf_bifs_dec_get_stream(codec, ESID) != NULL) { // gf_mx_v(codec->mx); return GF_BAD_PARAM; } bs = gf_bs_new(DecoderSpecificInfo, DecoderSpecificInfoLength, GF_BITSTREAM_READ); GF_SAFEALLOC(pInfo, BIFSStreamInfo); pInfo->ESID = ESID; pInfo->config.version = objectTypeIndication; /*parse config with indicated oti*/ e = ParseConfig(bs, pInfo, (u32) objectTypeIndication); if (e) { pInfo->ESID = ESID; /*some content indicates a wrong OTI, so try to parse with v1 or v2*/ gf_bs_seek(bs, 0); /*try with reverse config*/ e = ParseConfig(bs, pInfo, (objectTypeIndication==2) ? 1 : 2); pInfo->config.version = (objectTypeIndication==2) ? 1 : 2; } if (e && (e != GF_ODF_INVALID_DESCRIPTOR)) { gf_free(pInfo); gf_bs_del(bs); return GF_BIFS_UNKNOWN_VERSION; } gf_bs_del(bs); assert( codec->streamInfo ); //first stream, configure size if (!codec->ignore_size && !gf_list_count(codec->streamInfo)) { gf_sg_set_scene_size_info(codec->scenegraph, pInfo->config.Width, pInfo->config.Height, pInfo->config.PixelMetrics); } gf_list_add(codec->streamInfo, pInfo); // gf_mx_v(codec->mx); return GF_OK; }
GF_EXPORT GF_Err gf_bifs_decode_command_list(GF_BifsDecoder *codec, u16 ESID, char *data, u32 data_length, GF_List *com_list) { GF_BitStream *bs; GF_Err e; if (!codec || !data || !codec->dec_memory_mode || !com_list) return GF_BAD_PARAM; codec->info = gf_bifs_dec_get_stream(codec, ESID); if (!codec->info) return GF_BAD_PARAM; if (codec->info->config.elementaryMasks ) return GF_NOT_SUPPORTED; /*root parse (not conditionals)*/ assert(codec->scenegraph); /*setup current scene graph*/ codec->current_graph = codec->scenegraph; codec->ActiveQP = (M_QuantizationParameter*) codec->scenegraph->global_qp; bs = gf_bs_new(data, data_length, GF_BITSTREAM_READ); gf_bs_set_eos_callback(bs, BM_EndOfStream, codec); e = BM_ParseCommand(codec, bs, com_list); gf_bs_del(bs); /*decode conditionals / input sensors*/ if (!e) { gf_bifs_flush_command_list(codec); } /*if err or not reset conditionals*/ while (gf_list_count(codec->command_buffers)) { CommandBufferItem *cbi = (CommandBufferItem *)gf_list_get(codec->command_buffers, 0); gf_free(cbi); gf_list_rem(codec->command_buffers, 0); } /*reset current config*/ codec->info = NULL; codec->current_graph = NULL; // gf_mx_v(codec->mx); return e; }