Ситуация. В своей программе создаю граф, в котором читаются некомпрессированные видео и звук, сжимаются какими-то кодеками (неважно какими, много разных пробовал), отправляются в AVI Mux и затем в стандартный File Writer или Dump из примеров DXSDK.
С FileWriter все всегда нормально работает, записывается файл в котором действительно есть и видео и звук. С Dump'ом выполнение графа прерывается где-то на середине, при этом моя программа ловит от графа ошибку VFW_E_START_TIME_AFTER_END (The sample start time is after the sample end time). Что это может быть?
Что я пробовал:
— найти, какой фильтр генерирует ошибку — блин, безуспешно (как?)
— отследить, какие интерфейсы запрашиваются у Dump и реализовать их все так, как сделано в FileWriter — не помогло.
— graph->SetSyncSource(NULL)
По большому счету это все, остальное можно отнести к шаманству и пинанию колес.
Здравствуйте, sh093, Вы писали:
S>Ситуация. В своей программе создаю граф, в котором читаются некомпрессированные видео и звук, сжимаются какими-то кодеками (неважно какими, много разных пробовал), отправляются в AVI Mux и затем в стандартный File Writer или Dump из примеров DXSDK.
S>video: [File Source]->[Splitter]->[Decoder]->[Codec]->[AVI Mux]->[Dump] S>audio: [File Source]->[Parser]->[Codec]-------------->
S>С FileWriter все всегда нормально работает, записывается файл в котором действительно есть и видео и звук. С Dump'ом выполнение графа прерывается где-то на середине, при этом моя программа ловит от графа ошибку VFW_E_START_TIME_AFTER_END (The sample start time is after the sample end time). Что это может быть?
S>Что я пробовал: S>- найти, какой фильтр генерирует ошибку — блин, безуспешно (как?) S>- отследить, какие интерфейсы запрашиваются у Dump и реализовать их все так, как сделано в FileWriter — не помогло. S>- graph->SetSyncSource(NULL) S>По большому счету это все, остальное можно отнести к шаманству и пинанию колес.
S>Помогите плз, скоро седеть начну!
Смотрим DX help и видим:
File Writer Filter:
...
The time stamps on samples delivered to the file writer are byte offsets in the file. The input pin exposes the IStream interface and supports a subset of the interface. This enables the upstream filter to write data when the graph is stopped.
Dump Filter Sample:
...
This filter is a useful debugging tool. For example, you can verify, bit by bit, the results of a transform filter
Dump — просто сэмпл — он не обязан поддерживать все вожможные ситуации и форматы.
Т.к. вы занимаетесь DShow стоит просто запомнить, что avi-шки писать лучше всего именно File Writer-ом, т.к. индексы к avi файлу пишет муксер и Dump просто не позволит ему это сделать. (см. выше)
Здравствуйте, Sergey A. Sablin, Вы писали:
SA>Dump — просто сэмпл — он не обязан поддерживать все вожможные ситуации и форматы. SA>Т.к. вы занимаетесь DShow стоит просто запомнить, что avi-шки писать лучше всего именно File Writer- SA>ом, т.к. индексы к avi файлу пишет муксер и Dump просто не позволит ему это сделать. (см. выше)
А какие ситуации и форматы? Задача dump — записать ПОТОК в файл. Не какой-то там формат, а просто байтовый поток. Формат как раз формирует AVI Mux. Заголовки записывает опять же AVI Mux при помощи интерфейса IStream у фильтра FileWriter.
Я говорю о другом. Выполнение графа, в котором FileWriter заменен на Dump прерывается на середине, на этапе записи самого потока, задолго до того, как AVI Mux записывает заголовки. Это очень легко проверить, достаточно добавить в Dump интерфейс IStream. Причем выполнение прерывается по идиотской причине: какой-то фильтр проверяет времена сэмпла и выкидывает ошибку.
По всей видимости ошибка возникает не в Dump (могу это утверждать с вероятностью 99.9%), а в AVI Mux и пока я не нахожу этому разумных объяснений. Как может file writer влиять на сэмплы, которые до него еще не дошли? Разве что как-то хитро настраивает AVI Mux под себя (недокументированные интерфейсы?).
Поэтому вопросы остаются прежние:
1. Как вычислить, в каком фильтре возникает ошибка? Выкидывать фильтры по очереди не получается, т.к. мы отлаживаем последний фильтр графа.
2. В каком направлении копать? Почему вообще у сэмпла может время начала вдруг стать больше время конца и исключительно если в графе FileWriter заменить на Dump?
Здравствуйте, __sh, Вы писали:
S>Здравствуйте, Sergey A. Sablin, Вы писали:
SA>>Dump — просто сэмпл — он не обязан поддерживать все вожможные ситуации и форматы. SA>>Т.к. вы занимаетесь DShow стоит просто запомнить, что avi-шки писать лучше всего именно File Writer- SA>>ом, т.к. индексы к avi файлу пишет муксер и Dump просто не позволит ему это сделать. (см. выше)
S>А какие ситуации и форматы? Задача dump — записать ПОТОК в файл. Не какой-то там формат, а просто байтовый поток. Формат как раз формирует AVI Mux. Заголовки записывает опять же AVI Mux при помощи интерфейса IStream у фильтра FileWriter.
S>Я говорю о другом. Выполнение графа, в котором FileWriter заменен на Dump прерывается на середине, на этапе записи самого потока, задолго до того, как AVI Mux записывает заголовки. Это очень легко проверить, достаточно добавить в Dump интерфейс IStream. Причем выполнение прерывается по идиотской причине: какой-то фильтр проверяет времена сэмпла и выкидывает ошибку.
S>По всей видимости ошибка возникает не в Dump (могу это утверждать с вероятностью 99.9%), а в AVI Mux и пока я не нахожу этому разумных объяснений. Как может file writer влиять на сэмплы, которые до него еще не дошли? Разве что как-то хитро настраивает AVI Mux под себя (недокументированные интерфейсы?).
S>Поэтому вопросы остаются прежние:
S>1. Как вычислить, в каком фильтре возникает ошибка? Выкидывать фильтры по очереди не получается, т.к. мы отлаживаем последний фильтр графа.
S>2. В каком направлении копать? Почему вообще у сэмпла может время начала вдруг стать больше время конца и исключительно если в графе FileWriter заменить на Dump?
Кстати давно не пробовал в дамп писАть — загнал через свой беспотерьный енкодер, и что вы думаете? Все записалось без всяких ошибок. Правда не поднимаеться — голов-то нету.
Теперь стало еще интереснее — кто же валит граф? получается енкодер?
после обеда еще потестю и запостю...
Кстати, я обнаружил, в чем была причина вылетания графа.
Все дело в том, что при использовании FileWriter энкодеры передают AVI Mux'еру сэмплы бОльшего размера. Я не стал разбираться почему, это не так важно.
При замене FileWriter'a на Dump сэмплы уменьшаются и всплывает глюк в одном из энкодеров, который заключается в том, что энкодер выдает два подряд сэмпла, у которых time stamps:
(a1,b1), (a2,b2) и a1 < a2 < b2 < b1.
Я думаю, глюк бы со временем проявился и с FileWriter'ом, на других примерах.
Здравствуйте, __sh, Вы писали:
S>Кстати, я обнаружил, в чем была причина вылетания графа. S>Все дело в том, что при использовании FileWriter энкодеры передают AVI Mux'еру сэмплы бОльшего размера. Я не стал разбираться почему, это не так важно.
Мой получается честный
S>При замене FileWriter'a на Dump сэмплы уменьшаются и всплывает глюк в одном из энкодеров, который заключается в том, что энкодер выдает два подряд сэмпла, у которых time stamps: S>(a1,b1), (a2,b2) и a1 < a2 < b2 < b1.
S>Я думаю, глюк бы со временем проявился и с FileWriter'ом, на других примерах.
Пользую давольно давно — ничего подобного с FileWriter'ом еще не происходило... Время покажет.
S>Сергей.
Аналогично