Преобразование RGBA в IYUV - PullRequest
0 голосов
/ 21 января 2019

Как часть моего приложения, мне нужно конвертировать из RGBA в формат IYUV.

Я использую openGL ES для вызова glReadPixels (), который позже загружается в байтовый буфер с помощью вызова glMapBufferRange (). Я был в состоянии надежно считывать пиксели с экрана и сохранять данные в виде изображения. glReadPixels () возвращает данные только в формате RGBA.

Следующим шагом является подача этих данных в кодер h.264 для сжатия. Кодер h.264 (я полагаю) потребляет данные в формате IYUV.

Так что я ищу способ преобразования из цветового пространства RGBA в IYUV. Я относительно новичок в обработке изображений, поэтому я все еще изучаю многое. Любое движение в правильном направлении будет с благодарностью!

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

Этот код считывает данные с экрана через glReadPixelsPBO ()

            //generate and bind buffer ID
            GLES30.glGenBuffers(1, pboIds);
            checkGlError("Gen Buffers");
            GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pboIds.get(0));
            checkGlError("Bind Buffers");

            //creates and initializes data store for PBO.  Any pre-existing data store is deleted
            GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, (mWidth * mHeight * 4), null, GLES30.GL_STATIC_READ);
            checkGlError("Buffer Data");


            glReadPixelsPBO(0, 0, mWidth, mHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0);
            checkGlError("Read Pixels");

Этот код загружает пиксели в ByteBuffer

            //read pixels from PBO into a byte buffer for processing.  Unmap buffer for use in next pass
            mapBuffer = ((ByteBuffer) GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT)).order(ByteOrder.nativeOrder());
            checkGlError("Map Buffer");

            byte[] mBuffer;
            //ByteBuffer.get(destination) will dump bytes into byte array, then probs easier to print out in human readable
            Log.d(TAG, "Mapped Buffer Contents: \n");

            GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
            checkGlError("Unmap Buffer");

            convertColorSpace(mapBuffer);
...