コード例 #1
0
ファイル: avi_mjpeg.c プロジェクト: 244xiao/blender
static void check_and_compress_jpeg(int quality, unsigned char *outbuf, const unsigned char *inbuf,
                                    int width, int height, int bufsize)
{
	/* JPEG's are always multiples of 16, extra is ignored in AVI's */
	if ((width & 0xF) || (height & 0xF)) {
		int i, rrowstride, jrowstride;
		int jwidth = PADUP(width, 16);
		int jheight = PADUP(height, 16);
		unsigned char *tmpbuf = MEM_mallocN(jwidth * jheight * 3, "avi.check_and_compress_jpeg");

		/* resize the realbuf into the tmpbuf */
		rrowstride = width * 3;
		jrowstride = jwidth * 3;
		for (i = 0; i < jheight; i++) {
			if (i < height)
				memcpy(&tmpbuf[i * jrowstride], &inbuf[i * rrowstride], rrowstride);
			else
				memset(&tmpbuf[i * jrowstride], 0, rrowstride);
			memset(&tmpbuf[i * jrowstride + rrowstride], 0, jrowstride - rrowstride);
		}

		Compress_JPEG(quality, outbuf, tmpbuf, jwidth, jheight, bufsize);

		MEM_freeN(tmpbuf);
	}
	else {
		Compress_JPEG(quality, outbuf, inbuf, width, height, bufsize);
	}
}
コード例 #2
0
ファイル: avi_mjpeg.c プロジェクト: mgschwan/blensor
void *avi_converter_to_mjpeg(AviMovie *movie, int stream, unsigned char *buffer, size_t *size)
{
	unsigned char *buf;
	size_t bufsize = *size;
	
	numbytes = 0;
	*size = 0;

	buf = imb_alloc_pixels(movie->header->Height, movie->header->Width, 3, sizeof(unsigned char), "avi.avi_converter_to_mjpeg 1");
	if (!buf) {
		return NULL;
	}

	if (!movie->interlace) {
		Compress_JPEG(movie->streams[stream].sh.Quality / 100,
		              buf, buffer,
		              movie->header->Width,
		              movie->header->Height,
		              bufsize);
		*size += numbytes;
	}
	else {
		deinterlace(movie->odd_fields, buf, buffer, movie->header->Width, movie->header->Height);
		MEM_freeN(buffer);
	
		buffer = buf;
		buf = imb_alloc_pixels(movie->header->Height, movie->header->Width, 3, sizeof(unsigned char), "avi.avi_converter_to_mjpeg 1");

		if (buf) {
			Compress_JPEG(movie->streams[stream].sh.Quality / 100,
				      buf, buffer,
				      movie->header->Width,
				      movie->header->Height / 2,
				      bufsize / 2);
			*size += numbytes;
			numbytes = 0;
			Compress_JPEG(movie->streams[stream].sh.Quality / 100,
				      buf + *size, buffer + (size_t)(movie->header->Height / 2) * (size_t)movie->header->Width * 3,
				      movie->header->Width,
				      movie->header->Height / 2,
				      bufsize / 2);
			*size += numbytes;
		}
	}

	MEM_freeN(buffer);
	return buf;
}
コード例 #3
0
ファイル: avi_mjpeg.c プロジェクト: AwesomeDoesIt/blender-git
void *avi_converter_to_mjpeg(AviMovie *movie, int stream, unsigned char *buffer, int *size)
{
	unsigned char *buf;
	int bufsize = *size;
	
	numbytes = 0;
	*size = 0;

	buf = MEM_mallocN(movie->header->Height * movie->header->Width * 3, "avi.avi_converter_to_mjpeg 1");
	if (!movie->interlace) {
		Compress_JPEG(movie->streams[stream].sh.Quality / 100,
		              buf, buffer,
		              movie->header->Width,
		              movie->header->Height,
		              bufsize);
	}
	else {
		deinterlace(movie->odd_fields, buf, buffer, movie->header->Width, movie->header->Height);
		MEM_freeN(buffer);
	
		buffer = buf;
		buf = MEM_mallocN(movie->header->Height * movie->header->Width * 3, "avi.avi_converter_to_mjpeg 2");
	
		Compress_JPEG(movie->streams[stream].sh.Quality / 100,
		              buf, buffer,
		              movie->header->Width,
		              movie->header->Height / 2,
		              bufsize / 2);
		*size += numbytes;
		numbytes = 0;
		Compress_JPEG(movie->streams[stream].sh.Quality / 100,
		              buf + *size, buffer + (movie->header->Height / 2) * movie->header->Width * 3,
		              movie->header->Width,
		              movie->header->Height / 2,
		              bufsize / 2);
	}
	*size += numbytes;

	MEM_freeN(buffer);
	return buf;
}