コード例 #1
0
ファイル: quicktime.c プロジェクト: beequ7et/cinelerra-cv
int quicktime_set_video(quicktime_t *file, 
						int tracks, 
						int frame_w, 
						int frame_h,
						double frame_rate,
						char *compressor)
{
	int i;
	quicktime_trak_t *trak;

	if(tracks)
	{
		quicktime_mhvd_init_video(file, &(file->moov.mvhd), frame_rate);
		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);
			quicktime_trak_init_video(file, trak, frame_w, frame_h, frame_rate, compressor);
			quicktime_init_video_map(&(file->vtracks[i]), trak);
		}
	}

	return 0;
}
コード例 #2
0
ファイル: quicktime.c プロジェクト: beequ7et/cinelerra-cv
int quicktime_set_audio(quicktime_t *file, 
						int channels,
						long sample_rate,
						int bits,
						char *compressor)
{
	quicktime_trak_t *trak;

/* allocate an arbitrary number of tracks */
	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);
		quicktime_trak_init_audio(file, 
			trak, 
			channels, 
			sample_rate, 
			bits, 
			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 */
}
コード例 #3
0
ファイル: quicktime.c プロジェクト: HunterChen/mpeg4ip
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);
}
コード例 #4
0
ファイル: quicktime.c プロジェクト: HunterChen/mpeg4ip
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 */
}
コード例 #5
0
ファイル: quicktime.c プロジェクト: HunterChen/mpeg4ip
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;
}
コード例 #6
0
ファイル: quicktime.c プロジェクト: HunterChen/mpeg4ip
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);
}