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

📄 media_import.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (!track) {			e = gf_isom_last_error(import->dest);			goto exit;		}		gf_isom_set_track_enabled(import->dest, track, 1);		if (import->esd && !import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track);		/*setup data ref*/		urn = url = NULL;		if (import->flags & GF_IMPORT_USE_DATAREF) {			url = gf_isom_get_filename(import->orig);			if (!gf_isom_is_self_contained(import->orig, track_in, 1)) {				e = gf_isom_get_data_reference(import->orig, track_in, 1, &url, &urn);				if (e) goto exit;			}		}		e = gf_isom_new_mpeg4_description(import->dest, track, origin_esd, (char *) url, (char *) urn, &di);		if (e) goto exit;		/*copy over language*/		lang[3] = 0;		gf_isom_get_media_language(import->orig, track_in, lang);		gf_isom_set_media_language(import->dest, track, lang);	} else {		if (! (import->flags & GF_IMPORT_KEEP_ALL_TRACKS) ) {			mstype = gf_isom_get_media_subtype(import->orig, track_in, 1);			switch (mstype) {			case GF_ISOM_SUBTYPE_MPEG4:			case GF_ISOM_SUBTYPE_MPEG4_CRYP:			case GF_ISOM_SUBTYPE_AVC_H264:			case GF_ISOM_SUBTYPE_3GP_H263:			case GF_ISOM_SUBTYPE_3GP_AMR:			case GF_ISOM_SUBTYPE_3GP_AMR_WB:			case GF_ISOM_SUBTYPE_3GP_EVRC:			case GF_ISOM_SUBTYPE_3GP_QCELP:			case GF_ISOM_SUBTYPE_3GP_SMV:				break;			default:				switch (mtype) {				case GF_ISOM_MEDIA_HINT:				case GF_ISOM_MEDIA_TEXT:					break;				default:					return gf_import_message(import, GF_OK, "IsoMedia import - skipping track ID %d (unknown type \'%s\')", trackID, gf_4cc_to_str(mstype));				}			}		}		e = gf_isom_clone_track(import->orig, track_in, import->dest, (import->flags & GF_IMPORT_USE_DATAREF), &track);		is_clone = 1;		di = 1;		if (e) goto exit;	}	if (e) goto exit;	import->final_trackID = gf_isom_get_track_id(import->dest, track);	switch (mtype) {	case GF_ISOM_MEDIA_VISUAL:		if (!is_clone) {			gf_isom_set_visual_info(import->dest, track, di, w, h);			gf_media_update_par(import->dest, track);		}		gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - Video (size %d x %d)", trackID, w, h);		break;	case GF_ISOM_MEDIA_AUDIO:	{		if (!is_clone) gf_isom_set_audio_info(import->dest, track, di, (sbr==2) ? sbr_sr : sr, (ch>1) ? 2 : 1, bps);		if (sbr) {			gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - HE-AAC (SR %d - SBR-SR %d - %d channels)", trackID, sr, sbr_sr, ch);		} else {			gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - Audio (SR %d - %d channels)", trackID, sr, ch);		}	}		break;	case GF_ISOM_MEDIA_SUBPIC:		if (!is_clone) {			gf_isom_set_track_layout_info(import->dest, track, w << 16, h << 16, trans_x, trans_y, layer);		}		gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - VobSub (size %d x %d)", trackID, w, h);		break;	default:	{		char szT[5];		mstype = gf_isom_get_mpeg4_subtype(import->orig, track_in, di);		if (!mstype) mstype = gf_isom_get_media_subtype(import->orig, track_in, di);		strcpy(szT, gf_4cc_to_str(mtype));		gf_import_message(import, GF_OK, "IsoMedia import - track ID %d - media type \"%s:%s\"", 			trackID, szT, gf_4cc_to_str(mstype));	}		break;	}	duration = (u32) (((Double)import->duration * gf_isom_get_media_timescale(import->orig, track_in)) / 1000);	num_samples = gf_isom_get_sample_count(import->orig, track_in);	for (i=0; i<num_samples; i++) {		if (import->flags & GF_IMPORT_USE_DATAREF) {			samp = gf_isom_get_sample_info(import->orig, track_in, i+1, &di, &offset);			if (!samp) {				e = gf_isom_last_error(import->orig);				goto exit;			}			e = gf_isom_add_sample_reference(import->dest, track, di, samp, offset);		} else {			samp = gf_isom_get_sample(import->orig, track_in, i+1, &di);			e = gf_isom_add_sample(import->dest, track, di, samp);		}		sampDTS = samp->DTS;		gf_isom_sample_del(&samp);		gf_set_progress("Importing ISO File", i+1, num_samples);		if (duration && (sampDTS > duration) ) break;		if (import->flags & GF_IMPORT_DO_ABORT) break;		if (e) break;	}	if (import->esd) {		if (!import->esd->slConfig) {			import->esd->slConfig = origin_esd ? origin_esd->slConfig : NULL;			if (origin_esd) origin_esd->slConfig = NULL;		}		if (!import->esd->decoderConfig) {			import->esd->decoderConfig = origin_esd ? origin_esd->decoderConfig : NULL;			if (origin_esd) origin_esd->decoderConfig = NULL;		}	}			MP4T_RecomputeBitRate(import->dest, track);exit:	if (origin_esd) gf_odf_desc_del((GF_Descriptor *) origin_esd);	return e;}#include "mpeg2_ps.h"GF_Err gf_import_mpeg_ps_video(GF_MediaImporter *import){	GF_Err e;	mpeg2ps_t *ps;	Double FPS;	char *buf;	u8 ftype;	u32 track, di, streamID, mtype, w, h, nb_streams, buf_len, frames, ref_frame, timescale, duration, file_size, dts_inc, last_pos;	Bool destroy_esd;	if (import->flags & GF_IMPORT_USE_DATAREF) 		return gf_import_message(import, GF_NOT_SUPPORTED, "Cannot use data referencing with MPEG-1/2 files");	/*no auto frame-rate detection*/	if (import->video_fps == 10000.0) import->video_fps = 25.0;	ps = mpeg2ps_init(import->in_name);	if (!ps) return gf_import_message(import, GF_NON_COMPLIANT_BITSTREAM, "Failed to open MPEG file %s", import->in_name);	if (import->flags & GF_IMPORT_PROBE_ONLY) {		u32 i, nb_v_str;		import->nb_tracks = 0;		nb_v_str = nb_streams = mpeg2ps_get_video_stream_count(ps);		for (i=0; i<nb_streams; i++) {			import->tk_info[import->nb_tracks].track_num = i+1;			import->tk_info[import->nb_tracks].type = GF_ISOM_MEDIA_VISUAL;			import->tk_info[import->nb_tracks].flags = GF_IMPORT_OVERRIDE_FPS;			import->tk_info[import->nb_tracks].video_info.FPS = mpeg2ps_get_video_stream_framerate(ps, i);			import->tk_info[import->nb_tracks].video_info.width = mpeg2ps_get_video_stream_width(ps, i);			import->tk_info[import->nb_tracks].video_info.height = mpeg2ps_get_video_stream_height(ps, i);			import->tk_info[import->nb_tracks].video_info.par = mpeg2ps_get_video_stream_aspect_ratio(ps, i);			import->tk_info[import->nb_tracks].media_type = GF_4CC('M', 'P', 'G', '1');			if (mpeg2ps_get_video_stream_type(ps, i) == MPEG_VIDEO_MPEG2) import->tk_info[import->nb_tracks].media_type ++;			import->nb_tracks++;		}		nb_streams = mpeg2ps_get_audio_stream_count(ps);		for (i=0; i<nb_streams; i++) {			import->tk_info[import->nb_tracks].track_num = nb_v_str + i+1;			import->tk_info[import->nb_tracks].type = GF_ISOM_MEDIA_AUDIO;			switch (mpeg2ps_get_audio_stream_type(ps, i)) {			case MPEG_AUDIO_MPEG: import->tk_info[import->nb_tracks].media_type = GF_4CC('M','P','G','A'); break;			case MPEG_AUDIO_AC3: import->tk_info[import->nb_tracks].media_type = GF_4CC('A','C','3',' '); break;			case MPEG_AUDIO_LPCM: import->tk_info[import->nb_tracks].media_type = GF_4CC('L','P','C','M'); break;			default: import->tk_info[import->nb_tracks].media_type = GF_4CC('U','N','K',' '); break;			}			import->tk_info[import->nb_tracks].audio_info.sample_rate = mpeg2ps_get_audio_stream_sample_freq(ps, i);			import->tk_info[import->nb_tracks].audio_info.nb_channels = mpeg2ps_get_audio_stream_channels(ps, i);			import->nb_tracks ++;		}		mpeg2ps_close(ps);		return GF_OK;	}	streamID = 0;	nb_streams = mpeg2ps_get_video_stream_count(ps);	if ((nb_streams>1) && !import->trackID) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_BAD_PARAM, "%d video tracks in MPEG file - please indicate track to import", nb_streams);	}	/*audio*/	if (import->trackID>nb_streams) {		mpeg2ps_close(ps);		return GF_OK;	}	if (import->trackID) streamID = import->trackID - 1;	if (streamID>=nb_streams) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_BAD_PARAM, "Desired video track not found in MPEG file (%d visual streams)", nb_streams);	}	w = mpeg2ps_get_video_stream_width(ps, streamID);	h = mpeg2ps_get_video_stream_height(ps, streamID);	mtype = (mpeg2ps_get_video_stream_type(ps, streamID) == MPEG_VIDEO_MPEG2) ? 0x61 : 0x6A;	FPS = mpeg2ps_get_video_stream_framerate(ps, streamID);	if (import->video_fps) FPS = (Double) import->video_fps;	get_video_timing(FPS, &timescale, &dts_inc);	duration = import->duration*timescale;	duration /= 1000;	destroy_esd = 0;	if (!import->esd) {		destroy_esd = 1;		import->esd = gf_odf_desc_esd_new(0);	}	track = gf_isom_new_track(import->dest, import->esd->ESID, GF_ISOM_MEDIA_VISUAL, timescale);	e = gf_isom_last_error(import->dest);	if (!track) goto exit;	gf_isom_set_track_enabled(import->dest, track, 1);	if (!import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track);	import->final_trackID = import->esd->ESID;	if (!import->esd->decoderConfig) import->esd->decoderConfig = (GF_DecoderConfig *) gf_odf_desc_new(GF_ODF_DCD_TAG);	if (!import->esd->slConfig) import->esd->slConfig = (GF_SLConfig *) gf_odf_desc_new(GF_ODF_SLC_TAG);	import->esd->slConfig->timestampResolution = timescale;	if (import->esd->decoderConfig->decoderSpecificInfo) gf_odf_desc_del((GF_Descriptor *) import->esd->decoderConfig->decoderSpecificInfo);	import->esd->decoderConfig->decoderSpecificInfo = NULL;	import->esd->decoderConfig->streamType = GF_STREAM_VISUAL;	import->esd->decoderConfig->objectTypeIndication = mtype;	e = gf_isom_new_mpeg4_description(import->dest, track, import->esd, NULL, NULL, &di);	if (e) goto exit;	gf_import_message(import, GF_OK, "%s Video import - Resolution %d x %d @ %02.4f FPS", (mtype==0x6A) ? "MPEG-1" : "MPEG-2", w, h, FPS);	gf_isom_set_visual_info(import->dest, track, di, w, h);	gf_isom_set_cts_packing(import->dest, track, 1);	file_size = (u32) mpeg2ps_get_ps_size(ps);	last_pos = 0;	frames = 1;	ref_frame = 1;	while (mpeg2ps_get_video_frame(ps, streamID, (u8 **) &buf, &buf_len, &ftype, TS_90000, NULL)) {		GF_ISOSample *samp;		if ((buf[buf_len - 4] == 0) && (buf[buf_len - 3] == 0) && (buf[buf_len - 2] == 1)) buf_len -= 4;		samp = gf_isom_sample_new();		samp->data = buf;		samp->dataLength = buf_len;		samp->DTS = dts_inc*(frames-1);		samp->IsRAP = (ftype==1) ? 1 : 0;		samp->CTS_Offset = 0;		gf_isom_add_sample(import->dest, track, di, samp);		samp->data = NULL;		gf_isom_sample_del(&samp);		last_pos = (u32) mpeg2ps_get_video_pos(ps, streamID);		gf_set_progress("Importing MPEG-PS Video", last_pos/1024, file_size/1024);		if (ftype != 3) {			gf_isom_modify_cts_offset(import->dest, track, ref_frame, (frames-ref_frame)*dts_inc);			ref_frame = frames;		}		frames++;		if (duration && (dts_inc*(frames-1) >= duration) ) break;		if (import->flags & GF_IMPORT_DO_ABORT) break;	}	gf_isom_set_cts_packing(import->dest, track, 0);	if (last_pos!=file_size) gf_set_progress("Importing MPEG-PS Video", frames, frames);	MP4T_RecomputeBitRate(import->dest, track);exit:	if (import->esd && destroy_esd) {		gf_odf_desc_del((GF_Descriptor *) import->esd);		import->esd = NULL;	}	mpeg2ps_close(ps);	return e;}GF_Err gf_import_mpeg_ps_audio(GF_MediaImporter *import){	GF_Err e;	mpeg2ps_t *ps;	char *buf;	u32 track, di, streamID, mtype, sr, nb_ch, nb_streams, buf_len, frames, hdr, duration, file_size, last_pos;	Bool destroy_esd;	GF_ISOSample *samp;	if (import->flags & GF_IMPORT_PROBE_ONLY) return GF_OK;	if (import->flags & GF_IMPORT_USE_DATAREF) 		return gf_import_message(import, GF_NOT_SUPPORTED, "Cannot use data referencing with MPEG-1/2 files");	ps = mpeg2ps_init(import->in_name);	if (!ps) return gf_import_message(import, GF_NON_COMPLIANT_BITSTREAM, "Failed to open MPEG file %s", import->in_name);	streamID = 0;	nb_streams = mpeg2ps_get_audio_stream_count(ps);	if ((nb_streams>1) && !import->trackID) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_BAD_PARAM, "%d audio tracks in MPEG file - please indicate track to import", nb_streams);	}	if (import->trackID) {		u32 nb_v = mpeg2ps_get_video_stream_count(ps);		/*video*/		if (import->trackID<=nb_v) {			mpeg2ps_close(ps);			return GF_OK;		}		streamID = import->trackID - 1 - nb_v;	}	if (streamID>=nb_streams) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_BAD_PARAM, "Desired audio track not found in MPEG file (%d audio streams)", nb_streams);	}		mtype = mpeg2ps_get_audio_stream_type(ps, streamID);	if (mtype != MPEG_AUDIO_MPEG) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_NOT_SUPPORTED, "Audio format not supported in MP4");	}	if (mpeg2ps_get_audio_frame(ps, streamID, (u8**) &buf, &buf_len, TS_90000, NULL, NULL) == 0) {		mpeg2ps_close(ps);		return gf_import_message(import, GF_IO_ERR, "Cannot fetch audio frame from MPEG file");	}    	hdr = GF_4CC(buf[0],buf[1],buf[2],buf[3]);	mtype = gf_mp3_object_type_indication(hdr);	sr = gf_mp3_sampling_rate(hdr);	nb_ch = gf_mp3_num_channels(hdr);	destroy_esd = 0;	if (!import->esd) {		destroy_esd = 1;		import->esd = gf_odf_desc_esd_new(0);	}	track = gf_isom_new_track(import->dest, import->esd->ESID, GF_ISOM_MEDIA_AUDIO, sr);	e = gf_isom_last_error(import->dest);	if (!track) goto exit;	gf_isom_set_track_enabled(import->dest, track, 1);	if (!import->esd->ESID) import->esd->ESID = gf_isom_get_track_id(import->dest, track);	import->final_trackID = import->esd->ESID;	if (!import->esd->decoderConfig) import->esd->decoderConfig = (GF_DecoderConfig *) gf_odf_desc_new(GF_ODF_DCD_TAG);	if (!import->esd->slConfig) import->esd->slConfig = (GF_SLConfig *) gf_odf_desc_new(GF_ODF_SLC_TAG);	import->esd->slConfig->timestampResolution = sr;	if (import->esd->decoderConfig->decoderSpecificInfo) gf_odf_desc_del((GF_Descriptor *) import->esd->decoderConfig->decoderSpecificInfo);	import->esd->decoderConfig->decoderSpecificInfo = NULL;	import->esd->decoderConfig->streamType = GF_STREAM_AUDIO;	import->esd->decoderConfig->objectTypeIndication = mtype;	e = gf_isom_new_mpeg4_description(import->dest, track, import->esd, NULL, NULL, &di);	if (e) goto exit;	gf_isom_set_audio_info(import->dest, track, di, sr, nb_ch, 16);	gf_import_message(import, GF_OK, "%s Audio import - sample rate %d - %d channel%s", (mtype==0x6B) ? "MPEG-1" : "MPEG-2", sr, nb_ch, (nb_ch>1) ? "s" : "");	duration = (u32) ((Double)import->duration/1000.0 * sr);	samp = gf_isom_sample_new();	samp->IsRAP = 1;	samp->DTS = 0;	file_size = (u32) mpeg2ps_get_ps_size(ps);	last_pos = 0;	frames = 0;	do {		samp->data = buf;		samp->dataLength = buf_len;		g

⌨️ 快捷键说明

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