Привет, Есть ли способ узнать, когда закодирована полная строка сканирования, а кодировщик просто начинает кодирование следующей строки? Я использую программное обеспечение HM, но была бы признательна за любую помощь от других кодеров!

ичок в HEVC и сейчас понимаю эталонное программное обеспечение (сейчас я смотрю на интрапрогнозирование).

Мне нужно получить информацию, как показано ниже после кодирования.

структура CU для данного CTUдля каждого CU во время вычислений это информация (например, значение QP, выбранный режим для Luma, выбранный режим для цветности, находится ли CU в окончательной структуре CU решения о разделении CTU и т. д.)

Я знаю, что решение ГТЕ принимается, когдаm_pcCuEncoder->compressCtu( pCtu ) называется вTEncSlice.cpp, Но где именно я могу получить эту конкретную информацию? Может кто-то помочь мне с этим?

постскриптум Я тоже изучаю C ++ (у меня есть опыт Java).

Ответы на вопрос(1)

Решение Вопроса

если вы новичок в коде. Но я пытаюсь помочь вам с этим. Все, что я собираюсь вам рассказать, основано на коде JEM, а не на HM, но я уверен, что вы можете применить их и к HM.

Как вы могли заметить, существует два совершенно разных этапа сжатия / кодирования каждого CTU:

Фаза RDO: во-первых, это цикл оптимизации скорости-искажения для «принятия решений». На этом этапе проверяются буквально все возможные комбинации параметров (например, различные разделы, внутренние режимы, фильтры и т. Д.). В конце этого этапа RDO определяет наилучшую комбинацию и передает их на второй этап.Этап кодирования: здесь кодер выполняет фактический последний шаг кодирования. Это включает в себя запись всех бинов в поток битов на основе параметров, определенных во время фазы RDO.

На уровне CTU эти две фазы выполняютсяm_pcCuEncoder->compressCtu( pCtu ) иm_pcCuEncoder->encodeCtu( pCtu ) функции, соответственно, как вcompressSlice() функцияTEncSlice.cpp файл.

Учитывая приведенную выше информацию, вы должны искать то, что вы ищете, ввторой этап а непервая фаза (Вы, возможно, уже знаете эти вещи, но я подозревал, что вы, возможно, смотрите на первом этапе).

Итак, теперь это мое предложение для получения вашей информации. Это не лучший способ сделать это, но его легче объяснить. Сначала вы переходите к этому пункту в своем коде HM:

compressGOP() -> encodeSlice() -> encodeCtu() -> xEncodeCU()

Затем вы найдете строку, в которой кодируется режим прогнозирования (intra / inter):

m_pcEntropyCoder->encodePredMode()

На данный момент у вас есть доступ кpcCU объект, который содержит все окончательные решения, в том числе информацию, которую вы ищете, которые принимаются на первом этапе. На этом этапе кода вы имеете дело с одним CU, а не со всем CTU. Но если вам нужна ваша информация для всего ГТЕ, вы можете вернуться к

compressGOP() -> encodeSlice() -> encodeCtu()

и найти строку, гдеxEncodeCU() функция вызывается впервые. Там у вас будет доступ кpCtu объект.

Напоминание: каждыйTComDataCU объект (pcCU если вы находитесь на уровне CU, илиpCtu если вы на уровне CTU) размераWxH разделен наNumPartition=(W/4)x(H/4) разделы размера4x4, Каждый раздел доступен по индексу (uiAbsPartIdx), который указывает порядок Z-сканирования. Например,uiAbsPartIdx для раздела в<x=8,y=0> это 4.

Теперь вы делаете следующие шаги:

Получить количество разделов (NumPartition) внутри вашегоpCtu позвонив по телефонуpCtu->getTotalNumPart().

Перебрать всеNumPartition перегородки и вызов функцийpCtu->getWidth(idx), pCtu->getHeight(idx), pCtu->getCUPelX(idx) а такжеpCtu->getCUPelY(), гдеidx Ваш итератор цикла Эти функции возвращают следующую информацию для каждогоCU совпал с4x4 разделить наidx: ширина, высота, позицияX, позицияY. [обе позиции относительно пикселя<0,0> рамы]

Приведенной выше информации достаточно для получения CTU-разбиения текущегоpCtu! Итак, последний шаг - написать кусок кода для этого.

Это был пример того, как извлечь информацию разделения CTU во время второй фазы (то есть фазы кодирования). Однако вы можете вызвать некоторые правильные функции, чтобы получить другую информацию в вашем втором вопросе. Например, чтобы получить выбранный внутренний режим яркости, вы можете позвонитьpCtu->getIntraDir(CHANNEL_TYPE_LUMA, idx), вместоgetWidth()/getHeight() функции. Или жеpCtu->getQP(CHANNEL_TYPE_LUMA, idx) чтобы получить значение QP.

Вы всегда можете найти список функций, которые предоставляют полезную информацию наpCtu уровень, вTComDataCU класс (TComDataCU.cpp).

Я надеюсь, это поможет вам. Если нет, дайте мне знать!

Удачи,

 harsh11 дек. 2017 г., 23:46
Большое спасибо, приятель! Очень полезно. Я пройду код, и у меня может быть больше вопросов, и я буду задавать их в новых вопросах.
 Maverick11 мая 2018 г., 12:14
Привет, Есть ли способ узнать, когда закодирована полная строка сканирования, а кодировщик просто начинает кодирование следующей строки? Я использую программное обеспечение HM, но была бы признательна за любую помощь от других кодеров!
 Mosen11 дек. 2017 г., 20:48
1. Это имеет смысл. Потому чтоpCtu на самом деле ваш64x64 CTU и когда вы звонитеgetTotalNumPart() на это вы должны получить(64/4)x(64/4)=16x16=256 перегородки. Помните, что ГТЕ [почти] всегда имеет размер64x64, Это CU, который может иметь меньшие размеры, например 32. Если вы хотите позвонитьgetTotalNumPart() на определенном CU внутри вашего CTU, вам придется перейти на другой адрес, который я сказал (внутри 'xEncodeCU() функция)
 harsh11 дек. 2017 г., 15:09
Большое спасибо за всю информацию! Я новичок в HEVC, и каждая информация, которую вы записали, очень ценна для меня. У меня есть несколько вопросов. 1. Все время звонюpCtu->getTotalNumPart() вTencSlice.cpp послеm_pcCuEncoder->compressCtu( pCtu )Я получаю 256. Даже когда*(pCtu->getWidth()) возвращает 32, я получаю 256. Почему это? Для 32 не должно ли это быть 64? 2. ВpCtu->getIntraDir(CHANNEL_TYPE_LUMA, idx), ты имеешь ввидуuiAbsPartIdx поidx? Я новичок в HEVC, и я благодарен за ваше время. Кроме того, есть ли где-нибудь руководство по трассировке кода, на которое я могу взглянуть, кроме официального?
 Mosen11 дек. 2017 г., 20:51
2. Да.idx на самом деле действует какuiAbsPartIdx, Но я хотел подчеркнуть, что вы должныповторять более чемuiAbsPartIdx значения для сканирования всех4x4 перегородки внутри каждого CTU (CU). 3. Что касается вашего последнего вопроса, к сожалению, я не знаю ни одного примера руководства или трассировки кода. Вы должны учиться, копая это и задавая вопросы.

Ваш ответ на вопрос