create Eudora
void YUV420ToJPEG_CPU(const U8* yuv_420, U8* jpeg_output, int imageWidth, int imageHeight, int quality, EN_HOLLYLAND_PIXEL_FORMAT type){
HYY_LOGD("YUV420ToJPEG");
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
U8* outbuffer;
outbuffer = NULL;
JSAMPROW row_pointer[1];
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
cinfo.image_width = imageWidth;
cinfo.image_height = imageHeight;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_YCbCr;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);
unsigned long jpegsize = 0;
jpeg_mem_dest(&cinfo, &outbuffer, &jpegsize);
jpeg_start_compress(&cinfo, TRUE);
int y_size = imageWidth * imageHeight;
const unsigned char* y_ptr = yuv_420;
const unsigned char* uv_ptr = yuv_420 + y_size;
JSAMPLE* row = (JSAMPLE*)malloc(imageWidth * 3);
while (cinfo.next_scanline < cinfo.image_height)
{
int row_index = cinfo.next_scanline;
for (int i = 0; i < imageWidth; i++)
{
int y = y_ptr[row_index * imageWidth + i];
int u = uv_ptr[(row_index / 2) * imageWidth + (i / 2) * 2];
int v = uv_ptr[(row_index / 2) * imageWidth + (i / 2) * 2 + 1];
row[i * 3] = y;
row[i * 3 + 1] = u;
row[i * 3 + 2] = v;
}
row_pointer[0] = row;
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
for(int i = 0; i < (int)jpegsize; i++)
{
jpeg_output[i] = outbuffer[i];
}
jpeg_destroy_compress(&cinfo);
if(NULL != outbuffer)
{
free(outbuffer);
outbuffer = NULL;
}
free(row);
}