mmpeg demos ac3 ffmpeg video-processing video-encoding motion-detection libx265

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