WIC HEIF HEIC декодирование изображений C

#c #winapi #ms-media-foundation #heif #heic

#c #winapi #ms-media-foundation #heif #heic

Вопрос:

Компонент Windows Imaging используется для декодирования изображений heif. Однако для успешного декодирования изображений требуются дополнительные приложения из магазина Microsoft Store (расширение heif image, расширения hevc video).

Без них WIC api возвращает пустое изображение. Теперь я хочу иметь возможность программно определять, может ли файл heif быть правильно декодирован.

Я попытался определить наличие требуемого типа декодера, используя средство проверки DXVA, которое должно быть WIC_HEIF_Decoder. Но я нигде не могу найти его зарегистрированным.

введите описание изображения здесь

Однако здесь задокументирован ключ GUID CLSID_WICHeifDecoder, который, я думаю, может быть зарегистрирован в системе, даже если декодер отсутствует.

У кого-нибудь есть идеи, как это сделать?

Комментарии:

1. Что такое «WIC_HEIF_Decoder»? Предоставленный Microsoft идентификатор guid HEIF / HEIC является CLSID_WICHeifDecoder. Если он зарегистрирован, то WIC может декодировать изображение HEIF / HEIC (но на самом деле он установлен не во всех окнах, и в этом случае он не будет зарегистрирован). Что именно вы пытаетесь сделать?

2. Это как раз одна из проблем. На компьютере определен CLSID_WICHeifDecoder, но фактическая реализация отсутствует

3. Что вы подразумеваете под «определенным»?

4. DEFINE_GUID learn.microsoft.com/en-us/windows-hardware/drivers/kernel /…

5. Microsoft представила ошибку с кодеком HEIC в недавнем обновлении Windows 10, добавив идентификатор GUID HEIC без фактической установки декодера изображений h265. Декодер HEIC касается только структуры файлов, но не фактического декодирования изображения. Пользователь должен заплатить 1 $, чтобы загрузить из магазина Windows актуальный кодек h265. Самое простое решение — просто установить бесплатный декодер WIC HEIC WIC CopyTrans copytrans.net/copytransheic . На странице неясно, что это кодек WIC, но это то, что есть на самом деле. Он содержит как формат файла HEIC, так и декодер h265.

Ответ №1:

Если вы планируете использовать WIC decoder, вам лучше использовать WIC API для проверки доступности, а не Media Foundation API, даже если на данный момент известно, что оба декодера упакованы вместе и принадлежат одному приложению (расширению) магазина Windows.

Вы должны иметь возможность использовать IWICImagingFactory::CreateComponentEnumerator для перечисления декодеров и определения, есть ли HEIF среди доступных.

Microsoft HEIF декодер

  • Идентификатор класса: CLSID_WICHeifDecoder
  • Статус подписи: WICComponentSigned
  • Автор: Microsoft
  • Идентификатор поставщика: {F0E749CA-EDEF-4589-A73A-EE0E626A2B-EE0E626A2B}
  • Версия: 1.0.0.0
  • Версия спецификации: 1.0.0.0
  • Понятное название: Microsoft HEIF Decoder
  • IWICBitmapCodecInfo:
    • Формат контейнера: GUID_ContainerFormatHeif
    • Форматы пикселей: GUID_WICPixelFormat32bppBGR
    • Версия управления цветом: 1.0.0.0
    • Типы MIME: image/heic,image/heif,image/avci,image/heic-sequence,image/heif-sequence,image/avcs,image/avif,image/avif-sequence
    • Расширения файлов: .heic,.heif,.avci,.heics,.heifs,.avcs,.avif,.avifs
    • Шаблонов: 576

Возможно, вы предпочтете использовать IWICImagingFactory::CreateDecoder with GUID_ContainerFormatHeif , потому что вас больше интересует возможность декодирования, а не конкретная реализация декодера.

Проверка конкретного CLSID тривиальна, используя либо запрос реестра, либо прямой CoCreateInstance вызов, но это не имеет особого смысла для указанной задачи.

Комментарии:

1. Похоже, сегодня не лучший день для написания ответов. Это только одно из нескольких необъяснимых отклонений, наблюдаемых сегодня.

2. @Roman Я сделал именно то, что вы сказали. На компьютере, который не может просматривать / декодировать файлы heif, я получаю указанный декодер Автор: Microsoft Название: Microsoft Расширения декодера HEIF: .heic,.heif, .avci,.heics,.heifs,.avcs,.avif,.avifs Версия: 1.0.0.0 CLSID: {E9A4A80A-44FE-4DE4-8971-7150B10A5199}

3. Также, к вашему сведению, еще один способ создания декодера — это QI IWICBitmapDecoderInfo из enumerated IWICComponentInfo и do IWICBitmapDecoderInfo::CreateInstance . В случае HEIF decoder может быть (просто предположение, я не проверял) регистрационная информация, представленная без расширения HEIF, но даже если это правда, я бы не смог создать экземпляр.

4. CreateDecoder также не возвращает ошибок для этого компьютера

5. Хорошо, я обновился. HEIF — это формат контейнера со структурой, подобной MOV / MP4 («однокадровое видео»). В нем может быть несколько кодировок, поэтому кодек HEIF WIC не означает, что вы можете открыть HEIC-версию, поэтому вам также нужен декодер HEVC. Таким образом, вам действительно нужно иметь как HEIF, так и HEVC, чтобы открыть HEIC. Microsoft не делает очевидным, как эти фрагменты связаны друг с другом, но в целом ваш подход правильный (я думаю, вас MFT_ENUM_FLAG_SYNCMFT нужно удалить из вашего фрагмента кода, хотя — декодеры с поддержкой GPU являются асинхронными).

Ответ №2:

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

Для декодирования изображений HEIF на компьютере должно быть установлено расширение HEVC video extension. Таким образом, правильная проверка заключается в том, чтобы увидеть, есть ли какой-либо тип декодирования, соответствующий вводу HEVC

 MFStartup(MF_VERSION);
IMFActivate** activate {};
unsigned int count {};
// Set the HEVC GUID
MFT_REGISTER_TYPE_INFO input;
input.guidMajorType = MFMediaType_Video;
input.guidSubtype = MFVideoFormat_HEVC;
// Get all available output types for HEVC input
MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SYNCMFT, amp;input, nullptr, amp;activate, amp;count);
// Release interface pointers
for (size_t i = 0; i < count; i  ) {
    activate[i]->Release();
}
CoTaskMemFree(activate);
MFShutdown();
return (count > 0);
  

Комментарии:

1. Похоже, что идентификатор guid HEIF присутствует в Windows по умолчанию, но ничего не делает без HEVC