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