编程语言
首页 > 编程语言> > JM8.6(H.264编码器)源码注释——码率控制部分主要推导

JM8.6(H.264编码器)源码注释——码率控制部分主要推导

作者:互联网

 

 1 void MADModelEstimator (int n_windowSize)
 2 {
 3   int n_realSize = n_windowSize;
 4   int i;
 5   double oneSampleQ;
 6   double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
 7   double MatrixValue;
 8   Boolean estimateX2 = FALSE;
 9   
10   for (i = 0; i < n_windowSize; i++) {// find the number of samples which are not rejected
11     if (PictureRejected[i])//如果某一帧图像被限制了 n_realSize就减一次 最后记录的是没有被限制使用的图像
12       n_realSize--;
13   }
14   
15   // default MAD model estimation results
16   
17   MADPictureC1 = MADPictureC2 = 0.0;//某一帧图像MAD线性预测的参数
18   
19   for (i = 0; i < n_windowSize; i++)  {
20     if (!PictureRejected[i])//如果图像没有被限制
21     //难道是记录最后一帧没有被限制图像的MAD???
22       oneSampleQ = PictureMAD[i];//把最后一个没有被限制的图像的MAD赋值给oneSampleQ变量 
23   }
24   for (i = 0; i < n_windowSize; i++)  {// if all non-rejected MAD are the same, take 1st order model
25     if ((PictureMAD[i] != oneSampleQ) && !PictureRejected[i])//图像没有被限制且不是最后一帧被限制的图像
26       estimateX2 = TRUE;//estimateX2标志位赋值为真
27     if (!PictureRejected[i])//如果图像没有被限制
28     //这句话不知道在做怎样的优化??? W值
29       MADPictureC1 += PictureMAD[i] / (ReferenceMAD[i]*n_realSize);//
30   }
31   
32   // take 2nd order model to estimate X1 and X2
33   if ((n_realSize >= 1) && estimateX2) {
34     for (i = 0; i < n_windowSize; i++) {
35       if (!PictureRejected[i]) {
36           //图像没有被限制 好厉害这部分就是在求解参数
37           //平方差求和最小来优化 线性回归
38         a00 = a00 + 1.0;
39         a01 += ReferenceMAD[i];
40         a10 = a01;
41         a11 += ReferenceMAD[i]*ReferenceMAD[i];
42         b0 += PictureMAD[i];
43         b1 += PictureMAD[i]*ReferenceMAD[i];
44       }
45     }
46     // solve the equation of AX = B
47     MatrixValue=a00*a11-a01*a10;
48     if(fabs(MatrixValue)>0.000001)//行列式不为0 A可逆 有解
49     {
50     //通过伴随矩阵求解
51       MADPictureC2=(b0*a11-b1*a01)/MatrixValue;//b
52       MADPictureC1=(b1*a00-b0*a10)/MatrixValue;//W
53     }
54     else//行列式为0 A不可逆
55     {
56         //只是一个特解
57       MADPictureC2=0.0;//b
58       MADPictureC1=b0/a01;//W
59     }
60     
61   }
62   if(img->type==P_SLICE)//如果是P帧 把上面刚刚计算的结果覆盖掉前面计算的 
63   {
64     PMADPictureC1=MADPictureC1;
65     PMADPictureC2=MADPictureC2;
66   }
67 }

 

 

标签:编码器,码率,0.0,a00,a01,windowSize,源码,图像,realSize
来源: https://www.cnblogs.com/weitter/p/13525229.html