Всем привет, встала задача: работать «на лету» с потоком данных, являющихся стримом mp4 video.
Приложение (внешнее, исходники недоступны) динамически подгружает мою библиотеку, из библиотеки торчит наружу функция:
void doSmthUseful(unsigned char *buf, size_t size, off_t len);
Где: buf - данные, size - размер данных, len - смещение от начала файла. Это всё, что мне может быть известно о входных данных.
Файл читается приложением с самого начала и отдаёт данные библиотеке кусками, например по 20 килобайт. То есть среди этих данных с самого начала будет и «хедер» файла со служебной информацией (то есть это можно внутри либы «сохранить» на будущее).
Как я понял, немного покурив исходники ffmpeg, после служебного заголовка с метаданными, данные в потоке идут «кадрами», в начале каждого из которых по идее должна идти структура с информацией о длине кадра, времени и тд. В с этой структурой мне и надо doSmthUseful.
Я видел
typedef struct MOVFragmentInfo {
int64_t offset;
int64_t time;
int64_t duration;
int64_t tfrf_offset;
} MOVFragmentInfo;
в libavformat/movenc.h.
Но, как я понял по коду, эта структура используется только при кодировании видео, но не при декодировании.
Вопрос: как происходит декодирование mp4, есть ли аналогичная структура, каков формат этой структуры, как её распознать в потоке «сырых» байт? Если кто с этим работал, ткните, пожалуйста, носом в исходники ffmpeg, где оно описано и используется.
Дело в том, что я с видео никогда не работал, а сделать надо достаточно срочно.