Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Вылет кодеков


Автор: Temnozor 9.6.2006, 08:42
Программа работает с кодеками через Video For Windows.
Некоторые кодеки не способны обработать картинки определенного формата и вместо того чтобы просто вернуть ошибку, вылетают, увлекая за собой всю программу.
Как можно блокировать падение всей программы при падении кодека? 

Автор: AntonChik 9.6.2006, 10:00
не понял.
так ты с видео или с картинками работаешь? если упомянул кодеки, то попробую предположить, что все-таки с видео. тогда причем тут "картинки определенного формата"? ты хотел сказать "ролики"?
как/чем ты открываешь/проигрываешь их? отлавливать ошибки пробовал?
... заранее, как выход, можно попробовать проверять ролики на "правильность" формата (хотя бы по заголовку) 

Автор: p0s0l 9.6.2006, 10:15
А что возвращают ICDecompressQuery, когда передаешь им формат входных данных ?...
И при выделении памяти на выходной буфер ты как определяешь его размер ? 

Автор: Temnozor 9.6.2006, 11:56
Все ясно. Придется уточнять.

Кодирую я, естественно, видео. С ним все в порядке (функции AVIFile... и AVIStream...).

Но задумал я сделать preview. То есть, у меня есть последовательность картинок (DIB), из которых я буду делать AVI. Все, естественно, одного размера и формата. И я хочу сжать кодеком любую из этих картинок (по выбору пользователя) и нарисовать ее сжатую (искаженную кодеком) в окне, чтобы пользователь смог оценить подходит ли ему этот кодек и установленные у кодека параметры.
Пробовал два способа.
1-й, который сам напрашивается.
Вызвать для картинки ICImageCompress, потом ICImageDecompress и нарисовать полученный из второй функции DIB.
2-й способ.
Та же цель через функции ICCompressBegin, ICCompress, ICCompressEnd, ICDecompressBegin, ICDecompress, ICDecompressEnd

Оба способа работают, но... не всегда.
При обоих способах нет-нет, да какой-нибудь кодек валит все удовольствие. Естественно, ведь хочется перебрать все кодеки в списке и посмотреть как каждый сжимает/искажает картинку. И тут бац - программа упала (чаще при деомпрессии). Хорошо еще, что часто просто функции возвращают ошибку и можно написать, что мол кодек нельзя использовать по такой-то причине, но это срабатывает далеко не всегда. 
Часто бывает, что на одном компе кодек работает отлично, а на другом программа падает. Ладно свою программу я еще смогу отладить. Но мне не хочется, чтобы она вываливалась при выборе пользователем глючного кодека. Бог весть знает, что за кодеки у него установлены. Пользователю трудно доказать, что это не моя программа глючная, а кодек он не тот выбрал. Второй раз он может программу и не запустить, а сделать Uninstall.
В общем, основываясь на вышесказанном, хочу изучить возможность отлова, к примеру, того, что какой-то поток упал, и не дать ему свалить все программу. Возможно, стоило создать эту тему в разделе "Системное программирование".
P.S. Сейчас идея пришла: кодировать, вызывая другой процесс.  smile  

Автор: p0s0l 9.6.2006, 12:26
Ну, во-первых, нужно выяснить какой именно кодек валит (хотя бы в твоем случае).
И к сведению: не все кодеки умеют работать в обоих направлениях (сжимать и расжимать)...
То что ты хочешь сделать - можно реализовать через отлов исключений, тогда эти падения будут незаметны, но возможны утечки памяти и пр.
Также советую попробовать функцию ICCompressorChoose, передав ей AVI-поток и указав флаг ICMF_CHOOSE_PREVIEW (в таком случае появится окошечко предпросмотра сжатия авишного потока). Поперебирай все установленные кодеки и посмотри, будет ли прога вываливаться с исключением. Если не будет - значит дело в твоей программе, если будет - значит скорее всего на самом деле кодек глючит. smile 
И еще: некоторые кодеки не любят наличия отладчика, и могут валить программу, некоторые делают это молча, другие пишут об обнаружении отладчика и завершают процесс... Поэтому попробуй запустить вне среды разработки (если не пробовал smile ).
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)