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;
    }

0 ответов

Другие вопросы по тегам