简介
最近看到有文章用视频编码时的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 value
int PMA = 1; // example value
int 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
的值。