1 use super::Result;
2 use thiserror::Error;
3 
4 #[repr(i32)]
5 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
6 pub enum MediaErrorResult {
7     CodecErrorInsufficientResource = ffi::media_status_t_AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE,
8     CodecErrorReclaimed = ffi::media_status_t_AMEDIACODEC_ERROR_RECLAIMED,
9     ErrorUnknown = ffi::media_status_t_AMEDIA_ERROR_UNKNOWN,
10     ErrorMalformed = ffi::media_status_t_AMEDIA_ERROR_MALFORMED,
11     ErrorUnsupported = ffi::media_status_t_AMEDIA_ERROR_UNSUPPORTED,
12     ErrorInvalidObject = ffi::media_status_t_AMEDIA_ERROR_INVALID_OBJECT,
13     ErrorInvalidParameter = ffi::media_status_t_AMEDIA_ERROR_INVALID_PARAMETER,
14     ErrorInvalidOperation = ffi::media_status_t_AMEDIA_ERROR_INVALID_OPERATION,
15     ErrorEndOfStream = ffi::media_status_t_AMEDIA_ERROR_END_OF_STREAM,
16     ErrorIo = ffi::media_status_t_AMEDIA_ERROR_IO,
17     ErrorWouldBlock = ffi::media_status_t_AMEDIA_ERROR_WOULD_BLOCK,
18     DrmErrorBase = ffi::media_status_t_AMEDIA_DRM_ERROR_BASE,
19     DrmNotProvisioned = ffi::media_status_t_AMEDIA_DRM_NOT_PROVISIONED,
20     DrmResourceBusy = ffi::media_status_t_AMEDIA_DRM_RESOURCE_BUSY,
21     DrmDeviceRevoked = ffi::media_status_t_AMEDIA_DRM_DEVICE_REVOKED,
22     DrmShortBuffer = ffi::media_status_t_AMEDIA_DRM_SHORT_BUFFER,
23     DrmSessionNotOpened = ffi::media_status_t_AMEDIA_DRM_SESSION_NOT_OPENED,
24     DrmTamperDetected = ffi::media_status_t_AMEDIA_DRM_TAMPER_DETECTED,
25     DrmVerifyFailed = ffi::media_status_t_AMEDIA_DRM_VERIFY_FAILED,
26     DrmNeedKey = ffi::media_status_t_AMEDIA_DRM_NEED_KEY,
27     DrmLicenseExpired = ffi::media_status_t_AMEDIA_DRM_LICENSE_EXPIRED,
28     ImgreaderErrorBase = ffi::media_status_t_AMEDIA_IMGREADER_ERROR_BASE,
29     ImgreaderNoBufferAvailable = ffi::media_status_t_AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE,
30     ImgreaderMaxImagesAcquired = ffi::media_status_t_AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED,
31     ImgreaderCannotLockImage = ffi::media_status_t_AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE,
32     ImgreaderCannotUnlockImage = ffi::media_status_t_AMEDIA_IMGREADER_CANNOT_UNLOCK_IMAGE,
33     ImgreaderImageNotLocked = ffi::media_status_t_AMEDIA_IMGREADER_IMAGE_NOT_LOCKED,
34 }
35 
36 #[derive(Debug, Error)]
37 pub enum NdkMediaError {
38     #[error("error Media result ({0:?})")]
39     ErrorResult(MediaErrorResult),
40     #[error("unknown Media error result ({0})")]
41     UnknownResult(i32),
42 }
43 
44 impl NdkMediaError {
from_status<T>( status: ffi::media_status_t, on_success: impl FnOnce() -> T, ) -> Result<T>45     pub(crate) fn from_status<T>(
46         status: ffi::media_status_t,
47         on_success: impl FnOnce() -> T,
48     ) -> Result<T> {
49         use MediaErrorResult::*;
50         let result = match status {
51             ffi::media_status_t_AMEDIA_OK => return Ok(on_success()),
52             ffi::media_status_t_AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE => {
53                 CodecErrorInsufficientResource
54             }
55             ffi::media_status_t_AMEDIACODEC_ERROR_RECLAIMED => CodecErrorReclaimed,
56             ffi::media_status_t_AMEDIA_ERROR_UNKNOWN => ErrorUnknown,
57             ffi::media_status_t_AMEDIA_ERROR_MALFORMED => ErrorMalformed,
58             ffi::media_status_t_AMEDIA_ERROR_UNSUPPORTED => ErrorUnsupported,
59             ffi::media_status_t_AMEDIA_ERROR_INVALID_OBJECT => ErrorInvalidObject,
60             ffi::media_status_t_AMEDIA_ERROR_INVALID_PARAMETER => ErrorInvalidParameter,
61             ffi::media_status_t_AMEDIA_ERROR_INVALID_OPERATION => ErrorInvalidOperation,
62             ffi::media_status_t_AMEDIA_ERROR_END_OF_STREAM => ErrorEndOfStream,
63             ffi::media_status_t_AMEDIA_ERROR_IO => ErrorIo,
64             ffi::media_status_t_AMEDIA_ERROR_WOULD_BLOCK => ErrorWouldBlock,
65             ffi::media_status_t_AMEDIA_DRM_ERROR_BASE => DrmErrorBase,
66             ffi::media_status_t_AMEDIA_DRM_NOT_PROVISIONED => DrmNotProvisioned,
67             ffi::media_status_t_AMEDIA_DRM_RESOURCE_BUSY => DrmResourceBusy,
68             ffi::media_status_t_AMEDIA_DRM_DEVICE_REVOKED => DrmDeviceRevoked,
69             ffi::media_status_t_AMEDIA_DRM_SHORT_BUFFER => DrmShortBuffer,
70             ffi::media_status_t_AMEDIA_DRM_SESSION_NOT_OPENED => DrmSessionNotOpened,
71             ffi::media_status_t_AMEDIA_DRM_TAMPER_DETECTED => DrmTamperDetected,
72             ffi::media_status_t_AMEDIA_DRM_VERIFY_FAILED => DrmVerifyFailed,
73             ffi::media_status_t_AMEDIA_DRM_NEED_KEY => DrmNeedKey,
74             ffi::media_status_t_AMEDIA_DRM_LICENSE_EXPIRED => DrmLicenseExpired,
75             ffi::media_status_t_AMEDIA_IMGREADER_ERROR_BASE => ImgreaderErrorBase,
76             ffi::media_status_t_AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE => ImgreaderNoBufferAvailable,
77             ffi::media_status_t_AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED => ImgreaderMaxImagesAcquired,
78             ffi::media_status_t_AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE => ImgreaderCannotLockImage,
79             ffi::media_status_t_AMEDIA_IMGREADER_CANNOT_UNLOCK_IMAGE => ImgreaderCannotUnlockImage,
80             ffi::media_status_t_AMEDIA_IMGREADER_IMAGE_NOT_LOCKED => ImgreaderImageNotLocked,
81             _ => return Err(NdkMediaError::UnknownResult(status)),
82         };
83         Err(NdkMediaError::ErrorResult(result))
84     }
85 }
86