@@ -37,7 +37,7 @@ namespace {
3737using ::mediapipe::Image;
3838using ::mediapipe::ImageFormat;
3939using ::mediapipe::ImageFrame;
40- using ::mediapipe::tasks::c::core::ToMpStatus ;
40+ using ::mediapipe::tasks::c::core::HandleStatus ;
4141using ::mediapipe::tasks::vision::core::GetCachedContiguousDataAttr;
4242using ::mediapipe::tasks::vision::core::GetValue;
4343
@@ -197,76 +197,75 @@ absl::Status CreateMpImageInternal(MpImageFormat format, int width, int height,
197197
198198extern " C" {
199199
200- MP_EXPORT MpStatus MpImageCreateFromUint8Data (MpImageFormat format, int width,
201- int height,
202- const uint8_t * pixel_data,
203- int pixel_data_size,
204- MpImagePtr* out) {
200+ MP_EXPORT MpStatus MpImageCreateFromUint8Data (
201+ MpImageFormat format, int width, int height, const uint8_t * pixel_data,
202+ int pixel_data_size, MpImagePtr* out, char ** error_msg) {
205203 if (!pixel_data) {
206- ABSL_LOG (ERROR) << " Pixel data is null" ;
207- return kMpInvalidArgument ;
204+ return HandleStatus ( absl::InvalidArgumentError ( " Pixel data is null" ),
205+ error_msg) ;
208206 }
209207
210208 if (format != kMpImageFormatGray8 && format != kMpImageFormatSrgb &&
211209 format != kMpImageFormatSrgba ) {
212- ABSL_LOG (ERROR) << " Unsupported image format: " << ToString (format)
213- << " (expected GRAY8, SRGB, or SRGBA for uint8_t data)" ;
214- return kMpInvalidArgument ;
210+ return HandleStatus (
211+ absl::InvalidArgumentError (absl::StrFormat (
212+ " Unsupported image format: %s (expected GRAY8, SRGB, or "
213+ " SRGBA for uint8_t data)" ,
214+ ToString (format))),
215+ error_msg);
215216 }
216217
217218 auto status = CreateMpImageInternal (format, width, height, pixel_data,
218219 pixel_data_size, out);
219- return ToMpStatus (status);
220+ return HandleStatus (status, error_msg );
220221}
221222
222- MP_EXPORT MpStatus MpImageCreateFromUint16Data (MpImageFormat format, int width,
223- int height,
224- const uint16_t * pixel_data,
225- int pixel_data_size,
226- MpImagePtr* out) {
223+ MP_EXPORT MpStatus MpImageCreateFromUint16Data (
224+ MpImageFormat format, int width, int height, const uint16_t * pixel_data,
225+ int pixel_data_size, MpImagePtr* out, char ** error_msg) {
227226 if (!pixel_data) {
228- ABSL_LOG (ERROR) << " Pixel data is null" ;
229- return kMpInvalidArgument ;
227+ return HandleStatus ( absl::InvalidArgumentError ( " Pixel data is null" ),
228+ error_msg) ;
230229 }
231230
232231 if (format != kMpImageFormatGray16 && format != kMpImageFormatSrgb48 &&
233232 format != kMpImageFormatSrgba64 ) {
234- ABSL_LOG (ERROR)
235- << " Unsupported image format: " << ToString (format)
236- << " (expected GRAY16, SRGB48, or SRGBA64 for uint16_t data)" ;
237- return kMpInvalidArgument ;
233+ return HandleStatus (absl::InvalidArgumentError (absl::StrFormat (
234+ " Unsupported image format: %s (expected GRAY16, "
235+ " SRGB48, or SRGBA64 for uint16_t data)" ,
236+ ToString (format))),
237+ error_msg);
238238 }
239239
240240 auto status = CreateMpImageInternal (format, width, height, pixel_data,
241241 pixel_data_size * sizeof (uint16_t ), out);
242- return ToMpStatus (status);
242+ return HandleStatus (status, error_msg );
243243}
244244
245- MP_EXPORT MpStatus MpImageCreateFromFloatData (MpImageFormat format, int width,
246- int height,
247- const float * pixel_data,
248- int pixel_data_size,
249- MpImagePtr* out) {
245+ MP_EXPORT MpStatus MpImageCreateFromFloatData (
246+ MpImageFormat format, int width, int height, const float * pixel_data,
247+ int pixel_data_size, MpImagePtr* out, char ** error_msg) {
250248 if (!pixel_data) {
251- ABSL_LOG (ERROR) << " Pixel data is null" ;
252- return kMpInvalidArgument ;
249+ return HandleStatus ( absl::InvalidArgumentError ( " Pixel data is null" ),
250+ error_msg) ;
253251 }
254252
255253 if (format != kMpImageFormatVec32F1 && format != kMpImageFormatVec32F2 &&
256254 format != kMpImageFormatVec32F4 ) {
257- ABSL_LOG (ERROR)
258- << " Unsupported image format: " << ToString (format)
259- << " (expected VEC32F1, VEC32F2, or VEC32F4 for float data)" ;
260- return kMpInvalidArgument ;
255+ return HandleStatus (absl::InvalidArgumentError (absl::StrFormat (
256+ " Unsupported image format: %s (expected VEC32F1, "
257+ " VEC32F2, or VEC32F4 for float data)" ,
258+ ToString (format))),
259+ error_msg);
261260 }
262261
263262 auto status = CreateMpImageInternal (format, width, height, pixel_data,
264263 pixel_data_size * sizeof (float ), out);
265- return ToMpStatus (status);
264+ return HandleStatus (status, error_msg );
266265}
267266
268- MP_EXPORT MpStatus MpImageCreateFromFile (const char * file_name,
269- MpImagePtr* out ) {
267+ MP_EXPORT MpStatus MpImageCreateFromFile (const char * file_name, MpImagePtr* out,
268+ char ** error_msg ) {
270269 unsigned char * image_data = nullptr ;
271270 int width = 0 ;
272271 int height = 0 ;
@@ -287,15 +286,14 @@ MP_EXPORT MpStatus MpImageCreateFromFile(const char* file_name,
287286 /* desired_channels=*/ 0 );
288287#endif // TARGET_OS_OSX && !MEDIAPIPE_DISABLE_GPU
289288 if (image_data == nullptr ) {
290- ABSL_LOG (ERROR) << " Failed to load image from file: " << file_name;
291- return kMpInternal ;
289+ return HandleStatus ( absl::InternalError ( " Failed to load image from file" ),
290+ error_msg) ;
292291 }
293292
294293 auto format = GetImageFormatFromChannels (channels);
295294 if (!format.ok ()) {
296- ABSL_LOG (ERROR) << " Unsupported image format: " << format.status ();
297295 stbi_image_free (image_data);
298- return kMpInvalidArgument ;
296+ return HandleStatus (format. status (), error_msg) ;
299297 }
300298
301299 auto image = std::make_shared<ImageFrame>(
@@ -308,7 +306,8 @@ MP_EXPORT MpStatus MpImageCreateFromFile(const char* file_name,
308306}
309307
310308MP_EXPORT MpStatus MpImageCreateFromImageFrame (MpImagePtr image,
311- MpImagePtr* out) {
309+ MpImagePtr* out,
310+ char ** error_ms) {
312311 auto mp_image = std::make_unique<MpImageInternal>();
313312 mp_image->image = Image (image->image .GetImageFrameSharedPtr ());
314313 *out = mp_image.release ();
@@ -356,97 +355,106 @@ MP_EXPORT MpImageFormat MpImageGetFormat(const MpImagePtr image) {
356355 return ToCImageFormat (GetImageFrameSharedPtr (image)->Format ());
357356}
358357
359- MP_EXPORT MpStatus MpImageDataUint8 (const MpImagePtr image,
360- const uint8_t ** out ) {
358+ MP_EXPORT MpStatus MpImageDataUint8 (const MpImagePtr image, const uint8_t ** out,
359+ char ** error_msg ) {
361360 auto data = GetCachedContiguousDataAttr<uint8_t >(image);
362361 if (data.ok ()) {
363362 *out = *data;
364363 }
365- return ToMpStatus (data.status ());
364+ return HandleStatus (data.status (), error_msg );
366365}
367366
368367MP_EXPORT MpStatus MpImageDataUint16 (const MpImagePtr image,
369- const uint16_t ** out) {
368+ const uint16_t ** out, char ** error_msg ) {
370369 auto data = GetCachedContiguousDataAttr<uint16_t >(image);
371370 if (data.ok ()) {
372371 *out = *data;
373372 }
374- return ToMpStatus (data.status ());
373+ return HandleStatus (data.status (), error_msg );
375374}
376375
377- MP_EXPORT MpStatus MpImageDataFloat32 (const MpImagePtr image,
378- const float ** out ) {
376+ MP_EXPORT MpStatus MpImageDataFloat32 (MpImagePtr image, const float ** out ,
377+ char ** error_msg ) {
379378 auto data = GetCachedContiguousDataAttr<float >(image);
380379 if (data.ok ()) {
381380 *out = *data;
382381 }
383- return ToMpStatus (data.status ());
382+ return HandleStatus (data.status (), error_msg );
384383}
385384
386385MP_EXPORT MpStatus MpImageGetValueUint8 (const MpImagePtr image, int * pos,
387- int pos_size, uint8_t * out) {
386+ int pos_size, uint8_t * out,
387+ char ** error_msg) {
388388 auto status = ValidateDimensions (image, pos_size);
389389 if (!status.ok ()) {
390- return ToMpStatus (status);
390+ return HandleStatus (status, error_msg );
391391 }
392392
393393 size_t byte_depth = GetImageFrameSharedPtr (image)->ByteDepth ();
394394 if (byte_depth != 1 ) {
395- ABSL_LOG (ERROR) << " Unexpected image byte depth: " << byte_depth
396- << " (expected 1 for uint8_t data)" ;
397- return kMpInvalidArgument ;
395+ return HandleStatus (absl::InvalidArgumentError (absl::StrFormat (
396+ " Unexpected image byte depth: %d (expected 1 for "
397+ " uint8_t data)" ,
398+ byte_depth)),
399+ error_msg);
398400 }
399401
400402 std::vector<int > pos_vec (pos, pos + pos_size);
401403 auto value = GetValue<uint8_t >(image, pos_vec);
402404 if (value.ok ()) {
403405 *out = *value;
404406 }
405- return ToMpStatus (value.status ());
407+ return HandleStatus (value.status (), error_msg );
406408}
407409
408410MP_EXPORT MpStatus MpImageGetValueUint16 (const MpImagePtr image, int * pos,
409- int pos_size, uint16_t * out) {
411+ int pos_size, uint16_t * out,
412+ char ** error_msg) {
410413 auto status = ValidateDimensions (image, pos_size);
411414 if (!status.ok ()) {
412- return ToMpStatus (status);
415+ return HandleStatus (status, error_msg );
413416 }
414417
415418 size_t byte_depth = GetImageFrameSharedPtr (image)->ByteDepth ();
416419 if (byte_depth != 2 ) {
417- ABSL_LOG (ERROR) << " Unexpected image byte depth: " << byte_depth
418- << " (expected 2 for uint16_t data)" ;
419- return kMpInvalidArgument ;
420+ return HandleStatus (absl::InvalidArgumentError (absl::StrFormat (
421+ " Unexpected image byte depth: %d (expected 2 for "
422+ " uint16_t data)" ,
423+ byte_depth)),
424+ error_msg);
420425 }
421426
422427 std::vector<int > pos_vec (pos, pos + pos_size);
423428 auto value = GetValue<uint16_t >(image, pos_vec);
424429 if (value.ok ()) {
425430 *out = *value;
426431 }
427- return ToMpStatus (value.status ());
432+ return HandleStatus (value.status (), error_msg );
428433}
429434
430435MP_EXPORT MpStatus MpImageGetValueFloat32 (const MpImagePtr image, int * pos,
431- int pos_size, float * out) {
436+ int pos_size, float * out,
437+ char ** error_msg) {
432438 auto status = ValidateDimensions (image, pos_size);
433439 if (!status.ok ()) {
434- return ToMpStatus (status);
440+ return HandleStatus (status, error_msg );
435441 }
436442
437443 size_t byte_depth = GetImageFrameSharedPtr (image)->ByteDepth ();
438444 if (byte_depth != 4 ) {
439- ABSL_LOG (ERROR) << " Unexpected image byte depth: " << byte_depth
440- << " (expected 4 for float data)" ;
441- return kMpInvalidArgument ;
445+ return HandleStatus (absl::InvalidArgumentError (absl::StrFormat (
446+ " Unexpected image byte depth: %d (expected 4 for "
447+ " float data)" ,
448+ byte_depth)),
449+ error_msg);
442450 }
443451
444452 std::vector<int > pos_vec (pos, pos + pos_size);
445453 auto value = GetValue<float >(image, pos_vec);
446454 if (value.ok ()) {
447455 *out = *value;
448456 }
449- return ToMpStatus (value.status ());
457+ return HandleStatus (value.status (), error_msg );
450458}
451459
452460MP_EXPORT void MpImageFree (MpImagePtr image) { delete image; }
0 commit comments