(я поставил ответ, чтобы прокомментировать, что @Mourad поместил здесь четыре часа назад, потому что это будет долго)
Я предполагаю, что вам удалось бы найти, где фактически реализована кодировка после цикла RDO.Как вы правильно упомянули, xEncodeCU
- это функция, на которую нужно ссылаться, чтобы убедиться, что вы еще не находитесь в RDO.
Теперь вам нужно найти точную функцию в xEncodeCU
, которая отвечает за вашу цельинструмент кодека.
Например, если вы хотите посчитать количество битов для кодирования коэффициентов, вы должны посмотреть на m_pcEntropyCoder->encodeCoeff()
(это функция JEM и может иметь другое имя в HM).Когда вы найдете эту строку в xEncodeCU
, вы можете сделать это и получить количество битов, записанных внутри функции encodeCoeff()
:
UInt b_before = m_pcEntropyCoder->getNumberOfWrittenBits();
m_pcEntropyCoder->encodeCoeff( ... );
UInt b_after = m_pcEntropyCoder->getNumberOfWrittenBits();
UInt writtenBitsCoeff = b_after - b_before;
Один важный момент: как вы видите, функция getNumberOfWrittenBits()
дает целочисленные скорости, которые получаются округлением суммы дробных скоростей, соответствующих всем элементам синтаксиса, закодированным внутри функции encodeCoeff
.Эта ошибка может быть или не быть приемлемой, в зависимости от вашей проблемы.Например, если вместо скорости кодирования коэффициентов вы хотите знать скорость CBF
, то эта ошибка вообще не будет приемлемой.Потому что скорость CBF
в основном меньше одного бита.Если это ваш случай, вам нужно будет вычислить дробные биты один за другим.Это было бы совершенно иначе и относительно сложнее, чем это.