2016-12-08 14 views
1

Я некоторое время работаю над справочным программным обеспечением HM, чтобы улучшить что-то в части внутреннего предсказания. Теперь к коду добавляется новый алгоритм внутреннего предсказания, и я позволяю кодеру выбирать между моим алгоритмом и алгоритмом по умолчанию HM (в соответствии с RDCost, конечно).Как добавить новый синтаксический элемент в HM (тестовая модель HEVC)

Теперь мне нужно сигнализировать флаг для каждого PU, чтобы декодер мог выполнять тот же алгоритм, что и кодер, принимающий решение в цикле коррекции скорости.

Я хочу знать, что именно следует делать, чтобы правильно добавить этот бит в поток, не нарушая ничего в коде.

Предполагая, что я хочу использовать контекст CABAC модель, чтобы сохранить трек статистики моего флага, что еще я должен сделать:

  1. добавления нового контекста модели, как ContextModel3DBuffer m_cCUIntraAlgorithmSCModel в файл TEncSbac.h.
  2. правильная инициализация модели (как на стороне кодера, так и на стороне декодера), посмотрев, как HM инициализирует другие контекстные модели.
  3. , вызывающий функцию m_pcBinIf->encodeBin(myFlag, cCUIntraAlgorithmSCModel) и m_pcTDecBinIfdecodeBin(myFlag, cCUIntraAlgorithmSCModel) со стороны датчика и декодера соответственно.

Я делаю эти три шага, но, видимо, это что-то ломает.

PS: Даже равновероятная сигнализация (т. Е. Без использования контекстов CABAC) будет полезна. Я просто хочу отправить этот флаг мирным путем!

Заранее спасибо.

ответ

0

Я мог бы решить эту проблему в конце концов. Это была ошибка в инициализации контекста CABAC.

Но я хочу поделиться этим опытом, поскольку многие люди могут захотеть сделать то же самое.

три шага, которые я объяснил, по существу, необходимо добавить новый элемент синтаксиса, но один может быть очень осторожным с следующие:

  1. В начале, вы должны решить, как вы хотите использовать отдельная контекстная модель для вашего синтаксического элемента? Или вы хотите использовать существующую? В случае разделения CABAC вы должны определить ContextModel3DBuffer и лучший способ сделать это: найти аналогичный элемент синтаксиса в коде; затем дублирует определение `` ContextModel3DBuffer '' и ВСЕ его вхождения в код. Это гарантирует, что вы все рассматриваете.
  2. Кодирование каждого элемента синтаксиса происходит в двух разных местах: во-первых, в цикле RDO для принятия «решения», а во-вторых, во время фактической фазы кодирования и когда кодируются решения (например, функция encodeCtu).
  3. Порядок элементов синтаксиса кодирования/декодирования должен быть одинаковым на сторонах кодера/декодера. Например, если ваш новый синтаксический элемент закодирован после splitFlag и до predMode со стороны энкодера, вы должны декодировать его точно между splitFlag и predMode со стороны декодера.
  4. Контекстная модель реализована как трехмерная матрица, позволяющая отслеживать статистику элементов syntaxt отдельно для разных размеров блоков, компонентов и т. Д.Это означает, что, когда вы хотите вызвать функцию encodeBin, вы можете убедиться, что используется правильный индекс. Я сделал глупые ошибки в этой части!

Помимо приведенных выше замечаний, я нашел функцию getState очень полезной для отладки. Эта функция возвращает состояние вашей контекстной модели CABAC в произвольном месте кода, когда у вас есть к нему доступ. Очень полезно сравнивать состояние в одном и том же месте энкодера и декодера, когда у вас есть несоответствие. Например, бывает очень много, что вы кодируете 1, но вы декодируете 0. В этом случае перед кодированием и декодированием необходимо проверить состояние вашего контекста CABAC. Они должны быть одинаковыми. Если они не совпадают, отследите ошибку, чтобы найти первое место несоответствия.

Надеюсь, это было полезно.

 Смежные вопросы

  • Нет связанных вопросов^_^