static M4Err AAC_Get_MPEG4_IOD(NetClientPlugin *plug, u32 expect_type, const char *sub_url, char **raw_iod, u32 *raw_iod_size) { ESDescriptor *esd; M4Err e; AACReader *read = plug->priv; ObjectDescriptor *od = (ObjectDescriptor *) OD_NewDescriptor(ObjectDescriptor_Tag); /*since we don't handle multitrack in aac, we don't need to check sub_url, only use expected type*/ od->objectDescriptorID = 1; /*audio object*/ if (expect_type==NM_OD_AUDIO) { esd = AAC_GetESD(read); esd->OCRESID = 0; ChainAddEntry(od->ESDescriptors, esd); e = OD_EncDesc((Descriptor *) od, raw_iod, raw_iod_size); OD_DeleteDescriptor((Descriptor **)&od); return e; } /*inline scene*/ /*OD ESD*/ esd = OD_NewESDescriptor(0); esd->slConfig->timestampResolution = 1000; esd->decoderConfig->streamType = M4ST_OD; esd->decoderConfig->objectTypeIndication = GPAC_STATIC_OD_OTI; esd->ESID = 1; ChainAddEntry(od->ESDescriptors, esd); e = OD_EncDesc((Descriptor *) od, raw_iod, raw_iod_size); OD_DeleteDescriptor((Descriptor **)&od); return e; }
static void AAC_SetupObject(AACReader *read) { GF_ESD *esd; GF_ObjectDescriptor *od = (GF_ObjectDescriptor *) gf_odf_desc_new(GF_ODF_OD_TAG); od->objectDescriptorID = 1; esd = AAC_GetESD(read); esd->OCRESID = 0; gf_list_add(od->ESDescriptors, esd); gf_term_add_media(read->service, (GF_Descriptor*)od, 0); }
static GF_Descriptor *AAC_GetServiceDesc(GF_InputService *plug, u32 expect_type, const char *sub_url) { AACReader *read = plug->priv; /*since we don't handle multitrack in aac, we don't need to check sub_url, only use expected type*/ /*audio object*/ if (expect_type==GF_MEDIA_OBJECT_AUDIO) { GF_ESD *esd; GF_ObjectDescriptor *od = (GF_ObjectDescriptor *) gf_odf_desc_new(GF_ODF_OD_TAG); od->objectDescriptorID = 1; esd = AAC_GetESD(read); esd->OCRESID = 0; gf_list_add(od->ESDescriptors, esd); return (GF_Descriptor *) od; } read->is_inline = 1; /*inline scene: no specific service*/ return NULL; }
static M4Err AAC_ChannelGetSLP(NetClientPlugin *plug, LPNETCHANNEL channel, char **out_data_ptr, u32 *out_data_size, struct tagSLHeader *out_sl_hdr, Bool *sl_compressed, M4Err *out_reception_status, Bool *is_new_data) { u32 pos, start_from; Bool sync; BitStream *bs; ADTSHeader hdr; AACReader *read = plug->priv; *out_reception_status = M4OK; *sl_compressed = 0; *is_new_data = 0; memset(&read->sl_hdr, 0, sizeof(SLHeader)); read->sl_hdr.randomAccessPointFlag = 1; read->sl_hdr.compositionTimeStampFlag = 1; if (read->od_ch == channel) { LPODCODEC codec; ObjectDescriptor *od; ObjectDescriptorUpdate *odU; ESDescriptor *esd; if (read->od_done) { *out_reception_status = M4EOF; return M4OK; } read->sl_hdr.compositionTimeStamp = (u64) (read->start_range * 1000); *out_sl_hdr = read->sl_hdr; if (!read->od_data) { *is_new_data = 1; odU = (ObjectDescriptorUpdate *) OD_NewCommand(ODUpdate_Tag); od = (ObjectDescriptor *) OD_NewDescriptor(ObjectDescriptor_Tag); od->objectDescriptorID = ISMA_AUDIO_OD_ID; esd = AAC_GetESD(read); /*we signal start/end of units in live mode*/ ChainAddEntry(od->ESDescriptors, esd); ChainAddEntry(odU->objectDescriptors, od); codec = OD_NewCodec(OD_WRITE); OD_AddCommand(codec, (ODCommand *)odU); OD_EncodeAU(codec); OD_GetEncodedAU(codec, &read->od_data, &read->od_data_size); OD_DeleteCodec(codec); } *out_data_ptr = read->od_data; *out_data_size = read->od_data_size; return M4OK; } if (read->es_ch != channel) return M4ChannelNotFound; /*fetching es data*/ if (read->es_done) { *out_reception_status = M4EOF; return M4OK; } if (!read->es_data) { if (!read->stream) { *out_data_ptr = NULL; *out_data_size = 0; return M4OK; } bs = NewBitStreamFromFile(read->stream, BS_FILE_READ); *is_new_data = 1; fetch_next: pos = ftell(read->stream); sync = ADTS_SyncFrame(bs, !read->is_remote, &hdr); if (!sync) { DeleteBitStream(bs); if (!read->dnload) { *out_reception_status = M4EOF; read->es_done = 1; } else { fseek(read->stream, pos, SEEK_SET); *out_reception_status = M4OK; } return M4OK; } if (!hdr.frame_size) { DeleteBitStream(bs); *out_reception_status = M4EOF; read->es_done = 1; return M4OK; } read->es_data_size = hdr.frame_size; read->nb_samp = 1024; /*we're seeking*/ if (read->start_range && read->duration) { start_from = (u32) (read->start_range * read->sample_rate); if (read->current_time + read->nb_samp < start_from) { read->current_time += read->nb_samp; goto fetch_next; } else { read->start_range = 0; } } read->sl_hdr.compositionTimeStamp = read->current_time; read->es_data = malloc(sizeof(char) * (read->es_data_size+read->pad_bytes)); BS_ReadData(bs, read->es_data, read->es_data_size); if (read->pad_bytes) memset(read->es_data + read->es_data_size, 0, sizeof(char) * read->pad_bytes); DeleteBitStream(bs); } *out_sl_hdr = read->sl_hdr; *out_data_ptr = read->es_data; *out_data_size = read->es_data_size; return M4OK; }