Возможности дисплея (например, режимы и поддерживаемые типы HDR) могут динамически меняться на устройствах с внешними дисплеями (с HDMI или DisplayPort), таких как ТВ-приставки Android TV и OTT-устройства. Это может произойти в результате сигнала горячего подключения HDMI, например когда пользователь переключается с одного дисплея на другой или запускает устройство без подключенного дисплея. В Android 12 и более поздних версиях фреймворк поддерживает горячее подключение и динамические возможности дисплея.
На этой странице описано, как реализация Composer HAL обрабатывает горячее подключение дисплея и изменения его возможностей. Кроме того, в ней рассказывается, как управлять связанным буфером кадров и предотвращать состояние гонки в таких ситуациях.
Как обновить возможности экрана
В этом разделе описано, как фреймворк Android обрабатывает изменения возможностей дисплея, инициированные Composer HAL.
Чтобы Android мог правильно обрабатывать изменения возможностей дисплея, производитель оборудования должен реализовать Composer HAL таким образом, чтобы он использовал onHotplug(display, connection=CONNECTED) для уведомления фреймворка о любых изменениях возможностей дисплея. После этого Android обрабатывает изменения возможностей дисплея следующим образом:
- При обнаружении изменения возможностей дисплея фреймворк получает уведомление
onHotplug(display, connection=CONNECTED). - Получив уведомление, фреймворк сбрасывает состояние экрана и воссоздает его с новыми возможностями из HAL, используя методы
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilitiesиgetDisplayCapabilities. - После того как фреймворк воссоздаст новое состояние экрана, он отправит обратный вызов
onDisplayChangedприложениям, которые прослушивают такие события.
Фреймворк перераспределяет буферы кадров при последующих событиях onHotplug(display, connection=CONNECTED). Подробнее о том, как правильно управлять памятью буфера кадра клиента, чтобы избежать сбоев при выделении новых буферов кадра…
Как обрабатывать распространенные сценарии подключения
В этом разделе рассказывается, как правильно обрабатывать различные сценарии подключения и отключения основного дисплея.
Поскольку фреймворк Android был разработан для мобильных устройств, в нем нет встроенной поддержки отключенного основного экрана. Вместо этого HAL должен заменять основной дисплей на заглушку при взаимодействии с фреймворком, если основной дисплей физически отключен.
Ниже описаны сценарии, которые могут возникать при использовании ТВ-приставок и ТВ-модулей с внешними дисплеями, которые можно отсоединить. Чтобы реализовать поддержку этих сценариев, воспользуйтесь информацией из таблицы ниже.
| Сценарий | Эксплуатация |
|---|---|
| При загрузке не подключен дисплей |
|
| Основной экран подключен физически |
|
| Основной экран физически отключен. |
|
Подключение без использования HDMI
Android TV поддерживает только следующие разрешения:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
Когда ТВ-приставка или ТВ-модуль пытается отобразить неподдерживаемое разрешение, например 480i через подключение CVBS, пользователю показывается сообщение об ошибке.
Если у телеприставки или ТВ-адаптера есть как HDMI-, так и другие разъемы, то HDMI-разъем является основным, а остальные неактивны. В результате, если HDMI-подключение будет отключено, когда подключение без HDMI ещё установлено, в SurfaceFlinger будет отправлено событие, и возможности экрана без HDMI должны быть отражены с помощью getDisplayAttribute и других API IComposerClient (например, getHdrCapabilities).
Используйте последовательные идентификаторы конфигурации, чтобы предотвратить состояние гонки
Состояния гонки могут возникать, если HAL Composer обновляет поддерживаемые конфигурации дисплея одновременно с фреймворком, вызывающим setActiveConfig или setActiveConfigWithConstraints. Чтобы избежать этой проблемы, реализуйте Composer HAL для использования последовательных идентификаторов.
В этом разделе описывается, как могут возникать состояния гонки, а затем приводятся подробные сведения о том, как реализовать Composer HAL, чтобы он использовал последовательные идентификаторы для предотвращения таких условий.
Рассмотрим следующую последовательность событий, когда новым конфигурациям дисплея НЕ присваиваются новые последовательные идентификаторы, что приводит к состоянию гонки:
Поддерживаются следующие идентификаторы конфигурации дисплея:
- id=1, 1080 x 1920, 60 Гц
- id=2, 1080x1920, 50 Гц
Фреймворк вызывает
setActiveConfig(display, config=1).Одновременно с этим HAL Composer обрабатывает изменение конфигурации дисплея и обновляет свое внутреннее состояние до нового набора конфигураций дисплея, как показано ниже:
- id=1, 2160x3840 60 Гц
- id=2, 2160x3840 50 Гц
- id=3, 1080 x 1920, 60 Гц
- id=4, 1080x1920, 50 Гц
Composer HAL отправляет в фреймворк событие
onHotplug, чтобы сообщить об изменении набора поддерживаемых режимов.Уровень абстракции Composer HAL получает
setActiveConfig(display, config=1)(из шага 2).HAL интерпретирует это так, что фреймворк запросил изменение конфигурации на 2160 x 3840, 60 Гц, хотя на самом деле было выбрано 1080 x 1920, 60 Гц.
На этом этапе процесс с использованием непоследовательных назначений идентификаторов завершается с неправильной интерпретацией выбранного изменения конфигурации.
Как настроить Composer HAL для использования последовательных идентификаторов
Чтобы избежать таких состояний гонки, OEM-производитель должен реализовать Composer HAL следующим образом:
- Когда Composer HAL обновляет поддерживаемые конфигурации дисплея, он присваивает новым конфигурациям новые последовательные идентификаторы.
- Когда фреймворк вызывает
setActiveConfigилиsetActiveConfigWithConstraintsс недопустимым идентификатором конфигурации, Composer HAL игнорирует вызов.
Эти шаги позволяют предотвратить состояние гонки, как показано в обсуждении ниже.
Рассмотрим следующую последовательность событий, когда новым конфигурациям дисплея назначаются новые последовательные идентификаторы:
Поддерживаются следующие идентификаторы конфигурации дисплея:
- id=1, 1080 x 1920, 60 Гц
- id=2, 1080 x 1920, 50 Гц
Фреймворк вызывает
setActiveConfig(display, config=1).Когда обрабатывается изменение конфигурации дисплея, следующий набор идентификаторов конфигурации назначается, начиная со следующего неиспользуемого целого числа, как показано ниже:
id=3, 2160 x 3840, 60 Гц
id=4, 2160 x 3840, 50 Гц
id=5, 1080x1920 60 Гц
id=6, 1080 x 1920, 50 Гц
HAL композитора отправляет в фреймворк событие
onHotplug, чтобы сообщить об изменении набора поддерживаемых режимов.HAL-модуль Composer получает
setActiveConfig(display, config=1)(из шага 2).Composer HAL игнорирует вызов, поскольку идентификатор больше недействителен.
Фреймворк получает и обрабатывает событие
onHotplugиз шага 4. Он вызывает HAL Composer с помощью функцийgetDisplayConfigsиgetDisplayAttribute. С помощью этих функций фреймворк определяет новый идентификатор (5) для выбранного разрешения и частоты обновления: 1080 x 1920 и 60 Гц.Фреймворк отправляет другое событие
setActiveConfigс обновленным идентификатором 5.Уровень абстрагирования Composer HAL получает
setActiveConfig(display, config=5)из шага 5.HAL правильно интерпретирует запрос фреймворка на изменение конфигурации на 1080 x 1920 при 60 Гц.
Как показано в предыдущем примере, процесс с последовательным назначением идентификаторов позволяет предотвратить состояние гонки и обновить правильную конфигурацию дисплея.