Первый порт подключается к порту ввода камеры (порт № 73), порт активируется с помощью команды «OMX_CommandPortEnable», так как с помощью команды «OMX_CommandPortDisable» компонент камеры должен запускать его «OMX_CALLBACKTYPE :: EventHandler »обработчик событий, имеющий« eEvent == OMX_EventCmdComplete »и« nData1 == OMX_CommandPortEnable », однако этого никогда не происходит, и приложение бесконечно ждет, пока порт станет активным.
Я использую std :: condition_variable в сочетании с std :: mutex для ожидания завершения изменения состояния, поэтому OMX_CALLBACKTYPE :: EventHandler обновляет условную переменную и вызывает «notify_one ()», пока поток вызывающей стороны блокирует std :: mutex и дождитесь, когда будет установлена переменная условия, при таком подходе OMX_CALLBACKTYPE :: EventHandler никогда не вызывается (с любым аргументом), и программа блокируется навсегда.
НОТА: При ожидании условной переменной проверяется, что мьютекс не принадлежит, это делается путем проверки (0 == std :: mutex :: __ owner).
ТЕМ НЕ МЕНИЕ, Все отлично работает при опросе состояния порта путем итеративного вызова usleep и OMX_GetParameter (OMX_IndexParamPortDefinition).
Почему «OMX_CALLBACKTYPE :: EventHandler» срабатывает при опросе его значения и НЕ срабатывает при использовании условной переменной? С окнами есть понятие APC & Оповещаемые темы, есть ли эквивалент в Linux? Тот, который может объяснить вышеупомянутое?
Мой опыт показывает, что включение порта не вызывает обратный вызов события, пока порт не будет заполнен буферами. То есть последовательность:
OMX_SendCommand()
с OMX_CommandPortEnable
).OMX_AllocateBuffer()
или же OMX_UseBuffer()
).OMX_CommandPortEnable
обратный вызовЕсли вы дождетесь обратного вызова события, прежде чем выделите буферы, у вас будет тупик.
Когда вы проводите опрос с помощью тестирования OMX_PARAM_PORTDEFINITIONTYPE.bEnabled
собирается вернуться OMX_TRUE
немедленно, потому что спецификация говорит, что этот элемент установлен синхронно:
Порт должен немедленно установить
bEnabled
в своем определении порта
структура, когда порт получаетOMX_CommandPortEnable
,
Вот что я думаю, что происходит для вас, когда все «работает»:
bEnabled
является OMX_TRUE
(что происходит сразу).OMX_CommandPortEnable
обратный вызовВы можете ошибочно думать, что это происходит в следующем порядке:
bEnabled
является OMX_TRUE
(что происходит сразу).OMX_CommandPortEnable
обратный вызовЭто создает впечатление, что использование условной переменной как-то меняет поведение OpenMAX. В действительности bEnabled
и OMX_CommandPortEnable
обратный вызов на самом деле не сообщают об одном и том же. Я не верю, что какая-либо синхронизация необходима (или желательна) между включением порта и распределением его буферов.
Других решений пока нет …