Здравствуйте Господа.
Пишу DirectShow Transform filter. Его задача разжимать входной поток данных. Проблема заключается в том, что на момент подключения выходного пина я не могу указать размер получаемого кадра и его формат цветности. Вообще, конечно, я могу жестко задать на выходе только RGB24, но как быть с разрешением, ведь я его узнаю только после того как разжал первый поступивший кадр.
В MSDN я нарыл описание Dynamic Format Changes и судя по всему меня бы устроил QueryAccept (Upstream), но, если кто может объяснить как это выглядит в реализации или примерчик, я был бы Вам безмерно благодарен.
Здравствуйте, ovden, Вы писали:
O>Здравствуйте Господа. O>Пишу DirectShow Transform filter. Его задача разжимать входной поток данных. Проблема заключается в том, что на момент подключения выходного пина я не могу указать размер получаемого кадра и его формат цветности. Вообще, конечно, я могу жестко задать на выходе только RGB24, но как быть с разрешением, ведь я его узнаю только после того как разжал первый поступивший кадр. O>В MSDN я нарыл описание Dynamic Format Changes и судя по всему меня бы устроил QueryAccept (Upstream), но, если кто может объяснить как это выглядит в реализации или примерчик, я был бы Вам безмерно благодарен.
А тебе и не нужно, инициализируйся в момент присоединения выходного, когда входной уже присоединен.
Тогда и можно его обо все спросить.
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, ovden, Вы писали:
O>>Здравствуйте Господа. O>>Пишу DirectShow Transform filter. Его задача разжимать входной поток данных. Проблема заключается в том, что на момент подключения выходного пина я не могу указать размер получаемого кадра и его формат цветности. Вообще, конечно, я могу жестко задать на выходе только RGB24, но как быть с разрешением, ведь я его узнаю только после того как разжал первый поступивший кадр. O>>В MSDN я нарыл описание Dynamic Format Changes и судя по всему меня бы устроил QueryAccept (Upstream), но, если кто может объяснить как это выглядит в реализации или примерчик, я был бы Вам безмерно благодарен.
ATP>А тебе и не нужно, инициализируйся в момент присоединения выходного, когда входной уже присоединен. ATP>Тогда и можно его обо все спросить.
Но, ведь, разрешение кадра я узнаю только когда граф заработает, на момент соединения пинов у меня еще нет на входе никаких данных и соответственно мне нечего разжимать и как следствие я не знаю будущего разрешения. Сейчас пытаюсь в методе Transform явно задать все значения MediaType;
Здравствуйте, ovden, Вы писали:
O>Но, ведь, разрешение кадра я узнаю только когда граф заработает, на момент соединения пинов у меня еще нет на входе никаких данных и соответственно мне нечего разжимать и как следствие я не знаю будущего разрешения. Сейчас пытаюсь в методе Transform явно задать все значения MediaType;
а какая вообще задача стоит?
есть AVI файл на диске и его надо "проиграть" используя самодельный фильтр?
Здравствуйте, ovden, Вы писали:
O>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>Здравствуйте, ovden, Вы писали:
O>>>Здравствуйте Господа. O>>>Пишу DirectShow Transform filter. Его задача разжимать входной поток данных. Проблема заключается в том, что на момент подключения выходного пина я не могу указать размер получаемого кадра и его формат цветности. Вообще, конечно, я могу жестко задать на выходе только RGB24, но как быть с разрешением, ведь я его узнаю только после того как разжал первый поступивший кадр. O>>>В MSDN я нарыл описание Dynamic Format Changes и судя по всему меня бы устроил QueryAccept (Upstream), но, если кто может объяснить как это выглядит в реализации или примерчик, я был бы Вам безмерно благодарен.
ATP>>А тебе и не нужно, инициализируйся в момент присоединения выходного, когда входной уже присоединен. ATP>>Тогда и можно его обо все спросить.
O>Но, ведь, разрешение кадра я узнаю только когда граф заработает, на момент соединения пинов у меня еще нет на входе никаких данных и соответственно мне нечего разжимать и как следствие я не знаю будущего разрешения. Сейчас пытаюсь в методе Transform явно задать все значения MediaType;
если ты пишешь декодер для своего формата, то признаком хорошего тона считается передавать заголовки для инициализации декодера либо от сплиттера парсящего твой стрим, либо твоим личным сорцом, либо если у тебя декодер сам сорец — пускай сам и парсит стрим до начала проигрывания.
Пересоединяться с рендерилкой на ходу на другие размеры довольно муторное занятие — насколько я помню в случае с VMR имеються какие-то проблемы, а может с обчным VideoRenderer'ом. Врать не буду, но грабли там какие-то валяются.
A>а какая вообще задача стоит? A>есть AVI файл на диске и его надо "проиграть" используя самодельный фильтр?
Нет, задаче в следующем:
Есть некая плата захвата и SDK к ней. А так же есть коммерческий кодек реализованный в виде набора DLL. Моя задача реализовать работу с этим устройством и этим кодеком посредством DirectShow. Фильтр для работы с платой я написал используя CSource. Все прекрассно работает. Далее, я написал Transform фильтер который сжимает изображение используя этот коммерческий кодер. Теперь я написал еще один Transform фильтр который разжимает то что было сжато этим кодеком... Осталась только одна проблемма указанная мною ранее... Хотя, видимо, если не удасться быстро решить ее, придется пока ограничится одним форматом на выходе. Время р\поджимает...
Так же, я планирую написать свой MUX фильтр который будет готовить поток сжатых кадров для записи на диск в моем формате.
MSDN читаю постоянно, но с первого раза во всем разобраться не получается, поэтому и задаю вопрос сдесь...
Здравствуйте, ovden, Вы писали:
O>Здравствуйте Господа. O>Пишу DirectShow Transform filter. Его задача разжимать входной поток данных. Проблема заключается в том, что на момент подключения выходного пина я не могу указать размер получаемого кадра и его формат цветности.
А в тупую не подойдет —
запускаем "тестовый" граф, получаем размер и формат кадра на входе
и тут же удаляем и создаем уже "рабочий".