потери сэмплов при захвате с DirectShow
От: elija_m  
Дата: 10.09.04 13:36
Оценка:
Есть callback устновленный через ISampleGrabber::SetCallback(), через который DirectShow поставляет мне сэмплы. Все приходящие сэмплы имеют временные метки начала и конца сэмпла. В начале callback-а я сам с помощью timeGetTime() определяю временную метку сэмпла (как бы дублирую значение возвращаемое callback-ом).
Если загрузка проца невелика, то метки, поставляемые callback-ом и мои метки по timeGetTime() сопадают.
Но если загрузка проца близка к максимальной, то начинают выпадать сэмплы на захвате и тогда возникают два варианта...
Первый(хороший): callback поставляет мне временные метки с учётом пропавших сэмплов. Например, 1,2,3,6,7... и таким образом я могу понять, что у меня выпали сэмплы 4 и 5. Такую ситуацию я могу обработать, например, либо дублируя кадры для видео, либо вставляя тишину для звука. И меня это устраивает, но...
Второй(плохой): временные метки callback-а не отражают потерю сэмплов. То есть временные метки продолжают идти без разрывов, хотя сэмплы были потеряны. Создаётся ситуация, когда, например, за 60 секунд (по timeGetTime()) я захватил данных всего на 50 секунд (по временным меткам callback-а).
ВОПРОС: Как мне отследить потерю сэмплов во втором случае при постоянной загрузке проца? Прошу обратить внимание, что вариант "использовать метки по timeGetTime()" предлагать не нужно. Поскольку этот вариант может быть использован только при малой загрузке проца, а при сильной загрузке приход callback-а весьма нерегулярен, а соответственно и временные метки по timeGetTime() будут плохими.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.