Про ogg/theora проигрыватель дальше.

Всё таки продолжается разработка этой казалось бы простой вещи.

Уже вроде бы и сделал seek по этому недружественному формату. Ан нет, следующая проблемма –  почемуто тормозит проигрывание видео с высоким битрейтом.

Тщательный просмотр всего и вся выявил. Аудиопакеты действительно идут впереди видеопакетов, но засада в том, что пока декодируется пакет с видео, аудиопоток может уже опустошиться.

Это конечно косяк кодирующей программы (по хорошему аудио должно быть записанно с запасом хотябы на 100-200 мс перед видеопакетом), но что делать, приходится жить с этим.

Поэтому приходится читать аудио, а видеопоток складывать в боольшой буфер на пять мегабайт для того чтобы потом его декодировать. Почемуто при складывании видео в первый начале файла возникает stall на 400-500 ms.

Оказалось всё дело в этой функции:

void _os_body_expand(ogg_stream_state *os,int needed){

if(os->body_storage<=os->body_fill+needed){

os->body_storage+=(needed+1024);

os->body_data=_ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data));

}

}

То есть буфер на 5 мегабайт растёт по 1 килобайтику :)))))

  • lordmaze

    > os->body_data=_ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data));
    > То есть буфер на 5 мегабайт растёт по 1 килобайтику :)))))

    genialno ya schitau. Interesno ludi kotorie eto pisal oni tipa voobsche v zhizni hot chto to delali ?

    nu ya pro realloc :) v chastnosti i dynamic allocation v processe v chastnosti.

  • shvez

    По-моему, профессионализм разработки это вообще большая проблема open source. Мы как-то давно столкнулись с тем, что декодер работал вроде бы хорошо, но при сиках начинал терять память и выделял какие-то страшные размеры, которых у нас не было.

  • lordmaze

    open source вообще – это злое зло. Те не open source concept in general, а концепция – “зачем платить за middleware – есть же open source”.

  • http://belightsoft.com/liveinterior/ EugeneGff

    Я тупой или автор облажался? Перевожу с С++:

    если в буфере осталось свободного места меньше чем дополнительно нужно
    увеличим его на (дополнительно нужно + 1024)

    Если мы имеем маленький буфер, а нам нужно 5Мб потому что хоть наши данные в среднем и по килобайту пучок, но мы хотим очередь – так нужно вызвать эту функцию предварительно, передав 5Мб как needed, или сформировать собственный накопительный буфер перед этим, если функция очень внутренняя.

    Единственная проблема с кодом – утечка памяти если _ogg_realloc имеет семантику обычного realloc. Но даже это может не быть проблемой – алгоритм подобного типа может иметь отдельную кучу с предварительно рассчитанным максимальным размером, и превышение этого размера означает ошибку программиста или сознательно сформированный неверный поток на входе (DoS атака) – в обоих случаях шатдаун библиотеки для этого потока декодирования и освобождение всей сразу всей кучи может быть подходящей реакцией. Этот вариант не высосан из пальца – видео энкодер h264 должен определиться с профилем кодирования, взять из таблицы количество памяти имеющееся у декодеров соответствующих этому профилю, и кодировать поток так, чтобы декодеру этого количества хватило. А декодер получив поток с профилем который он поддерживает – имеет право прекратить его декодировать если требования по памяти превысили табличное значение – поток считается может и не злонамеренным, но уж точно битым.

  • http://www.sdl.ru TSS

    Хех, классика выделения памяти под динамические буферы.
    Я для себя (правда под Win32) давно выработал простую стратегию — до метра растем степенями двойки, потом до 16 метров мегабайтами, потом уже 16-ти меговыми блоками =)
    неоптимально, зато быстро, если грамотно использовать идею reusable memory buffers.
    ps. про потребление оперативы — знаю =)

  • Balmer

    Для EugeneGff специально: needed – это очень маленькое число. Там обычно передаются цифры 100-1000 байт, засада в том, что page в целом большая. needed пользователь сам не может передать – это вообще функция глубоко запрятанная в недрах ogg. Например в коде любимого мной mplayer библиотека ogg переписанна с нуля. Пробовал большими кусками пихать, он всё равно бъёт их на маленькие кусочки и уже процессит внутри.