void PU::getBvgCccmCands(PredictionUnit &pu, bool &validBv) { validBv = false; for (int posIdx = 0; posIdx < NUM_BVG_CCCM_CANDS; posIdx++) { Mv chromaBv = Mv(0, 0); int rrIbcType = 0; pu.bvList[posIdx] = Mv(0, 0); if (PU::isBvgCccmCand(pu, chromaBv, rrIbcType, posIdx)) { if (chromaBv == Mv(0, 0)) { continue; } bool bvExist = false; for (int i = 0; i < pu.numBvgCands; i++) { if (chromaBv == pu.bvList[i]) { bvExist = true; break; } } if (!bvExist) { pu.bvList[pu.numBvgCands] = chromaBv; pu.rrIbcList[pu.numBvgCands] = rrIbcType; pu.numBvgCands++; validBv = true; } } } }
时间: 2024-02-14 09:34:11 浏览: 23
这段代码是一个函数`getBvgCccmCands`,它用于获取预测单元`pu`的一组候选运动矢量(bvList)和一组候选RR IBC类型(rrIbcList)。
首先,将`validBv`标记设置为false,表示初始时没有有效的运动矢量。
然后,通过一个循环遍历`posIdx`从0到`NUM_BVG_CCCM_CANDS-1`,获取每个位置索引对应的候选运动矢量和RR IBC类型。
在每次迭代中,首先创建一个初始值为(0, 0)的`chromaBv`对象,并将候选运动矢量和RR IBC类型初始化为(0, 0)和0。
接下来,通过调用`isBvgCccmCand`函数来判断当前位置索引对应的候选运动矢量和RR IBC类型是否合法。如果合法,则继续执行下面的逻辑;否则,跳过当前迭代。
在合法的情况下,首先检查`chromaBv`是否为(0, 0),如果是,则继续下一次迭代,跳过后面的逻辑。
接着,检查当前的`chromaBv`是否已经存在于之前的候选运动矢量列表`bvList`中。如果存在,则继续下一次迭代,跳过后面的逻辑。
最后,将当前的`chromaBv`和RR IBC类型添加到候选运动矢量列表`bvList`和RR IBC类型列表`rrIbcList`中,并将`pu.numBvgCands`增加1。同时,将`validBv`标记设置为true,表示存在有效的运动矢量。
循环结束后,函数执行完毕,通过引用参数`validBv`可以获取到是否存在有效的运动矢量。
相关问题
15 10 E:\dontknow\Administrator\Documents\csdn1.cpp [Error] template argument for 'template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)' uses local type 'maxEnvelopes(std::vector<std::vector<int> >&)::<lambda(const std::vector<int>&, const std::vector<int>&)>'
这个错误通常是由于使用了 lambda 表达式作为 `std::sort` 的比较函数,但是编译器无法自动推导出 lambda 表达式的类型,需要手动指定类型。可以将 lambda 表达式的类型定义为 `std::function<bool(const std::vector<int>&, const std::vector<int>&)>`,然后将其作为 `std::sort` 的比较函数参数传递。
例如:
```
#include <vector>
#include <algorithm>
#include <functional>
std::vector<std::vector<int>> maxEnvelopes(std::vector<std::vector<int>>& envelopes) {
// lambda 表达式作为比较函数
auto cmp = [](const std::vector<int>& a, const std::vector<int>& b) {
return a[0] < b[0] || (a[0] == b[0] && a[1] > b[1]);
};
std::sort(envelopes.begin(), envelopes.end(), std::function<bool(const std::vector<int>&, const std::vector<int>&)>(cmp));
return envelopes;
}
```
以上代码报错,报错内容如下,请问怎么解决:Eigen::Block<XprType, BlockRows, BlockCols, InnerPanel>::Block(XprType&, Eigen::Index, Eigen::Index) [with XprType = Eigen::Matrix<double, 1, 3>; int BlockRows = 1; int BlockCols = 3; bool InnerPanel = false; Eigen::Index = long int]: Assertion `startRow >= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows() && startCol >= 0 && BlockCols >= 0 && startCol + BlockCols <= xpr.cols()' failed.
这个错误信息说明了在使用Eigen库的Block时,出现了索引错误。具体来说,Block的起始行、列以及行列数应该满足以下条件:
startRow >= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows() && startCol >= 0 && BlockCols >= 0 && startCol + BlockCols <= xpr.cols()
其中xpr是被切分的矩阵。如果这些条件不满足,就会触发上述的assertion错误。
因此,你需要检查你的代码,看看Block的参数是否符合上述条件。如果不符合,你需要重新计算起始行列和行列数。如果符合,那么你需要检查你的矩阵是否正确初始化。