Я пытаюсь изменить часть обнаружения движения в FFMPEG. Что я хочу сделать, так это расширить пространство поиска, чтобы всякий раз, когда макроблок попадал на самый правый край кадра, мне все равно приходилось перемещать блок в крайнее левое положение, как будто они соединены (в моих примерах видео - правый край это на самом деле продолжение левого края). Может кто-нибудь помочь мне указать, где именно я могу изменить его в исходном коде FFMPEG или x265, или x264?
Я взял H265 в качестве примера отсюда. В нем есть файл motion.c
котором приятно указаны возможные размеры блоков, как показано ниже, но я не могу найти конкретный цикл, проходящий через кадр. Помощь высоко ценится.
#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
Основной псевдокод должен быть таким:
block.rightX ==block.width; // a block initiates from left part of the frame
while(block.leftX <=frame.width) //until it hits the right most edge (assuming it moves from left to right for search)
for (int i=0;i<block.width();i++)
for(int j=0;j< i<block.height();j++)
block[i][j] = frame_pixel [(block.leftX+i) % frame.width] [block.leftY+j] //if the block's width passes frame's width, we just take the mod.