IMFMediaSession.Close () не работает должным образом? - PullRequest
0 голосов
/ 29 октября 2018

Согласно https://docs.microsoft.com/en-us/windows/desktop/api/mfidl/nf-mfidl-imfmediasession-close, после вызова IMFMediaSession.Close я должен получить событие MESessionClosed, которое я получаю не всегда, но в большинстве случаев.

У меня появилось несколько клиентов с растущими утечками памяти, и я думаю, что одной из причин является то, что я упомянул выше, или взаимодействие MediaFoundation с драйвером графического процессора, поскольку я проанализировал дампы, в которых я видел тысячи потоков, открытых в atiumd64.dll, метод OpenAdapter:

00 000000b0`cecff8f8 00007ff8`c1cf9252 ntdll!NtWaitForSingleObject+0x14
01 000000b0`cecff900 00007ff8`752d2ccd KERNELBASE!WaitForSingleObjectEx+0xa2
02 000000b0`cecff9a0 00007ff8`757bf247 atiumd64!OpenAdapter+0x63ced
03 000000b0`cecff9d0 00007ff8`757bf3ee 
atiumd64!XdxInitXopAdapterServices+0x3d0a57
04 000000b0`cecffa00 00007ff8`c4293034 
atiumd64!XdxInitXopAdapterServices+0x3d0bfe
05 000000b0`cecffa30 00007ff8`c4d91461 kernel32!BaseThreadInitThunk+0x14
06 000000b0`cecffa60 00000000`00000000 ntdll!RtlUserThreadStart+0x21

У меня было создано 160000 топологий, созданных за 4 дня, и около 100 не вызывали MESessionClosed вообще, и я боюсь, что именно они вызывают утечку.

В тех случаях, когда MESessionClosed не отправляется, я замечаю, что все они имеют одну общую ошибку: -1072870850, то есть MF_E_SAMPLEALLOCATOR_EMPTY.

Я хотел бы знать, имел ли кто-либо опыт работы с MediaFoundation, не поднимая MESessionClosed согласно документации.

1 Ответ

0 голосов
/ 29 октября 2018
Событие

MESessionClosed создается в результате завершения асинхронно выполненного вызова IMFMediaSession::Close. Если вы не получили сообщение, это указывает на проблему с закрытием, возможно, на проблему с одним из примитивов, участвующих в топологии, такую ​​как, например, невозможность завершить потоковую передачу из-за невыполненной или утечки ссылки на некоторый объект.

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

Если вы видели MF_E_SAMPLEALLOCATOR_EMPTY ранее, это может указывать на то, что утечка указателя на один из образцов препятствует завершению распределителя выборок внутри одного из примитивов, что, в свою очередь, создает тупик.

Кроме этого, вы можете захотеть выполнить mftrace для процесса и сравнить выходные данные, полученные в результате закрытого сеанса, с другим, который завершился неудачей.

Еще одна вещь, которая вас также интересует, в том числе вопрос, касающийся вопроса, - это понимание топологии и, особенно, наличие у нее сторонних или дополнительных сегментов, которые вы можете временно исключить. Так как вы не можете выполнять большую часть отладки внутренних компонентов MF напрямую, ваши варианты изменения топологии могут помочь вам сузить суть проблемы до конкретного примитива, который доставляет вам проблемы. Если в топологии есть свои собственные примитивы, вы заинтересованы в проверке их поведения при завершении.

...