Декодирование MPEG1 (компенсация движения) работает следующим образом:
Прогнозы и векторы движения превращают систему отсчета в следующий (текущий) кадр. Вот как вы можете рассчитать каждый пиксель нового кадра:
Для каждого макроблока у вас есть набор прогнозируемых значений (отличий от системы отсчета). Вектор движения является значением относительно системы отсчета.
// Each luma and chroma block are 8x8 pixels
for(y=0; y<8; y++)
{
for (x=0; x<8; x++)
{
NewPixel(x,y) = Prediction(x,y) + RefPixel(x+motion_vector_x, y+motion_vector_y)
}
}
С MPEG1 у вас есть I, P и B. кадры. I-кадры полностью интракодированы (например, аналогичны JPEG), без ссылок на другие кадры. P-кадры кодируются с предсказаниями из предыдущего кадра (I или P). B-кадры кодируются с предсказаниями в обоих направлениях (предыдущий и следующий кадр). Обработка B-кадров делает видеопроигрыватель немного более сложным, поскольку он может ссылаться на следующий кадр, поэтому каждый кадр имеет порядковый номер, а B-кадры приводят к тому, что последовательность становится нелинейной. Другими словами, ваш видео декодер должен удерживать потенциально 3 кадра при декодировании потока (предыдущий, текущий и следующий).