Ожидаемый формат YUV при использовании COLOR_FormatYUV420Flexible

Учитывая, что большинство констант цветового формата MediaCodec YUV устарели в API 23, при выборе COLOR_FormatYUV420Flexible в качестве цветового формата для MediaCodec «кодировщик», как можно узнать, какой конкретный формат YUV (плоский, полуплоский и т. д.) фактически ожидает кодировщик чем кормить?


person PerracoLabs    schedule 11.09.2019    source источник


Ответы (1)


При использовании COLOR_FormatYUV420Flexible вы не будете заранее знать при настройке кодировщика, какой именно макет он будет использовать.

При подаче данных в кодировщик вместо использования getInputBuffers() или getInputBuffer(int index) используйте getInputImage(int index). Это возвращает Image, который описывает (неявно) макет буфер и данные, которые вы должны ввести в него. Image.getPlanes() возвращает три Image.Plane, и каждый из них дает вам ByteBuffer начало этого буфера, и позволяет запрашивать строку и шаг пикселя этого буфера.

Класс Image.Plane позволяет описывать все возможные варианты плоскостной и полуплоскостной компоновки кадра (а также позволяет описывать другие компоновки, которые не вписываются в обычные плоскостные/полуплоскостные различия).

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

Для полуплоскости две плоскости цветности имеют шаг пикселя, равный 2, и байтовые буферы для двух плоскостей перекрываются, при этом буфер второй плоскости цветности начинается на один байт впереди буфера первой плоскости цветности.

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

person mstorsjo    schedule 12.09.2019