简介
最近看到有文章用视频编码时的MPM参数来映射特征并用于数字取证,故做该文章记录。
HEVC(高效视频编码)中的MPM(最可能模式,Most Probable Mode)用于预测帧内块的模式,以提高编码效率并减少比特率。MPM的选择过程涉及多个步骤,下面结合你的图详细说明这些步骤。
MPM选择流程
图中展示了选择三个MPM的流程图。以下是具体步骤:
-
检查
PML
和PMA
是否相等:- 如果
PML
(左预测模式)不等于PMA
(上预测模式),则选择:MPM1 = PML
MPM2 = PMA
- 如果
PML
和PMA
相等,则进一步检查PML
和PMA
的值。
- 如果
-
检查
PML
和PMA
的值是否小于2:- 如果
PML < 2
且PMA < 2
,则选择:MPM1 = PLANAR
MPM2 = DC
MPM3 = ANGULAR[26]
- 如果
PML
和PMA
都不小于2,则:MPM1 = PML
- 计算
MPM2
和MPM3
的值:MPM2 = 2 + ((PML - 2 - 1 + 32) % 32) MPM3 = 2 + ((PML - 2 + 1) % 32)
- 如果
-
检查
PML
和PMA
是否等于PLANAR:- 如果
PML
不等于PLANAR
且PMA
不等于PLANAR
,则进一步检查PML
和PMA
的值。- 如果
PML
等于PLANAR
或者PMA
等于PLANAR
,则选择:MPM3 = PLANAR
- 如果
PML
和PMA
都不等于PLANAR
,则选择:MPM3 = DC
- 如果
- 如果
PML
和PMA
都不等于PLANAR
,则选择:MPM3 = ANGULAR[26]
- 如果
具体使用哪个MPM:
如果最小残差的模式在MPM1,MPM2,或MPM3中,编码器会标记该模式为最终预测模式。
如果最小残差的模式不在MPM中,编码器会使用该模式,但会以非MPM模式的方式进行编码。
示例代码
以下是实现上述逻辑的C++代码示例:
#include <iostream>enum PredictionMode {PLANAR = 0,DC = 1,ANGULAR = 2
};void selectMPMs(int PML, int PMA, int& MPM1, int& MPM2, int& MPM3) {if (PML != PMA) {MPM1 = PML;MPM2 = PMA;if (PML != PLANAR && PMA != PLANAR) {MPM3 = ANGULAR + 26;} else {MPM3 = (PML == PLANAR || PMA == PLANAR) ? PLANAR : DC;}} else {if (PML < 2 && PMA < 2) {MPM1 = PLANAR;MPM2 = DC;MPM3 = ANGULAR + 26;} else {MPM1 = PML;MPM2 = 2 + ((PML - 2 - 1 + 32) % 32);MPM3 = 2 + ((PML - 2 + 1) % 32);}}
}int main() {int PML = 0; // example valueint PMA = 1; // example valueint MPM1, MPM2, MPM3;selectMPMs(PML, PMA, MPM1, MPM2, MPM3);std::cout << "MPM1: " << MPM1 << "\n";std::cout << "MPM2: " << MPM2 << "\n";std::cout << "MPM3: " << MPM3 << "\n";return 0;
}
这个代码示例根据输入的PML
和PMA
值,选择并输出三个MPM。可以根据具体需求调整PML
和PMA
的值。