sws_scale на необработанных данных yuv420p - PullRequest
0 голосов
/ 09 ноября 2019

Я получаю данные камеры от моего Raspberry Pi в формате yuv420p. Я пытаюсь использовать sws_scale для преобразования их в формат RGBA. Вот как я инициализирую свой контекст:

_sws_context = sws_getContext(CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_YUV420P,
                                      CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_RGBA, 0, nullptr, nullptr, nullptr);

Теперь я немного запутался в том, как установить данные и размер строки для sws_scale. С камеры я просто получаю простой массив байтов без дальнейшей структуры. Я предполагаю, что должен как-то разделить это на плоскости. Мой первый подход не состоял в том, чтобы отделить его вообще, и, по сути, иметь что-то вроде этого (основываясь на том факте, что:

const uint8_t *src_data[] = {data.data()};
const int src_strides[] = {(int) std::ceil((CAMERA_WIDTH * 6) / 8)};

Это основывалось на:

12 битдля сетки пикселей 2x2

Итак, я предположил, что одна строка будет использовать половину этого. Но это вызывает ошибку сегментации. Поэтому я думаю, что мне как-то нужно разделить src_data и src_strides насоответствующие плоскости YUV, но я не уверен, как это сделать, тем более что один пиксель для данных YUV420 использует менее одного байта на плоскость ...

1 Ответ

0 голосов
/ 09 ноября 2019

Оказывается, это проще, чем я думал! Самолеты расположены один за другим, что также делает шаги довольно очевидными:

        const auto y = data.data();
        const auto u = y + CAMERA_WIDTH * CAMERA_HEIGHT;
        const auto v = u + (CAMERA_WIDTH * CAMERA_HEIGHT) / 4;

        const auto stride_y = CAMERA_WIDTH;
        const auto stride_u = CAMERA_WIDTH / 2;
        const auto stride_v = CAMERA_WIDTH / 2;
...