亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? quicktime.c

?? MPEG-4編解碼的實現(包括MPEG4視音頻編解碼)
?? C
?? 第 1 頁 / 共 3 頁
字號:
#include "quicktime.h"


int quicktime_make_streamable(char *in_path, char *out_path)
{
	quicktime_t file, *old_file, new_file;
	int moov_exists = 0, mdat_exists = 0, result, atoms = 1;
	long mdat_start, mdat_size;
	quicktime_atom_t leaf_atom;
	long moov_length;
	
	quicktime_init(&file);

/* find the moov atom in the old file */
	
	if(!(file.stream = fopen(in_path, "rb")))
	{
		perror("quicktime_make_streamable");
		return 1;
	}

	fseek(file.stream, 0, SEEK_END);
	file.total_length = ftell(file.stream);
	fseek(file.stream, 0, SEEK_SET);

/* get the locations of moov and mdat atoms */
	do
	{
/*printf("%x\n", quicktime_position(&file)); */
		result = quicktime_atom_read_header(&file, &leaf_atom);

		if(!result)
		{
			if(quicktime_atom_is(&leaf_atom, "moov"))
			{
				moov_exists = atoms;
				moov_length = leaf_atom.size;
			}
			else
			if(quicktime_atom_is(&leaf_atom, "mdat"))
			{
				mdat_start = quicktime_position(&file) - HEADER_LENGTH;
				mdat_size = leaf_atom.size;
				mdat_exists = atoms;
			}

			quicktime_atom_skip(&file, &leaf_atom);

			atoms++;
		}
	}while(!result && quicktime_position(&file) < file.total_length);

	fclose(file.stream);

	if(!moov_exists)
	{
		printf("quicktime_make_streamable: no moov atom\n");
		return 1;
	}

	if(!mdat_exists)
	{
		printf("quicktime_make_streamable: no mdat atom\n");
		return 1;
	}

/* copy the old file to the new file */
	if(moov_exists && mdat_exists)
	{
/* moov wasn't the first atom */
		if(moov_exists > 1)
		{
			char *buffer;
			long buf_size = 1000000;

			result = 0;

/* read the header proper */
			if(!(old_file = quicktime_open(in_path, 1, 0, 0)))
			{
				return 1;
			}

			quicktime_shift_offsets(&(old_file->moov), moov_length);

/* open the output file */
			if(!(new_file.stream = fopen(out_path, "wb")))
			{
				perror("quicktime_make_streamable");
				result =  1;
			}
			else
			{
/* set up some flags */
				new_file.wr = 1;
				new_file.rd = 0;
				quicktime_write_moov(&new_file, &(old_file->moov));

				quicktime_set_position(old_file, mdat_start);

				if(!(buffer = calloc(1, buf_size)))
				{
					result = 1;
					printf("quicktime_make_streamable: out of memory\n");
				}
				else
				{
					while(quicktime_position(old_file) < mdat_start + mdat_size && !result)
					{
						if(quicktime_position(old_file) + buf_size > mdat_start + mdat_size)
							buf_size = mdat_start + mdat_size - quicktime_position(old_file);

						if(!quicktime_read_data(old_file, buffer, buf_size)) result = 1;
						if(!result)
						{
							if(!quicktime_write_data(&new_file, buffer, buf_size)) result = 1;
						}
					}
					free(buffer);
				}
				fclose(new_file.stream);
			}
			quicktime_close(old_file);
		}
		else
		{
			printf("quicktime_make_streamable: header already at 0 offset\n");
			return 0;
		}
	}
	
	return 0;
}

int quicktime_set_time_scale(quicktime_t *file, int time_scale)
{
	file->moov.mvhd.time_scale = time_scale;
}

int quicktime_set_copyright(quicktime_t *file, char *string)
{
	quicktime_set_udta_string(&(file->moov.udta.copyright), &(file->moov.udta.copyright_len), string);
}

int quicktime_set_name(quicktime_t *file, char *string)
{
	quicktime_set_udta_string(&(file->moov.udta.name), &(file->moov.udta.name_len), string);
}

int quicktime_set_info(quicktime_t *file, char *string)
{
	quicktime_set_udta_string(&(file->moov.udta.info), &(file->moov.udta.info_len), string);
}

int quicktime_get_time_scale(quicktime_t *file)
{
	return file->moov.mvhd.time_scale;
}

char* quicktime_get_copyright(quicktime_t *file)
{
	return file->moov.udta.copyright;
}

char* quicktime_get_name(quicktime_t *file)
{
	return file->moov.udta.name;
}

char* quicktime_get_info(quicktime_t *file)
{
	return file->moov.udta.info;
}

int quicktime_get_iod_audio_profile_level(quicktime_t *file)
{
	return file->moov.iods.audioProfileId;
}

int quicktime_set_iod_audio_profile_level(quicktime_t *file, int id)
{
	quicktime_iods_set_audio_profile(&file->moov.iods, id);
}

int quicktime_get_iod_video_profile_level(quicktime_t *file)
{
	return file->moov.iods.videoProfileId;
}

int quicktime_set_iod_video_profile_level(quicktime_t *file, int id)
{
	quicktime_iods_set_video_profile(&file->moov.iods, id);
}

int quicktime_video_tracks(quicktime_t *file)
{
	int i, result = 0;
	for(i = 0; i < file->moov.total_tracks; i++)
	{
		if(file->moov.trak[i]->mdia.minf.is_video) result++;
	}
	return result;
}

int quicktime_audio_tracks(quicktime_t *file)
{
	int i, result = 0;
	quicktime_minf_t *minf;
	for(i = 0; i < file->moov.total_tracks; i++)
	{
		minf = &(file->moov.trak[i]->mdia.minf);
		if(minf->is_audio)
			result++;
	}
	return result;
}

int quicktime_set_audio(quicktime_t *file, 
						int channels,
						long sample_rate,
						int bits,
						int sample_size,
						int time_scale,
						int sample_duration,	
						char *compressor)
{
	int i, j;
	quicktime_trak_t *trak;

	/* delete any existing tracks */
	for(i = 0; i < file->total_atracks; i++) {
		for (j = 0; j < file->atracks[i].totalHintTracks; j++) {
			quicktime_delete_trak(&(file->moov), 
				file->atracks[i].hintTracks[j]);
			free(file->atracks[i].hintTracks[j]);
			file->atracks[i].hintTracks[j] = NULL;
			file->total_hint_tracks--;
		}
		quicktime_delete_audio_map(&(file->atracks[i]));
		quicktime_delete_trak(&(file->moov), file->atracks[i].track);
	}
	free(file->atracks);
	file->atracks = NULL;	
	file->total_atracks = 0;

	if(channels) {
		/* Fake the bits parameter for some formats. */
		if(quicktime_match_32(compressor, QUICKTIME_ULAW) ||
			quicktime_match_32(compressor, QUICKTIME_IMA4)) bits = 16;

		file->atracks = (quicktime_audio_map_t*)
			calloc(1, sizeof(quicktime_audio_map_t));
		trak = quicktime_add_track(&(file->moov));
		quicktime_trak_init_audio(file, trak, channels, sample_rate, bits, 
			sample_size, time_scale, sample_duration, compressor);
		quicktime_init_audio_map(&(file->atracks[0]), trak);
		file->atracks[file->total_atracks].track = trak;
		file->atracks[file->total_atracks].channels = channels;
		file->atracks[file->total_atracks].current_position = 0;
		file->atracks[file->total_atracks].current_chunk = 1;
		file->total_atracks++;
	}
	return 1;   /* Return the number of tracks created */
}

int quicktime_set_video(quicktime_t *file, 
						int tracks, 
						int frame_w, 
						int frame_h,
						float frame_rate,
						int time_scale,
						char *compressor)
{
	int i, j;
	quicktime_trak_t *trak;

	/* delete any existing tracks */
	for(i = 0; i < file->total_vtracks; i++) {
		for (j = 0; j < file->vtracks[i].totalHintTracks; j++) {
			quicktime_delete_trak(&(file->moov), 
				file->vtracks[i].hintTracks[j]);
			file->vtracks[i].hintTracks[j] = NULL;
			file->total_hint_tracks--;
		}
		quicktime_delete_video_map(&(file->vtracks[i]));
		quicktime_delete_trak(&(file->moov), file->vtracks[i].track);
	}
	free(file->vtracks);
	file->vtracks = NULL;	
	file->total_vtracks = 0;

	if (tracks > 0) {
		file->total_vtracks = tracks;
		file->vtracks = (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t) * file->total_vtracks);
		for(i = 0; i < tracks; i++)
		{
			trak = quicktime_add_track(&(file->moov));
			quicktime_trak_init_video(file, trak, frame_w, frame_h, frame_rate,
				time_scale, compressor);
			quicktime_init_video_map(&(file->vtracks[i]), trak);
		}
	}
	return 0;
}

int quicktime_set_audio_hint(quicktime_t *file, int audioTrack,
							char *payloadName, u_int* pPayloadNumber, 
							int maxPktSize)
{
	quicktime_audio_map_t* pMap = NULL;
	quicktime_trak_t* hintTrak = NULL;
	int timeScale;
	float frameRate;
	int sampleDuration;
	char rtpMapBuf[128];
	char sdpBuf[256];

	/* check our arguments */
	if (file == NULL) {
		return -1;
	}
	if (audioTrack < 0 || audioTrack > file->total_atracks) {
		return -1;
	}
	if (payloadName == NULL) {
		return -1;
	}

	pMap = &file->atracks[audioTrack];

	timeScale = quicktime_audio_time_scale(file, audioTrack);
	if (timeScale == 0) {
		return -1;
	}
	sampleDuration = file->atracks[audioTrack].track->mdia.minf.stbl.stts.table[0].sample_duration;
	
	/* add the hint track */
	hintTrak = quicktime_add_track(&(file->moov));
	if (*pPayloadNumber == 0) {
		(*pPayloadNumber) = 96 + file->total_hint_tracks++;
	}

	/* initialize it to reference the audio track */
	quicktime_trak_init_hint(file, hintTrak, pMap->track, 
		maxPktSize, timeScale, sampleDuration);

	/* set the payload info */
	hintTrak->hint_udta.hinf.payt.payloadNumber = *pPayloadNumber;
	sprintf(rtpMapBuf, "%s/%u", payloadName, timeScale);
	strcpy(hintTrak->hint_udta.hinf.payt.rtpMapString, rtpMapBuf);

	/* set the SDP media section */
	sprintf(sdpBuf, 
		"m=audio 0 RTP/AVP %u\015\012a=rtpmap:%u %s\015\012a=control:trackID=%u\015\012", 
		*pPayloadNumber, *pPayloadNumber, rtpMapBuf, hintTrak->tkhd.track_id);
	quicktime_sdp_set(&(hintTrak->hint_udta.hnti.sdp), sdpBuf);

	pMap->hintTracks[pMap->totalHintTracks] = hintTrak;
	pMap->hintPositions[pMap->totalHintTracks] = 0;
	pMap->totalHintTracks++;
	return (pMap->totalHintTracks - 1);
}

int quicktime_set_video_hint(quicktime_t *file, int videoTrack, 
						char *payloadName, u_int* pPayloadNumber, 
						int maxPktSize)
{
	quicktime_video_map_t* pMap = NULL;
	quicktime_trak_t* hintTrak = NULL;
	float frameRate;
	int timeScale;
	int sampleDuration;
	char rtpMapBuf[128];
	char sdpBuf[1024];

	/* check our arguments */
	if (file == NULL) {
		return -1;
	}
	if (videoTrack < 0 || videoTrack > file->total_vtracks) {
		return -1;
	}
	if (payloadName == NULL) {
		return -1;
	}

	frameRate = quicktime_video_frame_rate(file, videoTrack);
	if (frameRate == 0.0) {
		return -1;
	}
	timeScale = quicktime_video_time_scale(file, videoTrack);
	if (timeScale == 0) {
		return -1;
	}
	sampleDuration = timeScale / frameRate;
	if (sampleDuration == 0) {
		return -1;
	}

	/* add the hint track */
	hintTrak = quicktime_add_track(&(file->moov));
	if (*pPayloadNumber == 0) {
		(*pPayloadNumber) = 96 + file->total_hint_tracks++;
	}

	pMap = &file->vtracks[videoTrack];

	/* initialize it to reference the video track */
	quicktime_trak_init_hint(file, hintTrak, pMap->track, 
		maxPktSize, timeScale, sampleDuration);

	/* set the payload info */
	hintTrak->hint_udta.hinf.payt.payloadNumber = *pPayloadNumber;
	sprintf(rtpMapBuf, "%s/90000", payloadName);
	strcpy(hintTrak->hint_udta.hinf.payt.rtpMapString, rtpMapBuf);

	/* set the SDP media section */
	sprintf(sdpBuf, 
		"m=video 0 RTP/AVP %u\015\012a=rtpmap:%u %s\015\012a=control:trackID=%u\015\012", 
		*pPayloadNumber, *pPayloadNumber, rtpMapBuf, hintTrak->tkhd.track_id);
	quicktime_sdp_set(&(hintTrak->hint_udta.hnti.sdp), sdpBuf);

	pMap->hintTracks[pMap->totalHintTracks] = hintTrak;
	pMap->hintPositions[pMap->totalHintTracks] = 0;
	pMap->totalHintTracks++;
	return (pMap->totalHintTracks - 1);
}

char* quicktime_get_session_sdp(quicktime_t *file)
{
	return file->moov.udta.hnti.rtp.string;
}

int quicktime_set_session_sdp(quicktime_t *file, char* sdpString)
{
	return quicktime_rtp_set(&(file->moov.udta.hnti.rtp), sdpString);
}

int quicktime_add_audio_sdp(quicktime_t *file, char* sdpString, int track, int hintTrack)
{
	quicktime_trak_t* hintTrak = 
		file->atracks[track].hintTracks[hintTrack];

	quicktime_sdp_append(&(hintTrak->hint_udta.hnti.sdp), sdpString);
}

int quicktime_add_video_sdp(quicktime_t *file, char* sdpString, int track, int hintTrack)
{
	quicktime_trak_t* hintTrak = 
		file->vtracks[track].hintTracks[hintTrack];

	quicktime_sdp_append(&(hintTrak->hint_udta.hnti.sdp), sdpString);
}

static int quicktime_set_media_hint_max_rate(quicktime_t *file, 
	int granularity, int maxBitRate, quicktime_trak_t* hintTrak)
{
	hintTrak->hint_udta.hinf.maxr.granularity = granularity;
	hintTrak->hint_udta.hinf.maxr.maxBitRate = maxBitRate;

	hintTrak->mdia.minf.hmhd.maxbitrate = maxBitRate;
	/* Give upper bound on MP4 max bitrate for 1 minute window */
	hintTrak->mdia.minf.hmhd.slidingavgbitrate = 
		maxBitRate * (60000 / granularity);

	return 0;
}

int quicktime_set_audio_hint_max_rate(quicktime_t *file, 
	int granularity, int maxBitRate, int audioTrack, int hintTrack)
{
	quicktime_trak_t* hintTrak = 
		file->atracks[audioTrack].hintTracks[hintTrack];

	return quicktime_set_media_hint_max_rate(file,
		granularity, maxBitRate, hintTrak);
}

int quicktime_set_video_hint_max_rate(quicktime_t *file, 
	int granularity, int maxBitRate, int videoTrack, int hintTrack)
{
	quicktime_trak_t* hintTrak = 
		file->vtracks[videoTrack].hintTracks[hintTrack];

	return quicktime_set_media_hint_max_rate(file,
		granularity, maxBitRate, hintTrak);
}

int quicktime_set_framerate(quicktime_t *file, float framerate)
{
	int i;
	int new_time_scale, new_sample_duration;
	new_time_scale = quicktime_get_timescale(framerate);
	new_sample_duration = (int)((float)new_time_scale / framerate + 0.5);

	for(i = 0; i < file->total_vtracks; i++)
	{
		file->vtracks[i].track->mdia.mdhd.time_scale = new_time_scale;
		file->vtracks[i].track->mdia.minf.stbl.stts.table[0].sample_duration = new_sample_duration;
	}
}

quicktime_trak_t* quicktime_add_track(quicktime_moov_t *moov)
{
	quicktime_trak_t *trak;
	trak = moov->trak[moov->total_tracks] = calloc(1, sizeof(quicktime_trak_t));
	quicktime_trak_init(trak);
	trak->tkhd.track_id = moov->mvhd.next_track_id;
	moov->mvhd.next_track_id++;
	moov->total_tracks++;
	return trak;
}

/* ============================= Initialization functions */

int quicktime_init(quicktime_t *file)
{
	memset(file, 0, sizeof(quicktime_t));
	quicktime_mdat_init(&(file->mdat));
	quicktime_moov_init(&(file->moov));
	file->cpus = 1;
	return 0;
}

int quicktime_delete(quicktime_t *file)
{
	int i;
	if(file->total_atracks) 
	{
		for(i = 0; i < file->total_atracks; i++)
			quicktime_delete_audio_map(&(file->atracks[i]));
		free(file->atracks);
	}
	if(file->total_vtracks)
	{
		for(i = 0; i < file->total_vtracks; i++)
			quicktime_delete_video_map(&(file->vtracks[i]));
		free(file->vtracks);
	}
	file->total_atracks = 0;
	file->total_vtracks = 0;
	if(file->preload_size)
	{
		free(file->preload_buffer);
		file->preload_size = 0;
	}
	quicktime_moov_delete(&(file->moov));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线免费播放| 久久精品国产**网站演员| 天堂资源在线中文精品| 国产一区二区三区免费观看| 在线免费观看日韩欧美| 国产午夜亚洲精品午夜鲁丝片 | jiyouzz国产精品久久| 911精品国产一区二区在线| 国产欧美一区二区三区在线老狼| 视频一区中文字幕| 91免费版在线| 国产精品视频一区二区三区不卡| 日日噜噜夜夜狠狠视频欧美人| 91在线小视频| 国产欧美视频一区二区| 精品一区二区三区视频在线观看 | 久久99久久久欧美国产| 91成人在线观看喷潮| 国产欧美日韩三级| 久久99国内精品| 欧美一区二区三区电影| 亚洲成人第一页| 91福利视频在线| 亚洲丝袜精品丝袜在线| 成人晚上爱看视频| 国产肉丝袜一区二区| 国内精品国产成人国产三级粉色| 777午夜精品免费视频| 亚洲尤物在线视频观看| 日本丰满少妇一区二区三区| 中文字幕在线观看一区| 不卡免费追剧大全电视剧网站| 久久久99久久| 成人妖精视频yjsp地址| 国产精品网友自拍| 成人av在线播放网站| 中文一区二区完整视频在线观看| 国产精品亚洲第一| 久久久精品tv| 成人福利在线看| 亚洲天天做日日做天天谢日日欢 | 亚洲高清中文字幕| 欧美日韩国产小视频在线观看| 亚洲一区自拍偷拍| 欧美三级中文字幕在线观看| 一区二区三区中文字幕电影 | 国产电影精品久久禁18| 国产三级欧美三级| 成人妖精视频yjsp地址| 亚洲精品国产精品乱码不99 | 欧美性生活久久| 日本亚洲一区二区| 26uuu亚洲综合色欧美| 国产69精品久久777的优势| 国产精品女上位| 在线免费观看日本欧美| 免费观看一级特黄欧美大片| 日韩欧美一区二区在线视频| 国产一区二区三区| 亚洲欧美日本韩国| 欧美日本视频在线| 国产另类ts人妖一区二区| 国产精品伦理在线| 在线不卡中文字幕| 国产精品99久| 亚洲日本韩国一区| 亚洲女性喷水在线观看一区| 欧美日韩极品在线观看一区| 韩国av一区二区| 亚洲免费观看高清完整版在线| 欧美日韩成人综合| 国产精品99久久久久久似苏梦涵| 亚洲精品大片www| 日韩三级免费观看| 91免费视频大全| 麻豆中文一区二区| 亚洲欧美韩国综合色| 日韩久久免费av| 97久久超碰精品国产| 美女视频黄a大片欧美| 成人欧美一区二区三区在线播放| 欧美一区在线视频| 色婷婷激情一区二区三区| 经典三级一区二区| 亚洲第一福利视频在线| 中文字幕av免费专区久久| 51午夜精品国产| 91在线视频在线| 国产精品456露脸| 日本不卡一二三区黄网| 亚洲日本青草视频在线怡红院| 日韩三级在线观看| 欧美日韩亚洲综合一区二区三区| 国产精品一区二区你懂的| 日本怡春院一区二区| 一区二区成人在线| 日韩美女精品在线| 国产欧美日本一区二区三区| 精品久久久久久久一区二区蜜臀| 在线观看亚洲成人| 99国内精品久久| 欧美一区二区三区的| 欧美综合天天夜夜久久| 成人综合婷婷国产精品久久免费| 麻豆精品视频在线观看免费| 亚洲国产精品久久久男人的天堂| 中文字幕亚洲视频| 国产精品三级av| 欧美激情一区二区在线| 久久精品在线免费观看| 精品国产制服丝袜高跟| 精品国产露脸精彩对白| 日韩欧美一二区| 日韩一区国产二区欧美三区| 欧美精品在欧美一区二区少妇| 色综合久久综合网欧美综合网| 成人av先锋影音| 成人午夜又粗又硬又大| 成人黄动漫网站免费app| 成人丝袜视频网| 91蝌蚪porny| 91精品1区2区| 欧美色综合天天久久综合精品| 日本高清无吗v一区| 欧美三片在线视频观看| 91精品一区二区三区久久久久久| 欧美人伦禁忌dvd放荡欲情| 欧美日韩五月天| 欧美男男青年gay1069videost| 欧美日韩一区二区欧美激情| 欧美精选午夜久久久乱码6080| 91精品国产综合久久久久久久久久| 欧美日韩五月天| 日韩精品一区二区三区四区| 337p粉嫩大胆色噜噜噜噜亚洲| 日本一区二区三区四区| 亚洲欧洲三级电影| 亚洲一区av在线| 男女男精品视频网| 国产精品资源在线| 99久精品国产| 欧美精品亚洲二区| 精品国产一区二区三区久久久蜜月 | 久久这里只有精品6| 欧美激情自拍偷拍| 一区二区不卡在线视频 午夜欧美不卡在| 一区二区激情视频| 久久国产免费看| av一区二区三区| 欧美日韩精品一区二区在线播放 | 日韩经典一区二区| 国产精品888| 在线亚洲人成电影网站色www| 欧美日韩国产大片| 国产欧美日韩在线| 午夜久久电影网| 丁香婷婷综合五月| 欧美男同性恋视频网站| 中文字幕第一区二区| 日韩av中文字幕一区二区| 国产91在线看| 日韩一区二区三区av| 国产精品狼人久久影院观看方式| 午夜精品福利一区二区蜜股av| 国产成人亚洲精品狼色在线| 欧美日韩亚洲综合在线| 国产精品美女久久久久aⅴ国产馆| 视频一区视频二区中文字幕| 国产91丝袜在线播放| 91精品国产黑色紧身裤美女| 国产精品电影一区二区| 久久精品国产亚洲5555| 91福利国产成人精品照片| 日本一区二区三区四区在线视频 | 欧美日韩国产电影| 亚洲丝袜另类动漫二区| 国产寡妇亲子伦一区二区| 91精品午夜视频| 一区二区三区中文字幕电影 | 久久亚洲综合色一区二区三区| 亚洲小说欧美激情另类| 国产91高潮流白浆在线麻豆| 日韩欧美国产电影| 成人免费视频免费观看| 日韩视频一区在线观看| 视频一区二区三区中文字幕| 色综合久久久久久久久| 国产精品乱码人人做人人爱| 国产成人午夜99999| 精品精品国产高清a毛片牛牛| 午夜伦欧美伦电影理论片| 91国产免费看| 亚洲精品国久久99热| 成人动漫av在线| 国产精品视频yy9299一区| 国产成人三级在线观看| 久久久久9999亚洲精品| 国产精品18久久久久久久久久久久 | 成人小视频在线观看| 久久精品一区八戒影视|