В чем разница между YUVFormat.YUV_420 и ColorSpace.YUV420?

Я искал и прочитал тонну источников, но не могу найти ответ. Я думал, что эти "типы" были равны, но когда я декодировал h264 в байты, используя jcodec, я предполагал, что вывод данных был YUV 4:2:O Planar (YUV420P); это ожидаемый тип ввода для моего кодера VPX. Кодированное изображение VPX выглядит следующим образом:введите описание изображения здесь

Поэтому я должен предположить, что, хотя YUVFormat.YUV_420, скорее всего, YUV420P, ColorSpace.YUV420 - это другой вариант YUV420. Кто-нибудь знает, какой это вариант, чтобы я мог найти процедуру преобразования?

2 ответа

Решение

Один формат чередует данные u и v для полной строки сканирования. другой записывает все U, а затем все данные v. Это после всего изображения Y. yuv420 и yuv420p указывает, какой макет. yuv420 записывает все u, затем все v-данные, yv420p чередует строку сканирования u и v за строкой сканирования. Это изображение может вводить в заблуждение, потому что размер данных достаточно мал, чтобы не показывать большие блоки пикселей u и v.

yuv420 non P

Я считаю, что yuv420p будет чередовать U1U2U3 V1V2V3 U4U5U6 V4V5V6

Я думаю, что вы получаете yuv420sp вместо yuv420p. Это объясняет горизонтальные полосы на изображении. Полуплоские форматы чередуют плоскости U и V.

// 420p to 420sp
int frameSize = width * height;
int qFrameSize = frameSize / 4;
for (int i = 0; i < (qFrameSize); i++) {  
    input[frameSize + i*2] = (input[frameSize + qFrameSize + i]);  
    input[frameSize + i*2 + 1] = (input[frameSize + i]);   
} 
Другие вопросы по тегам