⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aac_in.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
					/*get amount downloaded and check*/					gf_dm_sess_get_stats(read->dnload, NULL, NULL, NULL, &bytes_done, NULL, NULL);					if (bytes_done>10*1024) {						e = GF_CORRUPTED_DATA;					} else {						fclose(read->stream);						read->stream = NULL;						return;					}				}			}		}	}	/*OK confirm*/	if (read->needs_connection) {		read->needs_connection = 0;		gf_term_on_connect(read->service, NULL, e);		if (!e) AAC_SetupObject(read);	}}void aac_download_file(GF_InputService *plug, char *url){	AACReader *read = (AACReader*) plug->priv;	read->needs_connection = 1;	read->dnload = gf_term_download_new(read->service, url, 0, AAC_NetIO, read);	if (!read->dnload ) {		read->needs_connection = 0;		gf_term_on_connect(read->service, NULL, GF_NOT_SUPPORTED);	}	/*service confirm is done once fetched*/}static GF_Err AAC_ConnectService(GF_InputService *plug, GF_ClientService *serv, const char *url){	char szURL[2048];	char *ext;	GF_Err reply;	AACReader *read = plug->priv;	read->service = serv;	if (read->dnload) gf_term_download_del(read->dnload);	read->dnload = NULL;	strcpy(szURL, url);	ext = strrchr(szURL, '#');	if (ext) ext[0] = 0;	/*remote fetch*/	read->is_remote = !aac_is_local(szURL);	if (read->is_remote) {		aac_download_file(plug, (char *) szURL);		return GF_OK;	}	reply = GF_OK;	read->stream = fopen(szURL, "rb");	if (!read->stream) {		reply = GF_URL_ERROR;	} else if (!AAC_ConfigureFromFile(read)) {		fclose(read->stream);		read->stream = NULL;		reply = GF_NOT_SUPPORTED;	}	gf_term_on_connect(serv, NULL, reply);	if (!reply && read->is_inline ) AAC_SetupObject(read);	return GF_OK;}static GF_Err AAC_CloseService(GF_InputService *plug){	AACReader *read = plug->priv;	if (read->stream) fclose(read->stream);	read->stream = NULL;	if (read->dnload) gf_term_download_del(read->dnload);	read->dnload = NULL;	if (read->data) free(read->data);	read->data = NULL;	gf_term_on_disconnect(read->service, NULL, GF_OK);	return GF_OK;}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 GF_Err AAC_ConnectChannel(GF_InputService *plug, LPNETCHANNEL channel, const char *url, Bool upstream){	u32 ES_ID;	GF_Err e;	AACReader *read = plug->priv;	e = GF_SERVICE_ERROR;	if (read->ch==channel) goto exit;	e = GF_STREAM_NOT_FOUND;	if (strstr(url, "ES_ID")) {		sscanf(url, "ES_ID=%d", &ES_ID);	}	/*URL setup*/	else if (!read->ch && AAC_CanHandleURL(plug, url)) ES_ID = 1;	if (ES_ID==1) {		read->ch = channel;		e = GF_OK;	}exit:	gf_term_on_connect(read->service, channel, e);	return e;}static GF_Err AAC_DisconnectChannel(GF_InputService *plug, LPNETCHANNEL channel){	AACReader *read = plug->priv;	GF_Err e = GF_STREAM_NOT_FOUND;	if (read->ch == channel) {		read->ch = NULL;		if (read->data) free(read->data);		read->data = NULL;		e = GF_OK;	}	gf_term_on_disconnect(read->service, channel, e);	return GF_OK;}static GF_Err AAC_ServiceCommand(GF_InputService *plug, GF_NetworkCommand *com){	AACReader *read = plug->priv;	if (com->base.command_type==GF_NET_SERVICE_INFO) {		com->info.name = read->icy_track_name ? read->icy_track_name : read->icy_name;		com->info.comment = read->icy_genre;		return GF_OK;	}	if (!com->base.on_channel) {		/*if live session we may cache*/		if (read->is_live && (com->command_type==GF_NET_IS_CACHABLE)) return GF_OK;		return GF_NOT_SUPPORTED;	}	switch (com->command_type) {	case GF_NET_CHAN_SET_PULL:		if ((read->ch == com->base.on_channel) && read->is_live) return GF_NOT_SUPPORTED;		return GF_OK;	case GF_NET_CHAN_INTERACTIVE:		if ((read->ch == com->base.on_channel) && read->is_live) return GF_NOT_SUPPORTED;		return GF_OK;	case GF_NET_CHAN_BUFFER:		if ((read->ch == com->base.on_channel) && read->is_live) {			if (com->buffer.max<1000) com->buffer.max = 1000;			com->buffer.min = com->buffer.max/2;		}		return GF_OK;	case GF_NET_CHAN_SET_PADDING:		read->pad_bytes = com->pad.padding_bytes;		return GF_OK;	case GF_NET_CHAN_DURATION:		com->duration.duration = read->duration;		com->duration.duration /= read->sample_rate;		return GF_OK;	case GF_NET_CHAN_PLAY:		read->start_range = com->play.start_range;		read->end_range = com->play.end_range;		read->current_time = 0;		if (read->stream) fseek(read->stream, 0, SEEK_SET);		if (read->ch == com->base.on_channel) { 			read->done = 0; 			/*PLAY after complete download, estimate duration*/			if (!read->is_remote && !read->duration) {				AAC_ConfigureFromFile(read);				if (read->duration) {					GF_NetworkCommand rcfg;					rcfg.base.on_channel = read->ch;					rcfg.base.command_type = GF_NET_CHAN_DURATION;					rcfg.duration.duration = read->duration;					rcfg.duration.duration /= read->sample_rate;					gf_term_on_command(read->service, &rcfg, GF_OK);				}			}		}		return GF_OK;	case GF_NET_CHAN_STOP:		return GF_OK;	default:		return GF_OK;	}}static GF_Err AAC_ChannelGetSLP(GF_InputService *plug, LPNETCHANNEL channel, char **out_data_ptr, u32 *out_data_size, GF_SLHeader *out_sl_hdr, Bool *sl_compressed, GF_Err *out_reception_status, Bool *is_new_data){	u32 pos, start_from;	Bool sync;	GF_BitStream *bs;	ADTSHeader hdr;	AACReader *read = plug->priv;	*out_reception_status = GF_OK;	*sl_compressed = 0;	*is_new_data = 0;	memset(&read->sl_hdr, 0, sizeof(GF_SLHeader));	read->sl_hdr.randomAccessPointFlag = 1;	read->sl_hdr.compositionTimeStampFlag = 1;	if (read->ch != channel) return GF_STREAM_NOT_FOUND;	/*fetching es data*/	if (read->done) {		*out_reception_status = GF_EOS;		return GF_OK;	}	if (!read->data) {		if (!read->stream) {			*out_data_ptr = NULL;			*out_data_size = 0;			return GF_OK;		}		bs = gf_bs_from_file(read->stream, GF_BITSTREAM_READ);		*is_new_data = 1;fetch_next:		pos = ftell(read->stream);		sync = ADTS_SyncFrame(bs, !read->is_remote, &hdr);		if (!sync) {			gf_bs_del(bs);			if (!read->dnload) {				*out_reception_status = GF_EOS;				read->done = 1;			} else {				fseek(read->stream, pos, SEEK_SET);				*out_reception_status = GF_OK;			}			return GF_OK;		}		if (!hdr.frame_size) {			gf_bs_del(bs);			*out_reception_status = GF_EOS;			read->done = 1;			return GF_OK;		}		read->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->data = malloc(sizeof(char) * (read->data_size+read->pad_bytes));		gf_bs_read_data(bs, read->data, read->data_size);		if (read->pad_bytes) memset(read->data + read->data_size, 0, sizeof(char) * read->pad_bytes);		gf_bs_del(bs);	}	*out_sl_hdr = read->sl_hdr;	*out_data_ptr = read->data;	*out_data_size = read->data_size;	return GF_OK;}static GF_Err AAC_ChannelReleaseSLP(GF_InputService *plug, LPNETCHANNEL channel){	AACReader *read = plug->priv;	if (read->ch == channel) {		if (!read->data) return GF_BAD_PARAM;		free(read->data);		read->data = NULL;		read->current_time += read->nb_samp;		return GF_OK;	}	return GF_BAD_PARAM;}GF_InputService *AAC_Load(){	AACReader *reader;	GF_InputService *plug = malloc(sizeof(GF_InputService));	memset(plug, 0, sizeof(GF_InputService));	GF_REGISTER_MODULE_INTERFACE(plug, GF_NET_CLIENT_INTERFACE, "GPAC AAC Reader", "gpac distribution")	plug->CanHandleURL = AAC_CanHandleURL;	plug->ConnectService = AAC_ConnectService;	plug->CloseService = AAC_CloseService;	plug->GetServiceDescriptor = AAC_GetServiceDesc;	plug->ConnectChannel = AAC_ConnectChannel;	plug->DisconnectChannel = AAC_DisconnectChannel;	plug->ServiceCommand = AAC_ServiceCommand;	/*we do support pull mode*/	plug->ChannelGetSLP = AAC_ChannelGetSLP;	plug->ChannelReleaseSLP = AAC_ChannelReleaseSLP;	reader = malloc(sizeof(AACReader));	memset(reader, 0, sizeof(AACReader));	plug->priv = reader;	return plug;}void AAC_Delete(void *ifce){	GF_InputService *plug = (GF_InputService *) ifce;	AACReader *read = plug->priv;	free(read);	free(plug);}GF_EXPORTBool QueryInterface(u32 InterfaceType) {	if (InterfaceType == GF_NET_CLIENT_INTERFACE) return 1;#ifdef GPAC_HAS_FAAD	if (InterfaceType == GF_MEDIA_DECODER_INTERFACE) return 1;#endif	return 0;}#ifdef GPAC_HAS_FAADGF_BaseDecoder *NewFAADDec();void DeleteFAADDec(GF_BaseDecoder *ifcg);#endifGF_EXPORTGF_BaseInterface *LoadInterface(u32 InterfaceType) {	if (InterfaceType == GF_NET_CLIENT_INTERFACE) return (GF_BaseInterface *)AAC_Load();#ifdef GPAC_HAS_FAAD	if (InterfaceType == GF_MEDIA_DECODER_INTERFACE) return (GF_BaseInterface *)NewFAADDec();#endif	return NULL;}GF_EXPORTvoid ShutdownInterface(GF_BaseInterface *ifce){	switch (ifce->InterfaceType) {#ifdef GPAC_HAS_FAAD	case GF_MEDIA_DECODER_INTERFACE:		DeleteFAADDec((GF_BaseDecoder *)ifce);		break;#endif	case GF_NET_CLIENT_INTERFACE:		AAC_Delete(ifce);		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -