Camera2: как (безопасно) использовать идентификатор группы поверхностей в OutputConfiguration? - PullRequest
0 голосов
/ 28 октября 2019

Согласно документам , OutputConfigurations может иметь идентификатор группы поверхностей:

Идентификатор группы поверхностей используется для определения, к какой группе поверхностей относится данная выходная поверхность. Группа поверхностей - это группа выходных поверхностей, которые не предназначены для одновременного приема потоков выходных буферов камеры. CameraDevice может иметь возможность совместно использовать буферы, используемые всеми поверхностями из одной и той же группы поверхностей, поэтому может уменьшить общий объем памяти. Приложение должно устанавливать один и тот же идентификатор набора для потоков, которые не являются одновременно потоковыми. Отрицательный идентификатор указывает, что эта поверхность не принадлежит ни к одной группе поверхностей. Значением по умолчанию является .SURFACE_GROUP_ID_NONE.

И в соответствии с приведенным примером мне кажется, что добавление нескольких OutputConfigurations с одинаковым идентификатором группы поверхностей к StreamConfiguration - это то, чторазрешено и должно работать хорошо (при условии, что потоки не запускаются одновременно и что цели CaptureRequest соответствуют одной из конфигураций SUPPORTED_HARDWARE_LEVEL):

Например, приложение видеочата, которое имеет адаптивныйФункция выходного разрешения потребует двух (или более) выходных разрешений, чтобы переключать разрешения без каких-либо сбоев вывода. Однако в любой момент времени активен только один выход, чтобы минимизировать пропускную способность исходящей сети и накладные расходы на кодирование. Чтобы сохранить память, приложение должно настроить видеовыходы на одинаковый неотрицательный идентификатор группы, чтобы устройство камеры могло использовать одну и ту же область памяти для чередующихся выходов.

Однако, это несколько противоречит тому, что нам говорят при создании сеанса захвата .

Хотя любой из размеров из StreamConfigurationMap # getOutputSizes может использоваться, когда один выходной поток являетсяесли устройство настроено, данное устройство камеры может не поддерживать все комбинации размеров, форматов и целей, если одновременно сконфигурировано несколько выходов. В приведенных ниже таблицах указаны максимальные гарантированные разрешения для комбинаций потоков и целей с учетом возможностей устройства камеры.

Если приложение пытается создать сеанс с использованием набора целей, которые превышают пределы, описанные нижетаблицы, одна из трех возможностей может возникнуть. Во-первых, сеанс может быть успешно создан и работать нормально. Во-вторых, сеанс может быть успешно создан, но устройство камеры не будет соответствовать гарантиям частоты кадров, как описано в StreamConfigurationMap # getOutputMinFrameDuration. Или, в-третьих, если выходной набор вообще не может быть использован, создание сеанса завершится неудачно с вызовом CameraCaptureSession.StateCallback # onConfigureFailed.


Давайте рассмотрим пример:

Скажем, я хочу предварительный просмотр и вывод YUV, которые могут чередоваться между выходным размером PREVIEW, МАКСИМАЛЬНЫМ выходным размером и размером между первыми двумя. Если мне не нужно, чтобы выходы YUV были одновременными, было бы безопасно добавить эти три выхода в StreamConfiguration, зная, что такой конфигурации нет в таблицах гарантированных конфигураций?

// Preview config
OutputConfiguration previewOC = new OutputConfiguration(1, previewSurface);
previewOC.setPhysicalCameraId(mDesiredPhysicalCameraId);

// MAXIMUM output size YUV
OutputConfiguration yuvMaxOC =  new OutputConfiguration(2, yuvMaxImageReader.get().getSurface());
yuvMaxOC.setPhysicalCameraId(mDesiredPhysicalCameraId);


// PREVIEW output size YUV
OutputConfiguration yuvPrivOC =  new OutputConfiguration(2, yuvPrivImageReader.get().getSurface());
yuvPrivOC.setPhysicalCameraId(mDesiredPhysicalCameraId);


// In-bitween output size YUV
OutputConfiguration yuvMidOC =  new OutputConfiguration(2, yuvMidImageReader.get().getSurface());
yuvMidOC.setPhysicalCameraId(mDesiredPhysicalCameraId);

List<OutputConfiguration> outputList = Arrays.asList(previewOC, yuvMaxOC, yuvPrivOC, yuvMidOC);

// create the session config
SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR,
                        outputList,
                        mBackgroundProcessingExecutor,
                        stateCallback);
...

// create the capture session
mCameraDevice.createCaptureSession(sessionConfiguration);

Я предполагаю, что повторяющиеся запросы с различными комбинациями целевых поверхностей ( (preview, yuvMaxSurface), (preview, yuvPrivSurface), (preview, yuvMidSurface) ) будут использоваться для чередования выходных данных.


Я рассмотрел возможность того, что конфигурации действительно применимы к целям CaptureRequests, и в этом случае концепция идентификатора группы поверхностей работает, но это явно не то, что говорят документы, поэтому янемного запутался во всем этом.

Может ли кто-нибудь пролить свет на это? Будут ли идентификаторы группы на поверхности работать на некоторых телефонах, но с треском провалится на других?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...