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); } }
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; }
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; }