CFG_OMX_SEMWAIT_TIMEOUT

This commit is contained in:
Devaev Maxim
2020-11-27 01:46:33 +03:00
parent 28563abdbc
commit 1b2de09438

View File

@@ -52,7 +52,7 @@ static const OMX_U32 _OUTPUT_PORT = 341;
static int _i_omx = 0; static int _i_omx = 0;
static int _vcos_semwait(VCOS_SEMAPHORE_T *sem, long double timeout); static int _vcos_semwait(VCOS_SEMAPHORE_T *sem);
static int _omx_init_component(struct omx_encoder_t *omx); static int _omx_init_component(struct omx_encoder_t *omx);
static int _omx_init_disable_ports(struct omx_encoder_t *omx); static int _omx_init_disable_ports(struct omx_encoder_t *omx);
static int _omx_setup_input(struct omx_encoder_t *omx, struct device_t *dev); static int _omx_setup_input(struct omx_encoder_t *omx, struct device_t *dev);
@@ -238,7 +238,7 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev,
} }
} }
if (_vcos_semwait(&omx->handler_sem, 3.0) != 0) { if (_vcos_semwait(&omx->handler_sem) != 0) {
return -1; return -1;
} }
} }
@@ -249,13 +249,16 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev,
return 0; return 0;
} }
static int _vcos_semwait(VCOS_SEMAPHORE_T *sem, long double timeout) { static int _vcos_semwait(VCOS_SEMAPHORE_T *sem) {
// vcos_semaphore_wait() can wait infinite // vcos_semaphore_wait() can wait infinite
// vcos_semaphore_wait_timeout() is broken by design: // vcos_semaphore_wait_timeout() is broken by design:
// - https://github.com/pikvm/ustreamer/issues/56 // - https://github.com/pikvm/ustreamer/issues/56
// - https://github.com/raspberrypi/userland/issues/658 // - https://github.com/raspberrypi/userland/issues/658
// CFG_OMX_SEMWAIT_TIMEOUT is ugly busyloop
// Три стула.
long double deadline_ts = get_now_monotonic() + timeout; # ifdef CFG_OMX_SEMWAIT_TIMEOUT
long double deadline_ts = get_now_monotonic() + (long double)CFG_OMX_SEMWAIT_TIMEOUT; // Seconds
VCOS_STATUS_T sem_status; VCOS_STATUS_T sem_status;
while (true) { while (true) {
@@ -275,6 +278,9 @@ static int _vcos_semwait(VCOS_SEMAPHORE_T *sem, long double timeout) {
default: LOG_ERROR("Can't wait VCOS semaphore: %d", sem_status); break; default: LOG_ERROR("Can't wait VCOS semaphore: %d", sem_status); break;
} }
return -1; return -1;
# else
return (vcos_semaphore_wait(sem) == VCOS_SUCCESS ? 0 : -1);
# endif
} }
static int _omx_init_component(struct omx_encoder_t *omx) { static int _omx_init_component(struct omx_encoder_t *omx) {