2016-03-23 6 views
0

Ich möchte einen planaren 4: 2: 0 YUV-Puffer zu einem JPEG-Bild mit Lipturbojpeg in C komprimieren, aber ich habe Probleme mit der tjCompressFromYUV()-Funktion.libjpeg turbo tjCompressFromYUV

Dies ist mein Code:

#define PADDING  2 
tjhandle tjh; 
unsigned long buf_size; 
unsigned char *jpegBuf = NULL; 
unsigned long jpegSize; 
int width = 352; 
int height = 288; 
int quality = 70; 
unsigned char *ucp_frame; 
int j; 
FILE *fp = NULL; 

ucp_frame = malloc(width * height * 3/2); 
if (NULL == ucp_frame) { 
    printf("malloc error ucp_frame\n"); 
    return 0; 
} 

fp = fopen("planar_352x288.raw", "rb"); 
if(NULL == fp) { 
    printf("fopen error\n"); 
    return 0; 
} 

j = fread(ucp_frame, 1, width * height * 3/2, fp); 
if(j != width * height * 3/2) { 
    printf("fread error\n"); 
    return 0; 
} 
fclose(fp); 

tjh = tjInitCompress(); 
if(NULL == tjh) { 
    printf("tjInitCompress error '%s'\n", tjGetErrorStr()); 
    return 0; 
} 

buf_size = tjBufSizeYUV2(width, PADDING, height, TJSAMP_420); 
jpegBuf = tjAlloc(buf_size); 

if(tjCompressFromYUV(tjh, ucp_frame, width, PADDING, height, 
         TJSAMP_420, &jpegBuf, &jpegSize, quality, 
         TJFLAG_NOREALLOC)) { 
    printf("tjCompressFromYUV error '%s'\n", tjGetErrorStr()); 
} 

Der String Fehler von tjGetErrorStr() zurückgegeben wird "Bogus Eingangsfarbraum".

Ich habe versucht, libturbojpeg Versionen 1.4.2 und 1.4.90 zu verbinden.

Jede Hilfe geschätzt wolud,

Dank

Antwort

0

Ok stellte sich das Problem in dem Programm aus dem Code ich in einem kleineren Testprogramm geschrieben, das tjBufSizeYUV2 Aufruf wie erwartet ausführt.

Auf einer Seite beachten Sie, es scheint, dass, wenn jpegBuf vor dem Aufruf tjBufSizeYUV2 vorab zugewiesene ist, das flag Argument tjBufSizeYUV2 geben müssen TJFLAG_NOREALLOC, enthalten oder auch jpegBuf nicht einmal befreit werden, wenn tjFree(jpegBuf); später genannt wird.