FFMpeg RGB32 в NV12 с использованием SWScale

Я пытаюсь преобразовать кадры RGB32 в кадры NV12 для подачи в кодировщик.

m_iWidthIn = 1920;
m_iHeightIn = 1080;
m_iWidthOut = (((iWidthIn  + 31) >> 5) << 5) //32bit align
m_heightOut = (((iHeightIn + 31) >> 5) << 5) //32bit align
m_outputPixelFormat = AV_PIX_FMT_NV12;

// allocate and fill buffers

m_sws = ::sws_getContext(m_iWidthIn, m_iHeightIn, AV_PIX_FMT_RGB32, m_iWidthOut, m_iHeightOut, m_outputPixelFormat, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr);
AVFrame* frameOut = av_frame_alloc();
frameOut->height = m_iHeightOut;
frameOut->width = m_iWidthOut;
frameOut->format = m_outputPixelFormat;
av_frame_get_buffer(frameOut, 32);
int linesize[1] = { m_iWidthIn * 4 };
uint8_t * data[1] = { m_inputBuffer  };
if (m_bFlip)
{
data[0] += linesize[0] * (m_iHeightIn - 1);
linesize[0] = -linesize[0];
}
::sws_scale(m_sws, data, linesize, 0, m_iHeightIn, frameOut->data, frameOut->linesize);
::av_image_copy_to_buffer(pOutputBuffer, lDataLen, frameOut->data, frameOut->linesize, m_outputPixelFormat, m_iWidthOut, m_iHeightOut, 32);

Если я создаю m_outputPixelFormat AV_PIX_FMT_RGB32 и использую преобразователь цветового пространства DMO, видео получается правильно. Однако, если я изменю его на NV12, я получу наклонное видео с отсутствующими данными внизу.
Я знаю, что это вызвано тем, что я неправильно копирую данные из буфера, но я не уверен, что делаю неправильно.

1

Решение

Ваша проблема здесь:

m_heightOut = (((iHeightIn + 31) >> 5) << 5) //32bit align

Вам не нужно выравнивать высоту. Так frameOut->data имеет m_iHeightIn рост.
Правильная строка:

m_heightOut = iHeightIn;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]