Теория.
Вот типичное распределение кадров в потоке
Каждый кадр стоит на своем месте. Вроде все нормально. Но давайте вспомним, чем отличаются типы кадров.
I - самодостаточный кадр, в нем храниться вся картинка целиком. Любое видео должно начинаться с I-кадра
P - кадр, в котором хранятся различия в сравнении с предыдущим I- или P-кадром. Чтобы получить картинку из такого кадра нужно знать предыдущий I- или P-кадр.
B - кадр, который ссылается на предыдущий и последующий I- или P-кадры.
На B-кадрах остановимся по-подробнее. Чтобы получить картинку из В-кадра 1 нужно с начала декодировать кадры 0 и 3. Загвоздка здесь в том, что при последовательной обработке кадров мы не сможем сразу декодировать В-кадр 1, т.к. мы еще не получили P-кадр 3.
Эта проблема решается через запросы от декодера (где-то вычитал). Но VirtualDub использует старый VFW-интерфейс, где декодер молчун, что имеет, то и пытается показать. Т.е. если мы перейдем на произвольный B-кадр, то мы увидим не его, а предыдущий I- или P-кадр.
Хотя надо отметить, что если просто перекодировать видео, то проблем не наблюдается. Возможно это из-за того, что в кодек режиме энкодера может придерживать кадры в буфере.
Что делать? Все просто
Нужно, чтобы P-кадр 3 шел раньше В-кадров 1 и 2. А чтобы не запутаться упакуем кадры 3 и 1 вместе, а на место кадра 3 ставим пустышку. Это и называется Packed Bitstream.
Принцип работы декодера:
0) декодируем кадр 0 и отображаем его;
1) видим, что в кадр 1 упакованы два кадра: P и B. Декодируем P-кадр и запоминаем его. Декодируем B-кадр и отображаем его;
2) декодируем кадр 2 и отображаем его;
3) видим пустышку - отображаем запомненный ранее P-кадр.
Практика
Для начала хотелось бы заметить, что при кодировании DivX-ом со стандартным профилем Home Theater, получается поток с одним последовательным B-кадром и используется Packed Bitstream.
Я не помню были ли в DivX 4.0 профили изначально, но кодеры прочухали, что если использовать два последовательных B-кадра, то при сравнимом качестве можно было получить меньший размер потока. И когда появились профили (в DivX 5 они уже точно были), то многие их просто отключали и настраивали энкодер как душе угодно. В Xvid-е, кстати, по умолчанию стояло 2 B-кадра.
Потом появились DVD-плееры с поддержкой DivX. На тот момент было еще полно контента, закодированного хакерским DivX 3.11, с ним проблем не было. Но вот с Xvid картинка на телевизоре почему-то дергалась, с DivX 5 тоже бывало дергалась, но не так часто. Методом перебора настроек выяснилось, что причина в опции Packed Bitstream. Замечу, что проблема возникает, если Packed Bitstream включен и количество последовательных B-кадров равно 2 или более. Что делать? Не перекодировать же все скачанные фильмы, ведь можно наверное как-нибудь "исправить" файл. Такое стало возможным благодаря Mpeg4Modifer. И что интересно в умах закрепилось: Packed Bitstream - всегда зло. Хотя это не совсем так.
Вкратце ситуация такая:
Кол-во посл. B-кадров Packed Bitstream VirtualDub DVD-плееры