JNIEXPORT
void
JNICALL Java_com_joy_testnativecamera_MainActivity_HISTOGRAMCOMPRESS(JNIEnv * pEnv, jobject pObj, jobject pBitmap, jbyteArray pinArray, jint flag) {
AndroidBitmapInfo lBitmapInfo;
uint32_t* lBitmapContent;
int
lRet;
if
((lRet = AndroidBitmap_getInfo(pEnv, pBitmap, &lBitmapInfo)) < 0) {
LOGE(1,
"AndroidBitmap_getInfo failed! error = %d"
, lRet);
return
;
}
if
(lBitmapInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE(1,
"Bitmap format is not RGBA_8888!"
);
return
;
}
if
((lRet = AndroidBitmap_lockPixels(pEnv, pBitmap, (
void
**)&lBitmapContent)) < 0) {
LOGE(1,
"AndroidBitmap_lockPixels() failed! error = %d"
, lRet);
return
;
}
jbyte* lSource = (*pEnv)->GetPrimitiveArrayCritical(pEnv, pinArray, 0);
if
(lSource == NULL) {
LOGE(1,
"Source is null"
);
return
;
}
int32_t lFrameSize = lBitmapInfo.width * lBitmapInfo.height;
int32_t lYIndex, lUVIndex;
int32_t lX, lY;
int32_t lColorY, lColorU, lColorV;
int32_t lColorR, lColorG, lColorB;
int32_t y1192;
for
(lY = 0, lYIndex = 0; lY < lBitmapInfo.height; ++lY) {
lColorU = 0; lColorV = 0;
lUVIndex = lFrameSize + (lY >> 1) * lBitmapInfo.width;
for
(lX = 0; lX < lBitmapInfo.width; ++lX, ++lYIndex) {
lColorY = max(toInt(lSource[lYIndex]) - 16, 0);
if
(!(lX % 2)) {
lColorV = toInt(lSource[lUVIndex++]) - 128;
lColorU = toInt(lSource[lUVIndex++]) - 128;
}
y1192 = 1192 * lColorY;
lColorR = (y1192 + 1634 * lColorV);
lColorG = (y1192 - 833 * lColorV - 400 * lColorU);
lColorB = (y1192 + 2066 * lColorU);
lColorR = clamp(lColorR, 0, 262143);
lColorG = clamp(lColorG, 0, 262143);
lColorB = clamp(lColorB, 0, 262143);
if
(flag == 1)
lBitmapContent[lYIndex] = 0xFF000000 |((lColorR >> 10) & 0x000000FF);
else
if
(flag == 2)
lBitmapContent[lYIndex] = 0xFF000000 |((lColorG >> 2) & 0x0000FF00);
else
if
(flag == 3)
lBitmapContent[lYIndex] = 0xFF000000 |((lColorB << 6) & 0x00FF0000);
else
if
(flag == 4)
lBitmapContent[lYIndex] = lColorY ;
}
}
LOGE(1,
"**Start JNI bitmap converter %d"
,lColorR);
(*pEnv)-> ReleasePrimitiveArrayCritical(pEnv,pinArray,lSource,0);
AndroidBitmap_unlockPixels(pEnv, pBitmap);
LOGI(1,
"end color conversion2"
);
}