コード例 #1
0
ファイル: quicktime.c プロジェクト: knutj/cinelerra
quicktime_t* quicktime_open(char *filename, int rd, int wr)
{
	quicktime_t *new_file = calloc(1, sizeof(quicktime_t));
	int result = 0;

//printf("quicktime_open 1\n");
	quicktime_init(new_file);
	new_file->wr = wr;
	new_file->rd = rd;
	new_file->mdat.atom.start = 0;

	result = quicktime_file_open(new_file, filename, rd, wr);

	if(!result)
	{
		if(rd)
		{
			if(quicktime_read_info(new_file))
			{
				quicktime_close(new_file);
				fprintf(stderr, "quicktime_open: error in header\n");
				new_file = 0;
			}
		}

/* start the data atom */
/* also don't want to do this if making a streamable file */
		if(wr)
		{
			quicktime_set_presave(new_file, 1);




// android requires the ftyp header
			const unsigned char ftyp_data[] =
			{
				0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70,
				0x6d, 0x70, 0x34, 0x32, 0x00, 0x00, 0x00, 0x01,
				0x6d, 0x70, 0x34, 0x32, 0x61, 0x76, 0x63, 0x31
			};
			quicktime_write_data(new_file, (char*)ftyp_data, sizeof(ftyp_data));

			quicktime_atom_write_header64(new_file,
				&new_file->mdat.atom,
				"mdat");
			quicktime_set_presave(new_file, 0);
		}
	}
	else
	{
//printf("quicktime_open 10\n");
		quicktime_close(new_file);
//printf("quicktime_open 100\n");
		new_file = 0;
	}


	return new_file;
}
コード例 #2
0
ファイル: quicktime.c プロジェクト: beequ7et/cinelerra-cv
quicktime_t* quicktime_open(char *filename, int rd, int wr)
{
	quicktime_t *new_file = calloc(1, sizeof(quicktime_t));
	char flags[10];
	int result = 0;

//printf("quicktime_open 1\n");
	quicktime_init(new_file);
	new_file->wr = wr;
	new_file->rd = rd;
	new_file->mdat.atom.start = 0;

	result = quicktime_file_open(new_file, filename, rd, wr);

	if(!result)
	{
		if(rd)
		{
			if(quicktime_read_info(new_file))
			{
				quicktime_close(new_file);
				fprintf(stderr, "quicktime_open: error in header\n");
				new_file = 0;
			}
		}

/* start the data atom */
/* also don't want to do this if making a streamable file */
		if(wr)
		{
			quicktime_set_presave(new_file, 1);
			quicktime_atom_write_header64(new_file, 
				&new_file->mdat.atom, 
				"mdat");
			quicktime_set_presave(new_file, 0);
		}
	}
	else
	{
//printf("quicktime_open 10\n");
		quicktime_close(new_file);
//printf("quicktime_open 100\n");
		new_file = 0;
	}


	return new_file;
}
コード例 #3
0
ファイル: quicktime.c プロジェクト: HunterChen/mpeg4ip
quicktime_t* quicktime_open(char *filename, int rd, int wr, int append)
{
	quicktime_t *new_file = malloc(sizeof(quicktime_t));
	char flags[10];
	int exists = 0;

	quicktime_init(new_file);
	new_file->wr = wr;
	new_file->rd = rd;
	new_file->mdat.start = 0;

	if (!strcmp(&filename[strlen(filename)-4], ".mp4")) {
		new_file->use_mp4 = TRUE;
	} else {
		new_file->use_mp4 = FALSE;
	}

	if(rd && (new_file->stream = fopen(filename, "rb")))
	{
		exists = 1; 
		fclose(new_file->stream); 
		new_file->stream = NULL;
	}


	if(rd && !wr) 
		sprintf(flags, "rb");
	else if(!rd && wr) 
		sprintf(flags, "wb");
	else if(rd && wr)
	{
		if(exists) 
			sprintf(flags, "rb+");
		else
			sprintf(flags, "wb+");
	}

	if(!(new_file->stream = fopen(filename, flags)))
	{
		perror("quicktime_open");
		free(new_file);
		return 0;
	}


	if(rd && exists)
	{
		fseek(new_file->stream, 0, SEEK_END);
		new_file->total_length = ftell(new_file->stream);

		fseek(new_file->stream, 0, SEEK_SET);

		if(quicktime_read_info(new_file))
		{
			quicktime_close(new_file);
			new_file = 0;
		}
	}

	if(wr) {
		if(!exists || !append) {
			/* start the data atom */
			quicktime_write_int32(new_file, 0);
			quicktime_write_char32(new_file, "mdat");
		} else {
			quicktime_set_position(new_file,
				 new_file->mdat.start + new_file->mdat.size);
			fseek(new_file->stream, 
				 new_file->mdat.start + new_file->mdat.size, SEEK_SET);
		}
	}
	return new_file;
}