FFMPEG Компенсация движения и поиск
Я пытаюсь изменить часть обнаружения движения в FFMPEG. Что я хочу сделать, так это расширить пространство поиска, чтобы всякий раз, когда макроблок попадал в крайний правый край кадра, мне все равно приходилось перемещать блок в крайнее левое положение, как будто они соединены (в моих примерах видео, правый край фактически является продолжением левого края). Может кто-нибудь помочь мне указать, где именно я могу изменить его в исходном коде FFMPEG или x265, или x264?
Я взял H265 в качестве примера отсюда. Оно имеет motion.cpp
файл, который красиво определяет возможные размеры блока, как показано ниже. Но я не могу найти конкретную петлю, которая пересекает кадр. Помощь высоко ценится.
#define SETUP_SCALE(W, H) \
sizeScale[LUMA_ ## W ## x ## H] = (H * H) >> 4;
SETUP_SCALE(4, 4);
SETUP_SCALE(8, 8);
SETUP_SCALE(8, 4);
SETUP_SCALE(4, 8);
SETUP_SCALE(16, 16);
SETUP_SCALE(16, 8);
SETUP_SCALE(8, 16);
SETUP_SCALE(16, 12);
SETUP_SCALE(12, 16);
SETUP_SCALE(4, 16);
SETUP_SCALE(16, 4);
SETUP_SCALE(32, 32);
SETUP_SCALE(32, 16);
SETUP_SCALE(16, 32);
SETUP_SCALE(32, 24);
SETUP_SCALE(24, 32);
SETUP_SCALE(32, 8);
SETUP_SCALE(8, 32);
SETUP_SCALE(64, 64);
SETUP_SCALE(64, 32);
SETUP_SCALE(32, 64);
SETUP_SCALE(64, 48);
SETUP_SCALE(48, 64);
SETUP_SCALE(64, 16);
SETUP_SCALE(16, 64);
#undef SETUP_SCALE
ОБНОВИТЬ:
Один из способов сделать это (в x265) - изменить область расширения края (которая уже есть в коде, в frameFilter.cpp
), и сделайте это для самого правого и заполните блоки самым левым пикселем. Я определил кусок кода здесь. Может кто-нибудь помочь мне добавить эту функцию для расширения справа налево?
if ((col == 0) | (col == m_frameFilter->m_numCols - 1))
{
// TODO: improve by process on Left or Right only
primitives.extendRowBorder(reconPic->getLumaAddr(m_rowAddr), stride, reconPic->m_picWidth, realH, reconPic->m_lumaMarginX);
if (m_frameFilter->m_param->internalCsp != X265_CSP_I400)
{
primitives.extendRowBorder(reconPic->getCbAddr(m_rowAddr), strideC, reconPic->m_picWidth >> hChromaShift, realH >> vChromaShift, reconPic->m_chromaMarginX);
primitives.extendRowBorder(reconPic->getCrAddr(m_rowAddr), strideC, reconPic->m_picWidth >> hChromaShift, realH >> vChromaShift, reconPic->m_chromaMarginX);
}
}
// Extra Left and Right border on first and last CU
if ((col == 0) | (col == m_frameFilter->m_numCols - 1))
{
copySizeY += lumaMarginX;
copySizeC += chromaMarginX;
}
// First column need extension left padding area and first CU
if (col == 0)
{
pixY -= lumaMarginX;
pixU -= chromaMarginX;
pixV -= chromaMarginX;
}