sigmaplayer/doc/avi-idx.txt

93 lines
3.0 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Индексы в АВИ.
ВНИМАНИЕ!!!!!!!!!!!! ИНДЕКС - БЕЗ ДЫРОК!!!!!!!!!
Варианты:
1) у файла нет индексов
2) есть только расширенный индекс (indx)
3) есть обычный индекс:
а)
- оффсеты относительные (с начала movi)
- оффсеты абсолютные (с начала файла)
б)
- кейфреймам можно доверять
- кейфреймам нельзя доверять
Из этого всего нам нужно строить наш внутренний индекс.
---------------------------------
индекс нужен:
1) для перемотки вперед
2) для перемотки назад
3) для поиска
ВСЕ ключевые кадры, на которых мы были (при проигрывании), попадают в индекс!
------------------------------
А МОЖЕТ, НАМ НУЖЕН ЕДИНЫЙ СВЯЗАННЫЙ СПИСОК КЛЮЧЕВЫХ КАДРОВ??!
- плюсы:
- легко вставлять кадры произвольно, не надо аллокейтить лишнее место
- можно использовать единую кучу-хранилище кадров, и делать ссылки на неё в связанном списке
- список только растёт, не надо ничего удалять.
- минусы:
- нужна доп. инфа о том, является ли след./пред. кадр действительно следующим, или между ними
могут быть ещё кадры
- для поиска нужно обойти в цикле весь список
= ДА!
----------------------------------
ИНДЕКС = связанный список КЛЮЧЕВЫХ КАДРОВ
КЛЮЧЕВОЙ КАДР:
- абс. номер кадра, int
* по номеру определяем время кадра (pts)
* находим данные в индексах AVI
- смещение к этому кадру относительно начала файла, int64
- индексы к next,prev, int
* старший бит = 1 --> между ними больше нет кадров
---------------------------
ЗАДАЧИ:
1) добавлять в индекс текущий (проигрываемый) ключевой кадр
2) искать и добавлять следующий(-ие)/предыдущий(-ие) КК
3) искать и добавлять КК по временной метке
ЗАДАЧА 1.
- храним указатель на последний проигрываемый кадр
- ищем след. кадр в индексе, больший по номеру, чем текущий.
- если текущего в индексе нет, вставляем его перед следущим.
- присваиваем: последний = текущий.
ЗАДАЧА 2.
1) Если AVI-индекса нет, то:
- предыдущий кадр искать не надо - он уже должен быть в списке
(мы не могли прыгнуть, не заполнив весь индекс от начала до текущего момента)
- для след.кадра - идём по файлу вперёд, кадр за кадром, ищем ключевой
- добавляем его в индекс, если его ещё нет (см. флаг в next/prev).
2) Если есть AVI-индекс, то:
- прыгаем к данным индекса по номеру текущего кадра
- читаем блок данных для последующих/предыдущих индексов
- находим в блоке все ключевые кадры
- добавляем их в наш индекс, если их там ещё нет (см. флаги в next/prev).
ЗАДАЧА 3.
- вначале пробегаем индекс и ищем 2 КК, между которыми должна находится временная метка.
если между ними больше нет кадров, возвращаем 1-й.
- иначе:
1) Если AVI-индекса нет, то:
- в индексе ищем ближайший к временной метке КК (перед).
- сканируем, начиная с него, вперёд все кадры, и ищем КК _после_ временной метки.
- добавляем всех их в индекс
- возвращаем предпоследний КК.
2) Если есть AVI-индекс, то:
- в индексе ищем ближайший к временной метке КК (перед).
- прыгаем к данным индекса по этому номеру КК
- загружаем весь индекс, начиная с него блоками
- парсим блоки и добавляем все КК, пока не встретим номер кадра, больший чем временная метка