93 lines
3.0 KiB
Plaintext
93 lines
3.0 KiB
Plaintext
Индексы в АВИ.
|
||
|
||
ВНИМАНИЕ!!!!!!!!!!!! ИНДЕКС - БЕЗ ДЫРОК!!!!!!!!!
|
||
|
||
Варианты:
|
||
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-индекс, то:
|
||
- в индексе ищем ближайший к временной метке КК (перед).
|
||
- прыгаем к данным индекса по этому номеру КК
|
||
- загружаем весь индекс, начиная с него блоками
|
||
- парсим блоки и добавляем все КК, пока не встретим номер кадра, больший чем временная метка
|
||
|
||
|
||
|
||
|
||
|
||
|