Могут ли декодеры Media Code c выводить RGB-подобные форматы? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь преобразовать видео VP9 с помощью Android Media Code c. Когда я устанавливаю KEY_COLOR_FORMAT для формата, отличного от форматов YUV, я получаю следующую ошибку: «[OMX.qcom.video.decoder.vp9] не поддерживает цветовой формат XXXX.»

Например, формат COLOR_FormatSurface , похоже, не поддерживается. Или я делаю что-то не так. Нужно ли вручную выполнять преобразование YUV в RGB? Если да, то какова цель предоставления Surfacetexture для кода c?

Вот пример кода:

public class VideoDecoder
{
    private MediaCodec mVideoCodec = null;
    private ByteBuffer[] mInputBuffers;
    private ByteBuffer[] mOutputBuffers;

    public VideoDecoder(int width, int height)
    {
        try
        {

            // Media settings
            MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_VP9,
                    width,
                    height);


            format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
            // COLOR_FormatYUV420Flexible

            // Configure the decoder
            mVideoCodec =  MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_VIDEO_VP9);

            mVideoCodec.configure(format,
                    null,
                    null,
                    0);

            // Start the decoder
            mVideoCodec.start();

            mInputBuffers = mVideoCodec.getInputBuffers();
            mOutputBuffers = mVideoCodec.getOutputBuffers();
        }
        catch(Exception e)
        {
            Log.e("VideoDecoder", "CreateCodec failed message =" + e.getMessage());
        }
    }

    public void release()
    {
        mVideoCodec.stop();
        mVideoCodec.release();
    }

    public void decode(byte[] rawBuffer, int frameSize)
    {
        //todo
    }
}

Спасибо!

1 Ответ

1 голос
/ 24 марта 2020

Из кода носителя c документация способ go - использовать поверхность. Он может неявно выполнять преобразование вывода кода c в свою текстуру (BGRA). Таким образом, поток хотел бы:

1) Вызвать Surface.updateTexImage () при получении обратного вызова onFrameAvailable . Требуется вызвать в потоке, владеющем текущим графическим c контекстом.

2) Скопировать данные текстуры в другую текстуру. Потребуется преобразовать текстурные координаты в соответствии с матрицей преобразования поверхности с помощью шейдера.

3) При необходимости прочитайте результат на ЦПУ. Для бывших с gles20.glreadpixels

...