|
|
@ -564,8 +564,8 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
|
|
|
|
|
|
|
// setup imagereader and its surface
|
|
|
|
// setup imagereader and its surface
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// media_status_t mstatus = AImageReader_new(foundRes.width(), foundRes.height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);
|
|
|
|
// media_status_t mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);
|
|
|
|
media_status_t mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), AIMAGE_FORMAT_YUV_420_888, /*maxImages*/2, &image_reader);
|
|
|
|
media_status_t mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), getOutputFormat(), /*maxImages*/2, &image_reader);
|
|
|
|
|
|
|
|
|
|
|
|
if (mstatus == AMEDIA_OK)
|
|
|
|
if (mstatus == AMEDIA_OK)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -598,7 +598,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
uint8_t ctrlMode = ACAMERA_CONTROL_MODE_AUTO;
|
|
|
|
uint8_t ctrlMode = ACAMERA_CONTROL_MODE_AUTO;
|
|
|
|
status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_MODE, 1, &ctrlMode);
|
|
|
|
status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_MODE, 1, &ctrlMode);
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t captureIntent = ACAMERA_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
|
|
|
|
uint8_t captureIntent = (ACameraDevice_request_template)m_params.requestTemplate == TEMPLATE_PREVIEW ? ACAMERA_CONTROL_CAPTURE_INTENT_PREVIEW : ACAMERA_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
|
|
|
|
status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_CAPTURE_INTENT, 1, &captureIntent);
|
|
|
|
status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_CAPTURE_INTENT, 1, &captureIntent);
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t flashMode = ACAMERA_FLASH_MODE_OFF;
|
|
|
|
uint8_t flashMode = ACAMERA_FLASH_MODE_OFF;
|
|
|
@ -985,103 +985,99 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
|
|
|
|
int32_t format;
|
|
|
|
int32_t format;
|
|
|
|
AImage_getFormat(image, &format);
|
|
|
|
AImage_getFormat(image, &format);
|
|
|
|
|
|
|
|
|
|
|
|
// ASSERT(format == AIMAGE_FORMAT_YUV_420_888);
|
|
|
|
if (format == AIMAGE_FORMAT_YUV_420_888)
|
|
|
|
|
|
|
|
{
|
|
|
|
int32_t width = 0;
|
|
|
|
int32_t width = 0;
|
|
|
|
int32_t height = 0;
|
|
|
|
int32_t height = 0;
|
|
|
|
AImage_getWidth(image, &width);
|
|
|
|
AImage_getWidth(image, &width);
|
|
|
|
AImage_getHeight(image, &height);
|
|
|
|
AImage_getHeight(image, &height);
|
|
|
|
|
|
|
|
|
|
|
|
int32_t y_pixelStride = 0;
|
|
|
|
int32_t y_pixelStride = 0;
|
|
|
|
int32_t u_pixelStride = 0;
|
|
|
|
int32_t u_pixelStride = 0;
|
|
|
|
int32_t v_pixelStride = 0;
|
|
|
|
int32_t v_pixelStride = 0;
|
|
|
|
AImage_getPlanePixelStride(image, 0, &y_pixelStride);
|
|
|
|
AImage_getPlanePixelStride(image, 0, &y_pixelStride);
|
|
|
|
AImage_getPlanePixelStride(image, 1, &u_pixelStride);
|
|
|
|
AImage_getPlanePixelStride(image, 1, &u_pixelStride);
|
|
|
|
AImage_getPlanePixelStride(image, 2, &v_pixelStride);
|
|
|
|
AImage_getPlanePixelStride(image, 2, &v_pixelStride);
|
|
|
|
|
|
|
|
|
|
|
|
int32_t y_rowStride = 0;
|
|
|
|
int32_t y_rowStride = 0;
|
|
|
|
int32_t u_rowStride = 0;
|
|
|
|
int32_t u_rowStride = 0;
|
|
|
|
int32_t v_rowStride = 0;
|
|
|
|
int32_t v_rowStride = 0;
|
|
|
|
AImage_getPlaneRowStride(image, 0, &y_rowStride);
|
|
|
|
AImage_getPlaneRowStride(image, 0, &y_rowStride);
|
|
|
|
AImage_getPlaneRowStride(image, 1, &u_rowStride);
|
|
|
|
AImage_getPlaneRowStride(image, 1, &u_rowStride);
|
|
|
|
AImage_getPlaneRowStride(image, 2, &v_rowStride);
|
|
|
|
AImage_getPlaneRowStride(image, 2, &v_rowStride);
|
|
|
|
|
|
|
|
|
|
|
|
// uint8_t* y_data = 0;
|
|
|
|
// uint8_t* y_data = 0;
|
|
|
|
uint8_t* u_data = 0;
|
|
|
|
uint8_t* u_data = 0;
|
|
|
|
uint8_t* v_data = 0;
|
|
|
|
uint8_t* v_data = 0;
|
|
|
|
// int y_len = 0;
|
|
|
|
// int y_len = 0;
|
|
|
|
int u_len = 0;
|
|
|
|
int u_len = 0;
|
|
|
|
int v_len = 0;
|
|
|
|
int v_len = 0;
|
|
|
|
AImage_getPlaneData(image, 0, &y_data, &y_len);
|
|
|
|
AImage_getPlaneData(image, 0, &y_data, &y_len);
|
|
|
|
AImage_getPlaneData(image, 1, &u_data, &u_len);
|
|
|
|
AImage_getPlaneData(image, 1, &u_data, &u_len);
|
|
|
|
AImage_getPlaneData(image, 2, &v_data, &v_len);
|
|
|
|
AImage_getPlaneData(image, 2, &v_data, &v_len);
|
|
|
|
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
#if 1
|
|
|
|
#if __cplusplus >= 201703L
|
|
|
|
#if __cplusplus >= 201703L
|
|
|
|
uint64_t avgY = std::reduce(y_data, y_data + y_len, 0);
|
|
|
|
uint64_t avgY = std::reduce(y_data, y_data + y_len, 0);
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
uint64_t avgY = std::accumulate(y_data, y_data + y_len, 0);
|
|
|
|
uint64_t avgY = std::accumulate(y_data, y_data + y_len, 0);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
mResult.avgY = avgY / y_len;
|
|
|
|
mResult.avgY = avgY / y_len;
|
|
|
|
mFinalResult.avgY = mResult.avgY;
|
|
|
|
mFinalResult.avgY = mResult.avgY;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width)
|
|
|
|
if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width)
|
|
|
|
{
|
|
|
|
|
|
|
|
// already nv21 :)
|
|
|
|
|
|
|
|
on_image((unsigned char*)y_data, (int)width, (int)height);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// construct nv21
|
|
|
|
|
|
|
|
unsigned char* nv21 = new unsigned char[width * height + width * height / 2];
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Y
|
|
|
|
// already nv21 :)
|
|
|
|
unsigned char* yptr = nv21;
|
|
|
|
on_image((unsigned char*)y_data, (int)width, (int)height);
|
|
|
|
for (int y=0; y<height; y++)
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// construct nv21
|
|
|
|
|
|
|
|
unsigned char* nv21 = new unsigned char[width * height + width * height / 2];
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const unsigned char* y_data_ptr = y_data + y_rowStride * y;
|
|
|
|
// Y
|
|
|
|
for (int x=0; x<width; x++)
|
|
|
|
unsigned char* yptr = nv21;
|
|
|
|
|
|
|
|
for (int y=0; y<height; y++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
yptr[0] = y_data_ptr[0];
|
|
|
|
const unsigned char* y_data_ptr = y_data + y_rowStride * y;
|
|
|
|
yptr++;
|
|
|
|
for (int x=0; x<width; x++)
|
|
|
|
y_data_ptr += y_pixelStride;
|
|
|
|
{
|
|
|
|
|
|
|
|
yptr[0] = y_data_ptr[0];
|
|
|
|
|
|
|
|
yptr++;
|
|
|
|
|
|
|
|
y_data_ptr += y_pixelStride;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// UV
|
|
|
|
// UV
|
|
|
|
unsigned char* uvptr = nv21 + width * height;
|
|
|
|
unsigned char* uvptr = nv21 + width * height;
|
|
|
|
for (int y=0; y<height/2; y++)
|
|
|
|
for (int y=0; y<height/2; y++)
|
|
|
|
{
|
|
|
|
|
|
|
|
const unsigned char* v_data_ptr = v_data + v_rowStride * y;
|
|
|
|
|
|
|
|
const unsigned char* u_data_ptr = u_data + u_rowStride * y;
|
|
|
|
|
|
|
|
for (int x=0; x<width/2; x++)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uvptr[0] = v_data_ptr[0];
|
|
|
|
const unsigned char* v_data_ptr = v_data + v_rowStride * y;
|
|
|
|
uvptr[1] = u_data_ptr[0];
|
|
|
|
const unsigned char* u_data_ptr = u_data + u_rowStride * y;
|
|
|
|
uvptr += 2;
|
|
|
|
for (int x=0; x<width/2; x++)
|
|
|
|
v_data_ptr += v_pixelStride;
|
|
|
|
{
|
|
|
|
u_data_ptr += u_pixelStride;
|
|
|
|
uvptr[0] = v_data_ptr[0];
|
|
|
|
|
|
|
|
uvptr[1] = u_data_ptr[0];
|
|
|
|
|
|
|
|
uvptr += 2;
|
|
|
|
|
|
|
|
v_data_ptr += v_pixelStride;
|
|
|
|
|
|
|
|
u_data_ptr += u_pixelStride;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
on_image((unsigned char*)nv21, (int)width, (int)height);
|
|
|
|
on_image((unsigned char*)nv21, (int)width, (int)height);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delete[] nv21;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (format == AIMAGE_FORMAT_JPEG)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
delete[] nv21;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AImage_delete(image);
|
|
|
|
AImage_delete(image);
|
|
|
|
m_imagesCaptured ++;
|
|
|
|
m_imagesCaptured ++;
|
|
|
|
|
|
|
|
|
|
|
|
if (capture_session != 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// camera_status_t cs = ACameraCaptureSession_stopRepeating(capture_session);
|
|
|
|
|
|
|
|
//if (cs != ACAMERA_OK)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// XYLOG(XYLOG_SEVERITY_ERROR, "ACameraCaptureSession_stopRepeating error=%d", cs);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NdkCamera::on_error(const std::string& msg)
|
|
|
|
void NdkCamera::on_error(const std::string& msg)
|
|
|
@ -1547,3 +1543,8 @@ bool NdkCamera::IsCameraAvailable(const std::string& cameraId)
|
|
|
|
|
|
|
|
|
|
|
|
return existed;
|
|
|
|
return existed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t NdkCamera::getOutputFormat() const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return AIMAGE_FORMAT_YUV_420_888;
|
|
|
|
|
|
|
|
}
|