как преобразовать буфер Y, U, V в одномерный массив - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь преобразовать файл hls в jpeg. во-первых, я использовал openh264 для преобразования файла HLS в YUV. Я получил двумерный массив, содержащий буфер Y, U, V (* pData [3]). После этого я пытаюсь объединить три массива в один, чтобы передать его CompressYUYV2JPEG . вот как я конвертирую:

for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[0][i]);
    }
    l = bufferInfo.UsrData.sSystemBuffer.iWidth*bufferInfo.UsrData.sSystemBuffer.iHeight/4;
    for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[1][i]);
    }
    l = bufferInfo.UsrData.sSystemBuffer.iWidth*bufferInfo.UsrData.sSystemBuffer.iHeight/4;
    for(i = 0; i < l; i++) {
        inbuf.push_back(yuvData[2][i]);
    }

но, к сожалению, он не дает ожидаемого результата. Как правильно преобразовать двумерный массив YUV в одномерный массив?

1 Ответ

0 голосов
/ 22 января 2019

Вам нужен YUV422. Это значит, YUYV. inbuf должно делиться на 4 для каждых входных данных. Вы можете использовать

for(i = 0; i < l/2; i++) {
    inbuf.push_back(yuvData[0][2*i]);
    inbuf.push_back((yuvData[1][2*i] + yuvData[1][2*i + 1])/2);
    inbuf.push_back(yuvData[0][2*i + 1]);
    inbuf.push_back((yuvData[2][2*i] + yuvData[2][2*i + 1])/2);
}

В этом фрагменте кода используются все значения Y, но только среднее значение двух Cr соответственно. Значения Cb используются. Конечно, количество элементов в каждом канале yuvData должно быть четным. В противном случае вы должны найти решение для последнего элемента.

Я только сейчас увидел, что вы используете YUV420. Тогда вы можете использовать этот фрагмент

for(i = 0; i < l/2; i++) {
    inbuf.push_back(yuvData[0][2*i]);
    inbuf.push_back(yuvData[1][i/2]);
    inbuf.push_back(yuvData[0][2*i + 1]);
    inbuf.push_back(yuvData[2][i/2]);
}

В этом коде все значения Y используются один раз и все Cr соотв. Значения Cb используются дважды.

...