demos - FFMPEG Compensación de movimiento y búsqueda
ffmpeg option (0)
Estoy tratando de modificar la parte de detección de movimiento de FFMPEG. Lo que quiero hacer es ampliar el espacio de búsqueda, de modo que cada vez que el macrobloque toque el borde derecho del cuadro, necesito mover el bloque hacia la izquierda como si estuvieran conectados (en mis videos de ejemplo, el borde derecho es en realidad una continuación del borde izquierdo). ¿Alguien puede ayudarme a señalar dónde exactamente puedo modificarlo dentro del código fuente de FFMPEG o x265 o x264?
Tomé H265 como un ejemplo de aquí . Tiene un archivo motion.cpp
que especifica muy bien los posibles tamaños de bloque como se muestra a continuación. Pero no puedo encontrar el lazo específico que atraviesa el marco. Una ayuda es muy apreciada.
#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
ACTUALIZAR:
Una forma de hacerlo (en x265) es modificar el área de extensión del borde (que ya está en el código, en frameFilter.cpp
), y hacer eso para la derecha y llenar los bloques con los píxeles más a la izquierda. Identifiqué el fragmento de código aquí. ¿Alguien puede ayudarme a agregar esta función para la extensión de derecha a izquierda?
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;
}