Извлечение количества битов в макроблоке из эталонного программного обеспечения VVC VTM

Окончательный результат: результат после вычисления и отображения разницыЯ новичок в VVC и собираюсь через код эталонного программного обеспечения, пытаясь понять его. Я кодировал и декодировал видео, используя эталонное программное обеспечение. Я хочу извлечь из него поток битов, я хочу знать количество битов в каждом макроблоке. Я не уверен, с каким классом мне следует работать, пока я смотрю на mv.cpp, QuantRDOQ.cpp и TrQuant.cpp.

Я боюсь полностью испортить код, я не знаю, куда добавить какие строки кода. Начало: Результат после вычисления и отображения разницы P.S. Связанные изображения после того, как моя проблема была решена, я прикрепил эти изображения из-за моего запроса в комментариях.


person Yusra    schedule 16.07.2020    source источник


Ответы (2)


Как говорит ошибка, getNumBins() не поддерживается оценщиком CABAC. Поэтому вы должны убедиться, что вы вызываете его только во время кодирования, а не во время RDO.

Это должно сделать работу:

if (isEncoding())
    before = m_BinEncoder.getNumBins()

coding_unit( cu, partitioner, cuCtx );

if (isEncoding())
{
    after = m_BinEncoder.getNumBins();
    diff = after - before;
}
person Mosen    schedule 24.07.2020
comment
Большое спасибо за ваш ответ. Я постараюсь и дам вам знать, если это сработает. - person Yusra; 28.07.2020
comment
Я попробовал, и это работает, я попытался распечатать разницу, потому что хотел узнать количество битов в макроблоке. Я добавил строку: cout‹‹Разница в следующем: ‹‹diff‹‹endl; после второго оператора if. Я прикрепил скриншоты результата в своем исходном вопросе в виде ссылок. Должен ли я рассматривать окончательную разницу как количество битов в макроблоке или каждая разница - это количество битов в каждом макроблоке? Потому что я также получаю отрицательные значения. @Мосен - person Yusra; 28.07.2020
comment
не могли бы вы также предложить, как получить информацию о макроблоке со стороны декодера? А векторы движения? Я хочу частично декодировать, чтобы получить макроблок и векторы движения. С нетерпением жду вашего предложения. @Мосен - person Yusra; 31.07.2020
comment
Насколько я знаю, вы не можете использовать это решение на стороне декодера. - person Mosen; 03.08.2020
comment
Хорошо, спасибо, что сообщили мне. Извините за поздний ответ, я не знал, что получил ответ. Как бы вы предложили извлекать векторы движения и параметры квантования на стороне кодировщика? Я думаю, что мы также можем получить из CABACWriter.cpp. @Мосен - person Yusra; 07.08.2020
comment
Я понял, как извлечь параметры квантования. Я извлек их из EncGOP.cpp. Сейчас я работаю над извлечением векторов движения. - person Yusra; 12.08.2020
comment
Тот же принцип применяется к векторам движения. За исключением того, что вы должны иметь дело с некоторыми другими функциями, например. cu_pred_data, merge_flag, merge_data, mvp_flag, affine_flag, mvd_coding и т. д. - person Mosen; 12.08.2020
comment
Спасибо. Думаю, я тоже получил векторы движения, но не уверен, что они верны. Теперь я смотрю на получение количества CTU (ширина x высота), чтобы я мог получить двумерный массив на выходе, где я могу видеть, какой MV относится к какому CTU. - person Yusra; 21.08.2020

Простое решение, о котором я знаю, находится на стороне кодировщика.

Хитрость заключается в том, чтобы вычислить разницу в количестве записанных битов до и после кодирования единицы кодирования (CU) (также известной как макроблок). Это происходит в файле CABACWriter.cpp.

Следует перейти к функции coding_tree(), где вызывается функция coding_unit(), отвечающая за контекстное кодирование всех элементов синтаксиса в текущем CU. Там вы можете вызвать функцию getNumBins() дважды: один раз до и один раз после coding_unit(). Разница двух значений должна сделать эту работу за вас.

person Mosen    schedule 16.07.2020
comment
Большое спасибо за ваше предложение! Я вызвал функцию getnumbins() и попытался распечатать значения в CABACWriter.cpp, но во время компиляции получаю эту ошибку: libc++abi.dylib: завершение с необработанным исключением типа Exception: ERROR: In function getNumBins in /Users/ mac/documents/VVCSoftware_VTM-master/source/Lib/EncoderLib/BinEncoder.h:254: не поддерживается @Mosen - person Yusra; 22.07.2020
comment
Большое спасибо за ваше предложение! Я вызвал функцию getnumbins() и попытался распечатать значения в CABACWriter.cpp, но во время компиляции получаю эту ошибку: libc++abi.dylib: завершение с необработанным исключением типа Exception: ERROR: In function getNumBins in /Users/ mac/documents/VVCSoftware_VTM-master/source/Lib/EncoderLib/BinEncoder.h:254: Не поддерживается @Mosen Я пытался ответить, но не знаю, почему я не могу правильно пометить ваше имя, поэтому я не уверен, что вы увижу это. - person Yusra; 23.07.2020