Определить разрешенный тип ввода IMFSampleGrabberSinkCallback

у меня есть IMFSampleGrabberSinkCallback в моем приложении Media Foundation, которое я создаю активатор для использования MFCreateSampleGrabberSinkActivate, Функция получает только частично заполненный тип носителя. В примере обратного вызова граббера работает кодер NVENC (я знаю, что есть встроенные преобразования для NVENC, но программное обеспечение не работает в Windows 10). Для того, чтобы использовать кодировщик, мне нужно иметь полный тип мультимедиа, который соответствует разрешению топологии (в основном размер кадров, который не известен при создании захвата образца).

Кажется, нет очевидного способа получить эту информацию в IMFSampleGrabberSinkCallbackтак что идея будет получить полную топологию из сеанса, как только я получу MF_TOPOSTATUS_READY,

Первый вопрос: Это единственный способ получить полный тип, который получит граббер, или я что-то пропустил?

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

Второй вопрос: Каков будет лучший способ сделать это? Для меня, кажется, нет никакого способа получить мой IMFSampleGabberSinkCallback из узла топологии.

Я бы решил это, используя идентификатор узла topo, но я не уверен, будет ли это работать в любом случае. Документация IMFTopologyNode::GetTopoNodeID говорится, что

Когда узел создается впервые, ему присваивается идентификатор. Идентификаторы узла уникальны в топологии, но могут быть повторно использованы в нескольких топологиях. Загрузчик топологии использует идентификатор для поиска узлов в предыдущей топологии, чтобы он мог повторно использовать объекты из предыдущей топологии.

Для меня не ясно, является ли удостоверение личности будут использовать повторно или Можно быть повторно использованы.

Третий вопрос: Гарантируется ли, что, если я получу идентификатор узла topo узла, я вставлю свой IMFActivate получен из MFCreateSampleGrabberSinkActivate (и до тех пор, пока я не изменяю идентификатор вручную, используя IMFTopologyNode::SetTopoNodeID, тот же самый идентификатор будет использоваться для любой последующей топологии, созданной в процессе разрешения топологии?

Заранее спасибо,
Christoph

редактировать: Вопрос не в том, как заставить работать NVENC и разрешить его тип ввода, а в том, что ключевые вопросы (1) идентификаторы топо гарантированно сохраняются во время процесса разрешения и (2) существует ли лучший способ сделать это, чем следующий (который восприимчив к пользователям, активно меняющим идентификатор топо): во-первых, я создаю активатор для моего обратного вызова граббера. После того как я добавил узел, содержащий активатор в качестве объекта, в топологию, я извлекаю его идентификатор. Когда сеанс сообщает, что топология готова, я извлекаю узел с ранее сохраненным идентификатором, получаю его объект, запрашиваю его IMFStreamSink интерфейс, получить его IMFMediaTypeHandlerполучить текущий тип мультимедиа и получить фактический размер кадра и частоту кадров для NVENC. Но: Это работает только в том случае, если идентификатор не может быть изменен и активно не изменяется.

Я извлек этапы разрешения топологии из своего тестового кода:

Этапы разрешения топологии

Средство распознавания топологии обнаруживает, что требуется преобразование цвета, и добавляет синее преобразование, чтобы учесть это. Возвращаясь к вопросам: в этом случае они будут: (1) гарантировано ли, что идентификатор красного узла не может измениться во время разрешения, и (2) существует ли альтернативный способ реализовать это, который не восприимчив к кому-либо с помощью IMFTopologyNode::SetTopoNodeID на красном узле.

0

Решение

По моему опыту идентификатор узла топологии выглядит как результат хэш-функции. Я думаю, что генератор идентификаторов имеет сложный алгоритм и не может гарантировать постоянную от одного сеанса к другому, но идентификатор стабилен во время текущего сеанса. Может быть, вы можете попробовать другой способ — ваш написал — «добавили узел, содержащий активатор как объект в топологию», но что вы делаете с оригинальным указателем на «активатор для моего обратного вызова граббера»? IMFTopologyNode::SetObject увеличивает ссылку на IUnknown. Я думаю, что вы отпускаете оригинальный указатель активировать, но вы
может держать указатель на «активатор для моего обратного вызова». В этом случае нет необходимости: «Я получаю узел с ранее сохраненным идентификатором, получаю его объект». После разрешения топологии вы УЖЕ можете иметь указатель на активатор с полностью разрешенным MediaType и запрашивать его IMFStreamSink интерфейс, получить его IMFMediaTypeHandler без сохранения идентификатора узла топологии.
Активатор прокси, но для IMFMediaSink объект, который получается путем вызова IMFActivate::ActivateObject с IID_IMFMediaSink, Хотя он вызывается впервые при разрешении топологии, он создает объект с IMFMediaSink интерфейс (который создает IMFStreamSink с IMFSampleGabberSinkCallback само по себе) в активаторе, но при следующем вызове будет возвращена ссылка — ссылка активатора KEEPS разрешена IMFMediaSink — в соответствии с MSDN MFActivate :: ActivateObject — «После первого вызова ActivateObject последующие вызовы возвращают указатель на тот же экземпляр, пока клиент не вызовет либо ShutdownObject, либо IMFActivate::DetachObjectMsgstr «Это означает, что после разрешения топологии код Microsoft НЕ ОТКЛЮЧАЕТ объект и не закрывает его — только закрытие сеанса выполняет ShutdownObject или IMFActivate::DetachObject,

С уважением

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]