| 290 | } |
| 291 | |
| 292 | void 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); |
nothing calls this directly
no test coverage detected