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