Как создать ПОЛНУЮ копию декодера?

Я пишу видеодекодер (используя FFMPEG/AVCodec) для пользовательской реализации видеопотока mpeg4. Особенность этого видеопотока в том, что он может разделяться на множество «дочерних» потоков, создавая множество P-кадров на основе одного и того же родителя. Видеопоток, который я пытаюсь декодировать, на самом деле является своего рода «видеодеревом». Что-то вроде этого:

I <--P <--P <---------------------P <-------------- P <------------ P
           \ <--P <--P <--P        \ <--P <--P       \ <--P <--P 

Я уже написал базовый декодер, который отлично работает, когда я решаю следовать одному пути, проблема возникает, когда я пытаюсь следовать более чем одному пути в дереве видео. На данный момент мне нужно «разветвить» мой декодер, чтобы следить за двумя разными видеопотоками. разделение может произойти не только после ключевого кадра, но даже после кадра P, поэтому мне нужно дублировать AVCodecContext (я использую avcodec_copy_context), но, похоже, он создает новый декодер из чистого состояния.. кажется, игнорирует предыдущее видео состояния, поэтому декодированные P-кадры «применяются» к пустому видеокадру. Вероятно, копирование контекста с помощью avcodec_copy_context недостаточно... Любое предложение? Как мне продублировать контекст и полный статус декодера? Или есть ли другой способ декодировать мой поток, используя ссылки? Спасибо!


person damicolo    schedule 02.08.2011    source источник
comment
Вам когда-нибудь удавалось найти, как сделать глубокую копию AVCodecContext?   -  person zahirdhada    schedule 24.04.2015


Ответы (1)


Согласно документации: "Результирующий контекст кодека назначения не будет открыт, т.е. необходимо вызвать avcodec_open(), прежде чем вы сможете использовать этот AVCodecContext для декодирования/кодирования видео/аудиоданных».

Итак, чтобы добраться до точки, где вы находитесь в другом декодере, я думаю, вам придется открыть поток и перейти к той же позиции (av_seek_frame).

В качестве альтернативы вы можете с самого начала поддерживать несколько декодеров параллельно на случай, если вам понадобится разветвление позже. Это может быть вариантом, если вам нужно только несколько параллельных путей.

Или вы используете только один декодер и ищете в этом случае, например, например. со структурой меню DVD, если вам нужно отображать только один путь в любое время.

person azt    schedule 28.04.2015
comment
Я декодирую необработанный прямой эфир, поэтому у меня нет AVFormatContext, поэтому av_seek_frame() не сработает. Я тоже думал о параллельном подключении нескольких декодеров, но это было бы неэффективно. У тебя есть другие идеи? Спасибо.. - person zahirdhada; 28.04.2015
comment
Вы имеете в виду этот вариант использования? Я бы либо сохранил весь поток и работал для каждого пути с самого начала. Или я попытался бы перекодировать поток в более дружественный, доступный для поиска формат, когда я его получил, - person azt; 28.04.2015