Обработка видео HDR10 на Android с помощью MediaCodec

Я хочу сделать тональное отображение HDR10 на Android, используя OpenGL ES, первым делом нужно получить данные кадра. На Android после декодирования видео медиакодеком его данные находятся на внешней текстуре oes, я хочу знать, какой внутренний формат текстуры при декодировании видео hdr10.

Могу ли я получить 10-битные данные из этой внешней текстуры oes и, если возможно, как обрабатывать 10-битные данные в OpenGL ES (используя текстуру с плавающей запятой?).

Я попытался запросить формат текстуры, но не смог, указанное значение кажется неверным. А так же ширина и высота текстуры.

glGetTexLevelParameteriv(GL_TEXTURE_EXTERNAL_OES, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);

person wchen61    schedule 24.02.2020    source источник
comment
у вас есть новости по этому поводу? Удалось ли вам каким-либо образом обработать видео hdr10 с помощью OpenGL ES?   -  person Alexandru    schedule 29.07.2020
comment
Есть два варианта: 1. Декодировать с помощью MediaCodec и обрабатывать данные с помощью opengles (возможно, данные понижены до 8 бит, но цвет в порядке). 2. Декодирование с помощью MediaCodec и рендеринг с помощью SurfaceView напрямую, как предложено @why.   -  person wchen61    schedule 06.09.2020


Ответы (2)


В общем случае для YUV вам нужно использовать внешний сэмплер, который будет включать преобразование цвета в RGB. Не существует стандарта того, что представляет собой макет памяти Android для поверхностей YUV, в частности, для 10-битных, где есть несколько конкурирующих «стандартов», поэтому все, что вы делаете здесь, касающееся необработанных данных YUV, будет непереносимым и несовместимым с устройством. специфический.

Соответствует ли значение rgb, которое я получаю, 10-битному значению в HDR-видео?

Это должно быть преобразованное в цвет представление 10-битного значения, при условии, что оно было преобразовано правильно. У меня, очевидно, нет возможности проверить это, и здесь нет жесткой спецификации. Не могли бы вы просто получить 8-битный эквивалент? Да, это, безусловно, возможно.

person solidpixel    schedule 24.02.2020
comment
Спасибо @solidpixel, я хочу знать, можно ли использовать медиакодек для декодирования видео HDR10, а затем обрабатывать внешнюю текстуру oes в OpenGL ES для тонального отображения. Я имею в виду, что в моей шейдерной программе я могу прочитать пиксель вот так. ``` единый сэмплерExternalOES u_texture; vec3 rgb = текстура (u_texture, v_tex_coord_out).rgb; ``` Значение rgb, которое я получаю, является 10-битным значением в HDR-видео? - person wchen61; 24.02.2020
comment
Извините за неправильный формат, так как впервые пользуюсь этим сайтом. :) Я имею в виду, что значение rgb уже нормализовано от 0 до 1, я не знаю, его точность составляет 8 бит или 10 бит. - person wchen61; 24.02.2020

вы не можете получить 10-битные данные из текстуры oes. мы не можем установить формат текстуры OES (например, плавающую текстуру). Вы можете проверить этот процесс, выведя текстуру oes в fbo. На самом деле oes 8 бит.

person why    schedule 15.06.2020
comment
Вы имеете в виду, что Android OES всегда имеет 8-битную текстуру? Я действительно хочу знать, как играть с 10-битным видео на Android с медиакодеком? - person wchen61; 22.06.2020
comment
Да, пока что OES действительно 8-битный. Я использовал 8-битные и 10-битные данные для meidacodec, но я могу получить только 8-битные (то есть RGBA8). Если вы хотите воспроизводить 10-битное видео, вы не можете использовать mediacodec + opengl. Декодирование и рендеринг медиакодеков — хороший выбор. - person why; 23.06.2020