void *avi_converter_from_mjpeg(AviMovie *movie, int stream, unsigned char *buffer, size_t *size) { int deint; unsigned char *buf; (void)stream; /* unused */ buf = imb_alloc_pixels(movie->header->Height, movie->header->Width, 3, sizeof(unsigned char), "avi.avi_converter_from_mjpeg 1"); if (!buf) { return NULL; } deint = Decode_JPEG(buffer, buf, movie->header->Width, movie->header->Height, *size); MEM_freeN(buffer); if (deint) { buffer = imb_alloc_pixels(movie->header->Height, movie->header->Width, 3, sizeof(unsigned char), "avi.avi_converter_from_mjpeg 2"); if (buffer) { interlace(buffer, buf, movie->header->Width, movie->header->Height); } MEM_freeN(buf); buf = buffer; } return buf; }
static int check_and_decode_jpeg(unsigned char *inbuf, unsigned char *outbuf, int width, int height, int bufsize) { /* JPEG's are always multiples of 16, extra is cropped out 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_decode_jpeg"); int ret= Decode_JPEG(inbuf, tmpbuf, jwidth, jheight, bufsize); /* crop the tmpbuf into the real buffer */ rrowstride= width*3; jrowstride= jwidth*3; for (i=0; i<height; i++) memcpy(&outbuf[i*rrowstride], &tmpbuf[i*jrowstride], rrowstride); MEM_freeN(tmpbuf); return ret; } else { return Decode_JPEG(inbuf, outbuf, width, height, bufsize); } }
void *avi_converter_from_mjpeg(AviMovie *movie, int stream, unsigned char *buffer, int *size) { int deint; unsigned char *buf; (void)stream; /* unused */ buf = MEM_mallocN(movie->header->Height * movie->header->Width * 3, "avi.avi_converter_from_mjpeg 1"); deint = Decode_JPEG(buffer, buf, movie->header->Width, movie->header->Height, *size); MEM_freeN(buffer); if (deint) { buffer = MEM_mallocN(movie->header->Height * movie->header->Width * 3, "avi.avi_converter_from_mjpeg 2"); interlace(buffer, buf, movie->header->Width, movie->header->Height); MEM_freeN(buf); buf = buffer; } return buf; }