Есть хорошее расширение Visual Studio Изображение Смотреть.
Он может взять произвольный адрес в ОЗУ и показать его содержимое в виде изображения с @mem
оператор.
@mem(address, type, channels, width, height, stride)
: интерпретировать необработанную память как пиксели, начиная сaddress
(UINT64
), с каналомtype
(увидеть Пиксельные форматы), количествоchannels
(UINT32
),width
(UINT32
),height
(UINT32
), а такжеstride
(UINT32
). Пример:@mem(myimg.data, UINT8, 1, 320, 240, 320)
Согласно страница справки, он может отображать несколько сложных форматов пикселей, среди которых BGR, NV12 и YV12.
Необязательно, строка формата может быть связана с форматом пикселя. Он определяет семантику каждого канала для рендеринга:
RG, UV
RGB, BGR, YUV
RGBA, BGRA
…
Также поддерживается ряд специальных форматов YUV. В этом случае строка формата также определяет макет данных.
NV12 (две плоскости: одна плоскость Y, одна упакованная плоскость UV, субсэмплированная по 2 в обоих измерениях)
YV12 (три плоскости: одна плоскость Y, одна упакованная плоскость U и V каждая, каждая с подвыборкой по 2 в обоих измерениях)
Однако мне не понятно, как заставить Image Watch отображать изображения в NV12
а также YV12
форматирует с @mem
оператор.
Страница справки не содержит слишком много информации.
Мне удалось отобразить серые одноканальные изображения, указав UINT8
как тип канала. Я также могу правильно отобразить изображение BGR с типом канала = UINT8
и 3 канала: @mem(pBGR, UINT8, 3, 640, 480, 640*3)
, Это было описано в документации, но не было очевидно.
Я пробовал различные комбинации чисел каналов и форматных строк с или без кавычек: @mem(ptr, NV12, 3, 640, 480, 640*3)
, @mem(ptr, "NV12", 1, 640, 480, 640*3)
, @mem(ptr, UINT8NV12, 3, 640, 480, 640*3)
@mem(ptr, NV12UINT8, 1, 640, 480, 640*3)
и т.д — не повезло. Я вижу только серый прямоугольник со словом [invalid]
,
То же самое с YV12
,
Задача ещё не решена.
Других решений пока нет …