x265 Encoder: порядок значений в массиве planes

В процессе кодирования с кодировщиком x265 (https://x265.readthedocs.org/en/default/api.html) Я хочу записать значения пикселей изображения (в частности, значения канала Y) в файл .txt после кодирования нового изображения (неважно, почему). Для этого я использую переменную 'planes' класса x265_picture:

x265_picture* pic_out; # variable where encoded image is to be stored 
... # encoding process
uint8_t *plane = (uint8_t*)pic_out->planes[0]; 
uint32_t pixelCount = x265_picturePlaneSize(pic_out->colorSpace, m_param->sourceWidth, m_param->sourceHeight, 0);
ofstream out_file("out_file.txt");

for (uint32_t j = 0; j < pixelCount; j++) # loop for all pixels
{
    int pix_val = plane[j];
    out << pix_val;
}

ofstream.close()

Но когда я реконструирую выходные данные в изображение, я получаю

введите здесь описание изображения

вместо

введите здесь описание изображения

или другой пример:

введите здесь описание изображения

вместо

введите здесь описание изображения

(цвет не важен, беспокоят "полоски")

В выходном файле есть интервалы данных в (очевидно) правильном порядке (скажем, 89,90,102,98,...), за которыми всегда следует длинная последовательность одинаковых чисел (например, 235,235,235,235... или 65,65, 65,65...), которые «создают» полосы. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает?


person user2208392    schedule 01.10.2015    source источник
comment
Где вы берете функцию x265_picturePlaneSize? Я не вижу его в шапке.   -  person Pescolly    schedule 16.06.2016
comment
не использовал это некоторое время, но он находится в x265/source/common/common.cpp   -  person user2208392    schedule 29.06.2016
comment
его определение: uint32_t x265_picturePlaneSize(int csp, int width, int height, int plane) { uint32_t size = (uint32_t)(width ›› x265_cli_csps[csp].width[plane]) * (height ›› x265_cli_csps[csp].height [самолет]); размер возврата; }   -  person user2208392    schedule 29.06.2016
comment
Спасибо за указатель.   -  person Pescolly    schedule 29.06.2016


Ответы (1)


спасибо, ребята, только что решил это... ключ использует 'src += srcStride':

ofstream out_file("out_file.txt");
int srcStride = pic_out->stride[0] / sizeof(pixel);
uint8_t* src = (uint8_t*) pic_out->planes[0];

for (int y = 0; y < m_param->sourceHeight; y++, src += srcStride)
{
    for (int x = 0; x < m_param->sourceWidth; x++)
        out_file << (int)(src[x]) << ",";
}
out_file.close();
person user2208392    schedule 06.10.2015