OpenH264帧内预测

//16*16亮度的DC,为上面跟左面32个值的平均值。

void WelsI16x16LumaPredDc_c (uint8_t* pPred, const int32_t kiStride) {
  int32_t iTmp = (kiStride << 4) - kiStride;
  int32_t iSum = 0;
  uint8_t i = 15;
  uint8_t uiMean = 0;

  /*caculate the kMean value*/
  do {
    iSum += pPred[-1 + iTmp] + pPred[-kiStride + i];   //前面是竖着的,后面是横着的
    iTmp -= kiStride;
  } while (i-- > 0);
  uiMean = (16 + iSum) >> 5;

  iTmp = (kiStride << 4) - kiStride;
  i = 15;
  do {
    memset (&pPred[iTmp], uiMean, I16x16_COUNT);
    iTmp -= kiStride;
  } while (i-- > 0);
}

WelsI16x16LumaPredDc_c 的测试函数:

TEST (GetIntraPredictorTest, TestGetI16x16LumaPredDc) {
  const int32_t kiStride = rand() % 16 + 16;  //stride指在内存中每行像素所占的空间

  int i;

  uint8_t* pPred = new uint8_t[256];
  uint8_t* pRef  = new uint8_t[16 * kiStride];
  for (i = 0; i < 16 * kiStride; i++)  //16行,每行stride
    pRef[i] = rand() % 256 + 1;

  pRef += kiStride;   //指向了第二行开始

  int32_t iTmp = (kiStride << 4) - kiStride;  //最后一行开始
  int32_t iSum = 0;
  i = 15;
  uint8_t uiMean = 0;

  do {
    iSum += pRef[-1 + iTmp] + pRef[-kiStride + i];    //前面是竖着的,后面是横着的
    iTmp -= kiStride;
  } while (i-- > 0);
  uiMean = (16 + iSum) >> 5;

  WelsI16x16LumaPredDc_c (pPred, pRef, kiStride);
  for (i = 0; i < 256; i++)
    EXPECT_EQ (pPred[i], uiMean);

  pRef -= kiStride;

  delete []pRef;
  delete []pPred;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值