MCPcopy Create free account
hub / github.com/Redot-Engine/redot-engine / onImage

Method onImage

modules/camera/camera_android.cpp:292–379  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

290}
291
292void CameraFeedAndroid::onImage(void *context, AImageReader *p_reader) {
293 CameraFeedAndroid *feed = static_cast<CameraFeedAndroid *>(context);
294 Vector<uint8_t> data_y = feed->data_y;
295 Vector<uint8_t> data_uv = feed->data_uv;
296 Ref<Image> image_y = feed->image_y;
297 Ref<Image> image_uv = feed->image_uv;
298
299 // Get image
300 AImage *image = nullptr;
301 media_status_t status = AImageReader_acquireNextImage(p_reader, &image);
302 ERR_FAIL_COND(status != AMEDIA_OK);
303
304 // Get image data
305 uint8_t *data = nullptr;
306 int len = 0;
307 int32_t pixel_stride, row_stride;
308 FeedFormat format = feed->get_format();
309 int width = format.width;
310 int height = format.height;
311 switch (format.pixel_format) {
312 case AIMAGE_FORMAT_YUV_420_888:
313 AImage_getPlaneData(image, 0, &data, &len);
314 if (len <= 0) {
315 return;
316 }
317 if (len != data_y.size()) {
318 int64_t size = Image::get_image_data_size(width, height, Image::FORMAT_R8, false);
319 data_y.resize(len > size ? len : size);
320 }
321 memcpy(data_y.ptrw(), data, len);
322
323 AImage_getPlanePixelStride(image, 1, &pixel_stride);
324 AImage_getPlaneRowStride(image, 1, &row_stride);
325 AImage_getPlaneData(image, 1, &data, &len);
326 if (len <= 0) {
327 return;
328 }
329 if (len != data_uv.size()) {
330 int64_t size = Image::get_image_data_size(width / 2, height / 2, Image::FORMAT_RG8, false);
331 data_uv.resize(len > size ? len : size);
332 }
333 memcpy(data_uv.ptrw(), data, len);
334
335 image_y->initialize_data(width, height, false, Image::FORMAT_R8, data_y);
336 image_uv->initialize_data(width / 2, height / 2, false, Image::FORMAT_RG8, data_uv);
337
338 feed->set_ycbcr_images(image_y, image_uv);
339 break;
340 case AIMAGE_FORMAT_RGBA_8888:
341 AImage_getPlaneData(image, 0, &data, &len);
342 if (len <= 0) {
343 return;
344 }
345 if (len != data_y.size()) {
346 int64_t size = Image::get_image_data_size(width, height, Image::FORMAT_RGBA8, false);
347 data_y.resize(len > size ? len : size);
348 }
349 memcpy(data_y.ptrw(), data, len);

Callers

nothing calls this directly

Calls 8

initialize_dataMethod · 0.80
set_ycbcr_imagesMethod · 0.80
set_rgb_imageMethod · 0.80
sizeMethod · 0.65
get_formatMethod · 0.45
resizeMethod · 0.45
ptrwMethod · 0.45
_set_rotationMethod · 0.45

Tested by

no test coverage detected